|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,! F: E! f- ]; X; D0 c
input mcasp_ahclkx,
4 h! Z/ p" c3 j S0 }3 D) Iinput mcasp_aclkx,2 q+ }1 ]$ I7 q7 s
input axr0,
! b/ I6 {, f. U
h! X: T* |: r5 d7 i. soutput mcasp_afsr,
( @6 G/ t) `. x% t" M2 j/ i, X! Woutput mcasp_ahclkr,) K& B- V1 A M0 P
output mcasp_aclkr,9 O! V% D& N: c/ l6 R3 U i6 B) D
output axr1,
( S0 h: f' F+ o. ?1 y& k assign mcasp_afsr = mcasp_afsx;; o( @6 E8 j' u5 b) c
assign mcasp_aclkr = mcasp_aclkx;. n; |0 x5 ]* q9 G/ l( ?& U
assign mcasp_ahclkr = mcasp_ahclkx;' \1 {" v' {, B, ^3 j w% J. ~
assign axr1 = axr0; 0 j& W: T( G* K+ s' V
" _8 h+ l' M9 i9 j+ p- X在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
5 h, w+ e% |* g; p3 Gstatic void McASPI2SConfigure(void)
2 b. f3 R% w. v* C; ^" E7 d; x{
/ K: V/ }& c1 P& R# l) N) s2 [McASPRxReset(SOC_MCASP_0_CTRL_REGS);. q9 c, G- [) _+ D- Z3 m; \/ d0 s
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */1 h" e- v, u! h; @& X( }6 T" k
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);4 {- c' y2 b' l+ Y2 ?
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */7 ?. K+ S0 r* b j
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,8 u7 t {) l8 |2 ]% ]: `: y4 n
MCASP_RX_MODE_DMA);
/ G7 h' p0 A& Z2 M, e+ B" hMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,! t6 r8 m2 R" }( e; U2 [
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */ Q8 Y; t$ X8 I1 ~: K |
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, ! V4 F& Y8 l+ U! s/ X( s6 d
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);( f6 \! n2 u: Y
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
/ ~$ Z3 o8 R, M a4 Z o, Y6 OMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */$ M. K- c) J# N: W9 X# M5 x1 N( b
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
' n$ Q+ H, S' o* |# k0 yMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); - d3 P( B0 W* f7 ~
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,% \. W4 K* `# Q" T' S8 ?1 Z
0x00, 0xFF); /* configure the clock for transmitter */+ c4 t( p# e8 Z! c8 i
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
$ l# x8 |6 R& X1 n2 `7 IMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
9 E: ~2 O8 U8 z7 pMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,4 ^5 q- b1 n! c3 I
0x00, 0xFF);% o" Y5 t! B; u6 b5 [! n" v
# m4 r' _3 S7 D j Y% {4 s+ M/* Enable synchronization of RX and TX sections */ ' ?2 r& k& |4 g7 u {
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
0 o. s' }4 x0 U, F. E. Y* ^McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
: _; x9 F( T8 @4 EMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
( L* j2 d) ?4 y* `** Set the serializers, Currently only one serializer is set as* s1 J( M/ A( c+ N3 Q" b
** transmitter and one serializer as receiver.1 D' f5 O5 f) u% ~
*/
& C: f( J( z9 J" I; l% R8 Y' i4 B: dMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
3 ~, p( n0 p' M8 e) e$ mMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*8 g, H1 Q9 T! R) J
** Configure the McASP pins
+ R( C8 O6 j g" _** Input - Frame Sync, Clock and Serializer Rx- |9 {& r2 _9 L# [
** Output - Serializer Tx is connected to the input of the codec
3 K3 B# m$ v* e; ?' Y, P2 z! {*/& W& a/ S9 _" O9 s" [
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
% N1 m( F+ I$ n: l2 q5 LMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
' [5 A4 p/ s/ X- e( L2 l' HMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
; [ I* S# n) x' i| MCASP_PIN_ACLKX9 n1 m7 K! [3 t4 Q4 n
| MCASP_PIN_AHCLKX
6 f3 q; N; {) E: ~$ ]| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */' X/ R! G0 a0 _# E1 P! U
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR . \$ S4 f2 u; t- z
| MCASP_TX_CLKFAIL # M) s. E$ ?4 w; y2 [
| MCASP_TX_SYNCERROR, n9 [' V. X( b2 b- e& @+ K
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
Y2 }9 d" a2 P3 R7 J0 O8 Z| MCASP_RX_CLKFAIL, }0 l2 Y. k8 L9 o( L
| MCASP_RX_SYNCERROR + ]9 T* l+ a0 b
| MCASP_RX_OVERRUN);% z! A6 q* f |5 U# B
} static void I2SDataTxRxActivate(void)2 d( G( a' x) t' r6 x5 k
{
8 _/ S) ^) X' |/* Start the clocks */. O% L% y6 {( r1 e7 y! C
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);7 y4 }; @5 Y, u C) l3 p, o( |# m, n
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */- Y0 v9 H6 ^ p
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,+ ~( Y6 Q$ p; h5 X/ K' C; a
EDMA3_TRIG_MODE_EVENT);6 @; t9 \0 z3 F( d
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, 6 [7 _& I2 ] s
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
0 o) O6 a9 Z; y0 fMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
7 N) z' D8 H( QMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero *// z/ q, O, E# T+ |9 ]
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */' A5 d" N- p' V. f% B- y3 N
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
4 r. X& a0 H) ^2 _; o- i3 QMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);
- K3 ]0 ~; t% x6 B! i) e} S( ?& Q' e5 D) k; C0 B
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
. S C) y, g" A5 p |