|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,& Y, [* B# p4 |3 _! Y! D" Y- r5 ?4 ]
input mcasp_ahclkx,, r; [1 O8 b V9 k
input mcasp_aclkx,
+ o, o) S" w% i1 L* v# M2 v7 xinput axr0,
6 m* {" e3 U5 u6 J9 r' w* t0 `( o+ x# r% x6 [3 k1 I2 M
output mcasp_afsr,
7 M& F0 }8 n; S: w" |2 H. ^. Xoutput mcasp_ahclkr,; }3 ?4 o$ `! c- p3 c8 q
output mcasp_aclkr,
, M- q* P# R# f' t7 d# H3 koutput axr1,
( n/ _) Z" K1 a assign mcasp_afsr = mcasp_afsx;
! B* j: L2 `1 `3 A. ?- rassign mcasp_aclkr = mcasp_aclkx;7 _* t9 e1 K% T( o* G) _: _
assign mcasp_ahclkr = mcasp_ahclkx;
, f6 P& V' i1 v1 T9 p) ?. uassign axr1 = axr0; : e' ~7 y9 Y' G# {& {5 g
8 p1 O6 U- A4 g8 a8 Z
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
6 D* E6 \1 O$ b+ E' ^/ H% Ustatic void McASPI2SConfigure(void)" c5 f$ g+ ~5 h2 U3 o+ C$ o6 ]
{/ L0 W8 K$ L* i0 L2 c5 b8 [* h
McASPRxReset(SOC_MCASP_0_CTRL_REGS);' F4 ]/ {% |5 a
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */( n6 r5 d; l; x8 T9 Y
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
) e: t2 t7 u% G4 k/ ]6 N8 r* `McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
# Q/ y( f+ c, b7 \- jMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,8 h [- L1 i- |
MCASP_RX_MODE_DMA);
2 N @! `3 c3 ]McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,# y. z/ S' k3 s0 a, U+ w4 |3 ]5 {$ L7 F
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
. s) V+ S. T- hMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
- e: S/ H- T1 J7 c- ~5 |MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
+ V* t6 ~! ?$ G3 p" g8 ]8 i. ZMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, + w r. l# q' g
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */% _9 I; r, | b* W6 N8 Q/ o
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);7 Z( |1 N0 {- u" F& ^3 i5 Q
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); 0 j* s. q* P- J7 w# k' v
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,6 q) }. E! e$ Z' x# |, |
0x00, 0xFF); /* configure the clock for transmitter */2 j ]1 {3 v' d% ]( e# B
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
! P1 Y8 C$ }. {7 q1 KMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); . v4 x* ^$ @# n& {# C
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
6 ~6 C) \% \; G! D0x00, 0xFF);
- _" H6 _6 ]/ `( N4 c J# J g$ C7 {! d# E7 C B
/* Enable synchronization of RX and TX sections */
. T% d$ \5 k) Q- ?. {McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */" W1 ]4 Z8 q1 t' X3 ~
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
0 y# r$ h6 E6 c6 x- Z# z4 FMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*8 t7 h. W$ Y9 s$ R
** Set the serializers, Currently only one serializer is set as
7 e, a+ G; U l# f4 b** transmitter and one serializer as receiver.& E0 Y% ]4 E% b6 m& ^
*/
) g. [; }3 A9 X/ }" m% R dMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);, ~" \/ d- O/ W8 W
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*7 x% B" t. {7 m
** Configure the McASP pins + c! J8 w0 W+ ^7 e" `3 K w! u K
** Input - Frame Sync, Clock and Serializer Rx$ S" M& z* e% @& J* Q
** Output - Serializer Tx is connected to the input of the codec
" _0 `5 p7 }& g* N; K*/
/ ^5 }/ Y; r5 }$ w6 {, O; ^" p3 c8 XMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);* j& Z( Y" V2 j5 ^
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
; \1 M! m r+ v, V8 W0 TMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX( |7 T, j2 x0 U0 L
| MCASP_PIN_ACLKX x$ W9 G( U; [5 B0 j( K
| MCASP_PIN_AHCLKX* F3 R4 W' A1 \
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
' g( f+ l" K# P1 _' x! w5 QMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR + t0 b: s4 ?+ I+ U- c+ _! @
| MCASP_TX_CLKFAIL ! y/ ~) I& o& l) S2 C6 s
| MCASP_TX_SYNCERROR5 L+ X; |; v8 c- }3 ~6 x
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
& `( s. n/ {' S% n$ p) f5 }| MCASP_RX_CLKFAIL7 e3 ]! q1 ~$ F; m
| MCASP_RX_SYNCERROR
8 K" {: ?6 M8 g5 M' u, i| MCASP_RX_OVERRUN);7 E9 \5 Z/ E8 a* {4 d
} static void I2SDataTxRxActivate(void)
; n, |. |/ X1 B# u3 ^{3 H( q8 R# h4 ?; R' E( j0 m
/* Start the clocks */
9 }" J0 C+ l5 U6 n0 y1 WMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);' t' }2 F% Z1 d; R
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
" {/ b' I/ k0 j9 d( gEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,! T9 \- Z) y* @6 m# Z1 z
EDMA3_TRIG_MODE_EVENT);
2 [8 u4 S5 t; H6 p2 X3 e8 XEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, ! V1 ^/ Z# J5 ~5 H2 U% k0 K
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */4 N8 C8 ?0 J4 K+ i" R2 H/ d/ T
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
7 a+ _& r* H3 B% J3 I/ ?! s9 \McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */% }8 E% o: N/ t$ e1 S; |# l
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
" _; [9 T( n* d1 o9 uMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);5 n+ m3 J% W7 f( q1 S) v
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);, ^ M9 a( d$ a% T9 P
}
4 v( B% P- q) w) f3 J3 d2 J2 \请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. 1 D( B7 h9 S- p
|