|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
- p2 p5 k7 b+ o# c: t1 F+ Minput mcasp_ahclkx,! Y7 U2 u# }9 S0 j6 Q
input mcasp_aclkx,
* r( h2 k- }3 K, Y! rinput axr0,5 u1 q L. p9 ~% F+ s4 @' o
( s5 O7 B: _4 V
output mcasp_afsr,
3 Z& W. V' z/ J2 A; Zoutput mcasp_ahclkr, i9 l1 O) V( o3 F, ]7 H0 z
output mcasp_aclkr,; g; K1 [+ V! P3 e/ E7 E V3 T
output axr1, @ Q( }( I; W6 ]1 l" ~
assign mcasp_afsr = mcasp_afsx;6 {" k; G9 Z5 U- r1 w4 ], ^
assign mcasp_aclkr = mcasp_aclkx;* b* {* f5 K; z1 ~
assign mcasp_ahclkr = mcasp_ahclkx;7 C5 ^7 ?0 `4 L% L/ }5 m0 U$ B
assign axr1 = axr0; ( u8 Y- z6 h3 _- |
( Y5 ?% @! e* W& W! C% J+ v" E
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
! s0 Y9 Z6 Y" S' k) N1 E [) {static void McASPI2SConfigure(void)8 F: X( t7 L8 _2 g& V
{' ]+ m$ E5 \. m. c
McASPRxReset(SOC_MCASP_0_CTRL_REGS);. E2 H- X* k7 N) A
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */. V/ e9 ~. K+ X9 P, r* [
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);, m7 @, m" J( D0 t( N' \
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units *// q( w. ?/ [/ Y0 G/ d, O
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,9 s/ w- g3 y$ c% _2 N
MCASP_RX_MODE_DMA);# ~& M+ J5 I) B" y1 Q- [0 N
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,* W8 M5 j: F2 n1 o o
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */8 |! M! i( i; I9 `- x
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, $ f& ]0 A9 S1 R. B7 n3 \& w
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
) n5 e( _3 w% I& `* S4 tMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, 1 u( v' D* ~4 {! o2 C6 W9 D$ j* h
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */, K! n$ |2 ^1 |/ h; |! w+ M
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);/ M+ J& A4 h4 z, i$ W8 P
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
- s ?+ e$ ^. c& `6 [McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
! G4 y/ }+ o# t0x00, 0xFF); /* configure the clock for transmitter */7 S) ]$ }0 J9 D, m6 m
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);. A. q2 J, s% A! X# X
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); 0 [: `! u( u4 ^
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
% t: T6 O4 Y0 D8 c3 B4 b) f) j0x00, 0xFF);+ Q8 Z! q& x4 t( n) }, C, _) a( T' f* t
" R0 C' f8 ?/ z @, \- ~% z" K
/* Enable synchronization of RX and TX sections */
4 \: u6 a/ H7 l7 r. h) QMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
& B: U- k* K) @4 |* s" {, lMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
5 I3 b8 U. y9 C9 u' N2 u' EMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*9 M& m3 R% ~ y3 \& I( m1 S
** Set the serializers, Currently only one serializer is set as8 }: E! U+ g4 e M
** transmitter and one serializer as receiver.' }0 d% f% C7 k% i# ~2 l$ t2 _
*/
1 g: R5 u( I: q3 M! _- u! rMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);& ?& w, ^$ S( Y% ~0 S3 W* D
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
) ]$ c! U1 O- n# u; I. M" ~** Configure the McASP pins & \' J/ a) O: q
** Input - Frame Sync, Clock and Serializer Rx
- |: d1 D2 r. V3 h! o! q** Output - Serializer Tx is connected to the input of the codec
. g _* ~6 H+ u9 U. H, {- v, Z*/
1 F4 L" a3 d/ x% N7 O. B0 YMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
' `1 J: a4 j5 w% E! pMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
$ Z5 L6 n C& l5 D# {3 W0 AMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
! V7 q( O. W2 k0 n6 w8 }| MCASP_PIN_ACLKX$ Q H! _' i5 O: g% v. w/ R$ m
| MCASP_PIN_AHCLKX
- V! ?4 H" C T3 _7 J| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */ |# z; ^0 n2 P2 z
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR & q2 G+ X) V* ^& @- ?. q
| MCASP_TX_CLKFAIL
( l3 `( C6 v5 f8 `) _| MCASP_TX_SYNCERROR; V8 N- x+ G2 w( d
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
1 }; |0 s" A U2 \: V6 o' d| MCASP_RX_CLKFAIL
6 r! f2 R9 Z7 u| MCASP_RX_SYNCERROR 3 H6 t( R8 i( j8 U' w1 p
| MCASP_RX_OVERRUN);& {/ n6 B' ]; Z
} static void I2SDataTxRxActivate(void)
8 a/ r. ?9 c3 a{ v/ X- Y7 L" P B6 G
/* Start the clocks */
- G7 H ? ?7 E/ a! j* e4 DMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
- w4 ]; C. M; b$ Y2 N+ z+ IMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
" F8 u7 F. Y) s$ k" [4 EEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
+ k* t" Y% {; h- Q1 P3 JEDMA3_TRIG_MODE_EVENT);
' b0 u( i6 b2 L$ j) M/ VEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
: r. o; A" {0 T- C. MEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */1 a: U& x) E, v) H4 r
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
- T4 t" I: F3 ]; Y! jMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
- Y; q8 p& j5 e* |/ ]while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
& @% S. }9 z0 U# LMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);
) {/ l- `* p% j; V6 D( [, }- fMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);
: k& I( V+ C- w1 l}
$ ?8 |% t9 p! B0 }请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
% r: J* `7 L; P% G. f7 t# c8 @4 x; ^ |