|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,: S& Q m! H3 a" M. m7 O% a$ L, v
input mcasp_ahclkx,
/ N( _: i8 k, q/ c- \input mcasp_aclkx,
) R- U6 [' |0 C& x |2 ]input axr0,
6 H: w U0 u# k3 s/ I
! A% E3 ^% b0 ` Loutput mcasp_afsr," t* I1 a9 f3 m$ ~# s
output mcasp_ahclkr,0 P+ F7 Q- J$ r- r, Y+ {" Z$ D+ L
output mcasp_aclkr,
6 z7 H# { @ r8 `) Uoutput axr1,) t- d, n$ Z( Q- \9 C" z
assign mcasp_afsr = mcasp_afsx;3 J/ n/ [' a) D
assign mcasp_aclkr = mcasp_aclkx;0 q" g: m) o9 E8 R4 Z1 ^2 P
assign mcasp_ahclkr = mcasp_ahclkx;- @0 z' d% J1 l& C* h% h
assign axr1 = axr0; S! u" m- C% \5 o+ D
; g1 f2 J8 m4 B% R+ N5 J ]在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
/ a. X: S" X: b3 ystatic void McASPI2SConfigure(void)
' y5 q j7 P; l- }$ ]2 r{
' ?- {7 ?3 n1 E2 q8 F3 \' Z6 q* `# AMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
8 [9 R) M+ L% CMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
9 U. `4 K3 ?# }8 c5 G. P" [McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
8 t S* [. [$ e2 F, J# I! {McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
k5 g$ V( P9 O3 ~$ ~( M# hMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
3 V: G) R- t9 n1 S/ d$ t7 [MCASP_RX_MODE_DMA);! r: }1 G8 Y% i0 A9 E$ P' R
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
$ E$ Y& F9 |; {4 t; K! B: r) D, {MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */( }4 s# E2 E0 S4 D$ a
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, 2 ~6 A$ G7 H N. f8 C9 E( E" @& N; n& d2 o
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);+ {/ r4 ~9 f+ M; F' { l) F
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
$ x# o$ X) a6 L/ N A) qMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */- c7 Y/ |" j" m$ n" V' u
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
) i9 m& d F* b* K* B+ ^$ b" fMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); : D1 A' m! n2 W0 k( v
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,8 Y \1 O" c# D+ h
0x00, 0xFF); /* configure the clock for transmitter */5 w, Z" U+ ~7 F& h
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);. O# ~6 n0 k. i, n* `' Z$ n& Y
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); ! X8 y9 M7 m U0 w
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32, i% m0 [3 G7 D. _ r4 s
0x00, 0xFF);6 U6 M* [ e2 f4 v
0 s) @0 L5 p7 a0 I( {# U/* Enable synchronization of RX and TX sections */
' B- L0 u+ h& D# D, h7 I* uMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
; _7 [& o/ u$ n+ b5 a; lMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);; ]5 X! D6 E+ |7 f
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
/ A0 r. D0 A/ m: g5 ~* N$ N** Set the serializers, Currently only one serializer is set as% C# f7 K: J4 [+ p
** transmitter and one serializer as receiver.
& d- C5 \; q8 Q7 U*/
( Y, h6 B3 c6 Q9 CMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
7 i! d- O; ]1 e9 G$ L SMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*+ y8 _) q- H3 W9 w+ I( g4 L2 Y ?
** Configure the McASP pins 1 Z9 S1 h) k' a' s
** Input - Frame Sync, Clock and Serializer Rx
$ \) Y- k5 X0 a5 a) @** Output - Serializer Tx is connected to the input of the codec o% V! N/ J% f9 L. t
*/ S. M- ~5 Y! ^! d4 w$ G! B
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
4 ]( x1 j! a9 g7 _% n' @1 n5 AMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));: I& e& l8 F) t# t$ H3 O( X1 c
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX" N5 w& g5 [% G7 ]
| MCASP_PIN_ACLKX% N2 r8 o6 m) X/ x( H9 y
| MCASP_PIN_AHCLKX
/ Y3 D' P# N) a, y| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
" O* w4 C! a. w/ ]/ T9 A% [. eMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR # F. f2 a `; l: o( m4 o6 |
| MCASP_TX_CLKFAIL 6 H; L" z+ O: W# ]% p) S) n
| MCASP_TX_SYNCERROR$ T& h5 a$ m3 z- } h- j8 e
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
7 p; _4 I; ?! p4 G. C" ]| MCASP_RX_CLKFAIL
3 P- J7 d, A: d% H! R! H| MCASP_RX_SYNCERROR ' Y$ c: {" u" h+ S- ~+ j$ }7 { u
| MCASP_RX_OVERRUN);
0 X$ A' t8 j9 J! [9 _) G} static void I2SDataTxRxActivate(void)& a& _% v3 Y' @. `
{' b( K$ F4 c7 b
/* Start the clocks */
$ }6 D4 D: g% h. E0 x: AMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
: s4 }& z9 b; qMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
6 d; n: I5 f, I; D3 n& MEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
( u/ ^3 }( o/ Z4 [3 k: z0 a" G$ zEDMA3_TRIG_MODE_EVENT);! S7 D. s8 Z! ^ ?; q. d
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, & l) {- c+ m, X* D
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */! Z8 n3 }9 | R4 s
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);% W F9 w& F( W+ b( F" u# Q/ y- s
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
~9 G8 A1 \: i& l Uwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
2 X! k9 a+ i/ F. V0 x+ _McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
( f: R& Q; T8 I& U; bMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);
! {' Q! r1 L+ z |" Z; f} ' f8 ^& N( C/ ?/ O
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. # H. r, R, z# s* V
|