|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,4 W- h7 X$ m) x* p' D2 C
input mcasp_ahclkx,0 i2 n0 E/ |" |" p5 H* y- P! e; b
input mcasp_aclkx,/ i) H- t" l* V# L$ B. |; E" n
input axr0,7 o, e2 v, N8 V
! i3 b* r& |: _7 U+ Z1 i- s+ ]1 ?
output mcasp_afsr,( e# G# L! T1 q9 I9 k/ \& z* x) A
output mcasp_ahclkr,! B1 |5 N* |% A: n. f
output mcasp_aclkr,% r/ L- P+ _* S6 t6 ]5 [9 |' j3 R
output axr1,
# N2 @7 |% }; P assign mcasp_afsr = mcasp_afsx;) L, ` d1 L. x, ~4 F4 k
assign mcasp_aclkr = mcasp_aclkx;
0 n; s5 X$ {( k) }- Z1 massign mcasp_ahclkr = mcasp_ahclkx;
6 j. S5 K/ S9 g) z0 W; ~assign axr1 = axr0;
; ~7 V: S- v; [, H9 T Z+ C+ `( W
1 I7 J, c+ b. l Z3 c: w在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
2 L8 M+ F$ U O7 Fstatic void McASPI2SConfigure(void)1 b6 M7 R) A5 Y3 e9 N; t: J
{
! ^7 y4 S3 K" \McASPRxReset(SOC_MCASP_0_CTRL_REGS);
: `2 e5 F' Q' e( J: w0 j5 i! uMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
: ]7 {+ A- q! [9 K8 L: tMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);+ y' N, [8 Z- O5 E Y& K" {! A
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
* n- t D* ~: ^% }1 ~, Y: OMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,5 B% q. S( P* l" j
MCASP_RX_MODE_DMA);2 ]+ ~9 a( I; n, o1 b
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
% v& R# [9 m, X; s6 D. nMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */7 D2 h( s, M2 o* d/ y5 ^, p
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
$ K9 `% `8 Q+ kMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);, X& J; r# t1 H6 A3 k. X
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, 7 z, K: r x" w8 C- U2 S1 @4 i
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
: n0 F% T/ Z5 M- V: W8 R' XMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
# v3 ~0 c/ k) f1 K: k0 U0 CMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
5 z9 D& F0 J( `9 zMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32," B3 n5 n- [+ i9 ^
0x00, 0xFF); /* configure the clock for transmitter */
8 `$ U7 z9 y. T4 O/ x9 xMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
- g% h% ]5 t1 p% h0 g: IMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); : a0 q7 W+ A1 Y2 C
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
8 R9 w/ n0 _& ^- U1 Q0 w0x00, 0xFF);
; m9 L) R* b/ {) @4 D4 L
5 c9 E- z1 `0 Y/* Enable synchronization of RX and TX sections */
8 i6 l2 D- ~# SMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */6 o9 C: R, b& e+ z& l
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);1 U$ I( n2 N; @8 `7 u7 g! m4 z
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*6 ~6 H9 H" p$ w6 m
** Set the serializers, Currently only one serializer is set as
' R/ ~0 U: b% z" L3 N4 d** transmitter and one serializer as receiver.
9 _+ |$ w b: b0 b*/
3 C: f; _/ g3 f6 c9 Y& H. \) fMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
, Z/ p4 g) B$ u. h5 FMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*) R2 \; D1 C, `
** Configure the McASP pins
g$ f' H; R! ]' G6 q; _** Input - Frame Sync, Clock and Serializer Rx, m# d. @: v/ I1 d: A- z! f- ~
** Output - Serializer Tx is connected to the input of the codec % G+ u5 U2 O. W6 h' w
*/" J8 z* Y% ~# ~4 M1 Y
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
! {" h Y! W) ^0 d M; TMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));/ c- O% }* J- o
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX. K5 B7 m4 d7 k. U
| MCASP_PIN_ACLKX
2 ~. [' L z# [4 X4 u9 Z| MCASP_PIN_AHCLKX
" d. }# V, {0 J3 G$ D+ A| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
2 [% {) b H: y1 ?McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
9 f9 {* u) w2 O. ^5 k| MCASP_TX_CLKFAIL 1 t+ g2 {4 c8 V8 ]/ K8 [: U7 C
| MCASP_TX_SYNCERROR" p1 b- B4 ]4 I( y3 C
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
& V. G/ }* ~; B3 w; H5 N1 ?| MCASP_RX_CLKFAIL" _1 N3 g$ E; U4 N, Z/ G
| MCASP_RX_SYNCERROR
( O4 p7 F c, l; H| MCASP_RX_OVERRUN);
" B5 W9 m4 P& f: U0 c$ z} static void I2SDataTxRxActivate(void)* e* T; d: r, N. I. O- J2 ]
{; U, }9 s4 o& G. X
/* Start the clocks */7 P" e$ q1 q/ e8 }
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);3 f7 T( C. F4 L* d. x8 N# ^4 ^1 [
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
8 v+ T) h' V6 i; k9 [7 u2 REDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,: m/ u4 J; R$ E6 G6 F
EDMA3_TRIG_MODE_EVENT);
D9 Z) j& a" E. O2 bEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, : T6 v3 Y3 b* _4 o- F% Y9 V
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
- C4 M1 } p0 L) N5 w- ^! P% CMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
$ N3 B9 d% h% o7 rMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
/ T+ H* i' S# A- x8 L# awhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
4 g @- x/ M7 c' n: WMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);1 L% [, R7 Q9 S2 d7 q) ~
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);% o& l9 Z/ z( s( d# _) Q
}
7 n# Q( w5 y# S6 V! i请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
. O3 ` {* E9 E |