|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
6 w) `# r7 o1 W1 d, D& Qinput mcasp_ahclkx,# [+ W& D- T$ u) |/ c6 g
input mcasp_aclkx,
9 x0 m- q. @- l+ b q1 r8 {1 qinput axr0,; E3 C2 W+ P. o; \. |
l5 |1 C1 x4 X; f# l; U0 o% M3 E
output mcasp_afsr,. F. l7 n# E8 z! h: r
output mcasp_ahclkr,0 y8 t7 P! k" o+ ~
output mcasp_aclkr,
9 l4 o* Z- M3 j- E8 k9 I! ]output axr1,
1 a1 E( O! ~. x0 i, N3 x. h' [- d assign mcasp_afsr = mcasp_afsx;
m/ P# S- c( | x. |; B4 |0 vassign mcasp_aclkr = mcasp_aclkx;# t2 A" l9 {0 ]. C5 c
assign mcasp_ahclkr = mcasp_ahclkx;
) V$ {9 x' u* d" h/ G. Jassign axr1 = axr0; " T$ \4 N% {" ]& Q' D3 R/ v
_$ f% K+ Y; U1 @4 t在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
1 Y" C0 j; Q- U% C: }static void McASPI2SConfigure(void)- ~/ u2 B$ r# }: O1 f% P0 R
{
8 ]% f# \+ C8 j2 e- ?McASPRxReset(SOC_MCASP_0_CTRL_REGS);
6 h y# Y3 E" ~McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
# h+ R6 V6 v0 v# z& |, W( bMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
b3 e' L( X5 ^3 uMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */1 u( u+ a5 @2 L; D7 }( `; Q
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
- k# r2 I/ Q3 v4 hMCASP_RX_MODE_DMA);1 N5 m) _2 y/ l* `6 \: _
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
9 ?/ m( ?$ J+ R6 I* cMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
4 }4 x: v# N! B! P* YMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, 3 E) C7 x4 x; ]3 G* b9 A4 H a
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);& b8 G, x3 A) X' |' J
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
4 w) `( h' k6 C/ l' J, jMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
. Y0 P1 _3 o( vMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);6 W d/ \2 z$ h) w3 [
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); 0 P0 }( U% G9 w
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
$ D! t6 s; K$ a+ Q4 l# c/ v0x00, 0xFF); /* configure the clock for transmitter */
. z5 m, C6 c" }- k. |) z6 ?6 X1 YMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
5 C( T. Y1 z5 |3 VMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
- M* i' F4 u u6 o$ x" ?- NMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32," i8 {6 {* e6 R! G8 N, N6 D# K
0x00, 0xFF);' L5 I. b$ ~" x+ g! m" n& V! W
3 J+ W& y) |. r. Q. f" e' Q8 |/ |/* Enable synchronization of RX and TX sections */ 9 w" \! T" _6 w7 W9 {3 g/ z' k# U
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */" d D6 Y* r9 ?# B/ y3 @
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
. [% g' X& m( e( wMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*. h+ `/ T0 g" x: T
** Set the serializers, Currently only one serializer is set as8 ?# _. m# d$ O
** transmitter and one serializer as receiver.
: t! u( h% K- M$ |$ i*/; \: r! a, m. w
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);/ j& {# c% P; C7 x3 i
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*- \1 J# p. \1 w
** Configure the McASP pins + S) B; h. @; d
** Input - Frame Sync, Clock and Serializer Rx3 A5 ^1 S6 a: K: ?( S8 h( T
** Output - Serializer Tx is connected to the input of the codec
; ~! l, n2 }9 p& q*/$ L/ b* g( u; ?6 \2 K: {5 i" E& [$ b
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
9 }4 p+ Y5 t5 W0 VMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));5 l2 @2 h, @# E3 Z! ~! d
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
+ W) J# ~; b2 }0 R( y| MCASP_PIN_ACLKX- h2 u1 C- R2 f) c& i. r
| MCASP_PIN_AHCLKX/ d; P8 `# E% h: t" |
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */- P+ l3 _% ]5 O$ V
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
5 t/ y) x% c% {| MCASP_TX_CLKFAIL
/ C0 e% [* E3 v! K$ P| MCASP_TX_SYNCERROR
2 `* _" z. T: ~' G) n4 k| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
" n9 T8 R( T1 h% U9 g; x- ]| MCASP_RX_CLKFAIL4 p, g5 ]4 x6 F9 U, A* I; z
| MCASP_RX_SYNCERROR
5 C' k0 R( ]& c# S: c* o( i| MCASP_RX_OVERRUN);
$ E$ ] p4 s. K$ F7 Z& T+ i} static void I2SDataTxRxActivate(void)" A) o. E( l9 E6 o" s
{
6 X4 ]- o* Z. v1 |& j/* Start the clocks */( O: m( z9 z& w, U+ |% R
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
9 T; ?- L: s4 R$ p$ @6 s: QMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */1 j4 ?( l, e: `$ I
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,3 q& i ~: E# ?9 P. l
EDMA3_TRIG_MODE_EVENT);( W" Z, v' ^+ J! \9 K' I
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, ! ]5 ^6 z, g6 ^, y
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers *// g' e# z; S; c
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);2 c# _$ P0 w) q6 b2 W1 J
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
0 J# u" R1 D# F! ]8 r8 d( b9 @; R" D: }while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */# i, Q! q1 C4 G* C1 q
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);. A( \% `9 i$ c! Z. j0 Z0 y
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);( h# z9 Y3 J$ w8 v& I+ D S% h
} $ G+ U6 v: A7 Q9 z9 P* p1 Q; q. s
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. 9 Y% B4 {" n1 z) F. A- b- |
|