|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
3 u! w3 P9 h- `, tinput mcasp_ahclkx,. J$ m5 }' y& j: s3 D0 Z+ ]
input mcasp_aclkx,
2 F! S9 Z* p1 T8 d C( k1 Dinput axr0,
+ p& W/ g: d5 m4 ^* x4 Z5 n( x8 k( D, n' {* E. @
output mcasp_afsr,, E: x8 S' A! d' I
output mcasp_ahclkr,
x# e9 M8 ~# X" y4 L, ~5 coutput mcasp_aclkr,
& g' S' F" p8 Youtput axr1,4 \% l6 H6 C8 u( w
assign mcasp_afsr = mcasp_afsx;
. f% x' w0 D" W7 T, U8 v }assign mcasp_aclkr = mcasp_aclkx;
9 O: [- P$ o3 Eassign mcasp_ahclkr = mcasp_ahclkx;
7 C) i' \# V5 Z gassign axr1 = axr0; , B. ~3 g9 P# ]- Q. u. u
% n, G8 x+ O0 U8 }1 l2 _在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
- u7 w: s3 y9 _' P5 v. Istatic void McASPI2SConfigure(void)/ Z2 N( R9 `" k8 u* i/ @$ b' E1 [, T
{8 S5 S- q0 Q) v8 v7 b; a: [; R
McASPRxReset(SOC_MCASP_0_CTRL_REGS);" e- W9 K1 j8 {/ T/ @
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
' j7 C: |% V$ t v, }8 {McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);$ `$ w; k% s% g: t w
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
% h: O7 E" F1 Q8 rMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
: n4 N2 w# A2 X' y b9 {MCASP_RX_MODE_DMA);+ ~+ q3 C8 V q x: `
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
; h) u( f8 @0 o& O8 O7 ~: hMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */" w, T& O K, B6 _3 G6 W2 e- K
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, 6 R" x7 b8 P' A1 Q8 a# z* O
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);4 p% P8 W; L l/ C1 V2 q: S
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, / p% d. L9 r5 v5 R& ^# o
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */1 R# C) v2 s" v! u: N
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);! L* u9 V z: X) b" u
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
2 [/ P1 y7 \) eMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,# Y; I% K) _+ o" |- J* W
0x00, 0xFF); /* configure the clock for transmitter */1 T$ C1 F( G8 e2 ^5 k
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
% X$ \' h' m% L! k5 o; cMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
+ o. h3 Y. C) w$ ZMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,/ j% d) }8 h0 C. I2 S. f3 i. j
0x00, 0xFF);8 Q5 w$ Y8 d3 L1 W* I+ {
6 N- j. e; e/ z" x/* Enable synchronization of RX and TX sections */ 1 V! X1 e2 _9 b( n
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
8 _* ?, b$ N0 z: w! [McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
S1 Z6 H4 | o$ |3 i: mMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
' K* {: y6 n& M! u7 B7 K# g** Set the serializers, Currently only one serializer is set as( {- @2 z! b' \) n- I- Q
** transmitter and one serializer as receiver.
8 Q* _1 A- K. ]$ G# M, [*/
" I6 S/ A; Q4 X, BMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
+ f, P) V& K9 @4 n# Q$ H5 H) z6 KMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*( E& \8 x: [$ P6 I( b4 i0 E6 b: a
** Configure the McASP pins $ G; K3 E3 l ^
** Input - Frame Sync, Clock and Serializer Rx
1 m& x/ V5 }9 Q& x8 o0 w E** Output - Serializer Tx is connected to the input of the codec
( E- r8 H& A* Y*/2 s) E7 I X1 M, V& H, ]6 w
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);/ G6 j4 |1 Q6 N8 |% l. k; ]6 B
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));5 ]) W% h) }. ^8 f2 ~% _7 M. x
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX: d, w4 Q" t# N, S1 e: |
| MCASP_PIN_ACLKX
0 M' W5 p% M3 D4 C7 k- ~| MCASP_PIN_AHCLKX& \$ A ^+ d- P1 Q$ ~* G* j+ Y0 c
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
+ h" W* x) V/ r- CMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR 6 x. U5 M# H n2 \8 p
| MCASP_TX_CLKFAIL # r' {6 q4 I; f) ?
| MCASP_TX_SYNCERROR
5 w1 N7 D) h, }) ~3 _- O; v5 t. {| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
; T, J! @' } n* D$ H| MCASP_RX_CLKFAIL" X1 G# w; T) H
| MCASP_RX_SYNCERROR
& D" L/ {* w- [% o( O( Z9 v. V9 i6 s| MCASP_RX_OVERRUN);9 Y4 l% A* |8 N- c% |. `+ m3 a( C
} static void I2SDataTxRxActivate(void)
c: V* M9 f! o) o+ K7 o& D; K{% g+ y7 h3 x. i! S6 v$ w
/* Start the clocks */
+ s# B/ O+ }5 M4 Z. OMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);% p5 l2 F3 T9 @
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
8 H( t! G' ^. h/ W0 t( c/ |EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
" a4 } `" d0 y' d1 iEDMA3_TRIG_MODE_EVENT);' z) L( z" r0 O
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, + `% F1 ?' O9 G3 j5 Y1 x
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */9 l7 H" K, r4 d( Q0 t" ]
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);4 M" a% g: J& s, i, s8 L
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
% c- K$ O5 J# ^/ o; g$ Fwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */* Y- {8 _* X$ c; W
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);, T- E/ q$ Z1 v5 @3 F
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);& F: M0 o( E, o9 z- _8 O0 \% q
}
) B7 d0 a$ y5 M4 n, B$ K+ C8 z请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
: K9 _0 Q' O) t) @4 w" s |