|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,( p; b* |0 [ A9 u2 H' k8 Z3 n, b
input mcasp_ahclkx,8 I( y! I: H% O
input mcasp_aclkx,, X# F% a8 f# f' I& Q; Q; |
input axr0,
9 H/ M+ X% X Y' l! W
" v7 a9 t- K" N4 goutput mcasp_afsr,, L: F: X5 \$ H
output mcasp_ahclkr,+ [. C6 ?8 P9 V3 f0 Q( g5 }
output mcasp_aclkr,5 ~" i0 A/ W" m4 f+ \
output axr1,
: M0 P; ?+ [. ?5 k) L assign mcasp_afsr = mcasp_afsx;
) }- b+ @' {0 v' K+ [4 D, Massign mcasp_aclkr = mcasp_aclkx;
6 X+ ^& l! g$ \8 B8 Y& Yassign mcasp_ahclkr = mcasp_ahclkx;2 Q* ?* D) T; Q: ]8 J- H
assign axr1 = axr0;
: y" H) K6 J/ T3 a& m0 \, N
' k- k! G, ?1 p1 R在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
* R6 D, I' p, n7 L# u5 Z8 kstatic void McASPI2SConfigure(void), \2 O: s1 x0 G9 X" F
{# i* ~, v+ G* M' f( f* A
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
# p8 y' A: b+ X5 n" h7 i, bMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
3 Z. w6 @! I- O% }; d, DMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);9 W8 F" g2 F; P( u
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
/ h8 Z, O. U' D7 q8 G) ~; ]McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,* e. k! Z. H& W# M5 C
MCASP_RX_MODE_DMA);% m( n* e' t) ^5 {5 [. L
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
2 S5 z4 t! N6 U% GMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */ r1 t# f) F( ~
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
" W+ f% X0 m: @5 DMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
' c# ~% O2 o9 Y6 T) g* Q8 F& \6 iMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
* s) ?$ c) B: K# \) W cMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
( D1 C4 l8 c4 m+ x8 ^McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);9 c) u0 _8 _- @% M. W: O# e
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); & @- ]! [3 g/ q& V6 B
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,5 \9 z; K6 k, O. w5 K
0x00, 0xFF); /* configure the clock for transmitter */5 X- _: z- x+ }, x( z
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
8 b1 a' ^3 a. d a% l( f8 NMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); ) r/ W2 s6 y) X. h- ~
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
/ m4 Z2 X1 Y1 p1 F8 F) l; Y2 K0x00, 0xFF);
8 c) i: ~) b) C8 X+ q7 \8 N
" v* `4 B& b2 W. n9 k4 K) e1 v, g/* Enable synchronization of RX and TX sections */ 1 s% b9 b! L$ R! Q# p8 ~/ v
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
. V" }7 {2 H# AMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
7 X, Q' Y. k# ]' ~( mMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*7 W9 F- Y/ E) B9 N% o+ o) |
** Set the serializers, Currently only one serializer is set as4 s' g, a& \4 {
** transmitter and one serializer as receiver.. h2 A- \( G0 m1 x3 ^5 k2 l1 h
*/
. |: x2 U6 V, g0 zMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
) T s# g, Z; ^& F5 qMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
9 I4 S, Y4 {- l9 P** Configure the McASP pins 6 X# Q$ |2 ]; P& h
** Input - Frame Sync, Clock and Serializer Rx! }0 ], G: H/ \/ r$ M
** Output - Serializer Tx is connected to the input of the codec & h. ? C) g ~0 n' @! I, w, w! O- G
*/" ^: s% ?% _3 L) w7 D% Q
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);1 e [. A9 E( W5 X% t" i
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));' z; B6 T1 T$ S9 p
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX3 k; {4 e- \, o: D
| MCASP_PIN_ACLKX; Q4 |0 k2 [; o
| MCASP_PIN_AHCLKX
, W. D6 r+ {8 h| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
9 ?. E. \1 y2 [+ }2 q. u2 H( zMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
, h- S1 Z) c( {& Z8 g0 ]* u" H# k# W| MCASP_TX_CLKFAIL
' L! ?8 C; Y% Y| MCASP_TX_SYNCERROR
9 `& Z3 ?4 e7 `" P+ x. t- q) K| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
8 ~- V: [* S) ?- T% ?1 O& s| MCASP_RX_CLKFAIL+ @$ o( X3 H9 E2 ^7 x& Z
| MCASP_RX_SYNCERROR
+ ^$ |8 J0 A$ o8 e. Y7 A| MCASP_RX_OVERRUN);
3 U8 H( O0 Q( A, \+ n} static void I2SDataTxRxActivate(void)
2 [+ Y, |9 i0 @) x" Q6 `# r# M3 G# U' X- f{- { o+ \$ c7 F; n! ?
/* Start the clocks */9 S# G/ Z5 b3 N8 R" W
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);+ I2 \8 l, Z* k
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
4 o1 y. L1 ~' ^EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
| b5 X/ h& `EDMA3_TRIG_MODE_EVENT);
0 r. J j4 d* x+ GEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, ) J2 S( R. V/ ?+ z5 t0 ?1 U
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
" f% w H/ \# {' x! k2 RMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
. E5 Q1 A- U# b' cMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */; @' x! x. I% W- u8 {% u" Z+ Q
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
, T7 X7 m# B" {. qMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);2 ~; N$ h9 b$ s, Q! t4 k% M
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
2 ?. f2 a3 G$ K} ) }) g! c p' t% U- q7 X
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. 6 x- {* p. q0 X' s, A' n( B5 T
|