|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
" }4 r( \" Q7 e( S9 V" d! h/ t: P2 finput mcasp_ahclkx,
& w) |! s/ X1 x# Oinput mcasp_aclkx,
3 s) g; [% ]8 f0 }- W" _# [input axr0,
0 `& ]2 w' ?; N) X% ?, D+ d: i8 W; @! p
" j8 W% `( h" Joutput mcasp_afsr,
9 F$ E% e1 e, J; Foutput mcasp_ahclkr,. `/ ~) D; S7 S/ J7 t
output mcasp_aclkr,. d" M! {7 E) Q3 D/ D8 J8 K! r& T
output axr1," z# r2 i" R" P) r
assign mcasp_afsr = mcasp_afsx; j2 H. e/ Y, T1 M
assign mcasp_aclkr = mcasp_aclkx;' c0 p0 `* y" b" G) z2 w6 q6 ~
assign mcasp_ahclkr = mcasp_ahclkx;7 j% } a$ q/ g: g3 O
assign axr1 = axr0;
3 W) c* [ L! u0 p/ R( S9 G# F8 b) _% I5 z/ O$ P7 R% m
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 ' k0 ~% {1 Y9 E) A. \
static void McASPI2SConfigure(void)
$ R; Z+ N b3 Y: A: `{4 m# @2 M3 a( F& H
McASPRxReset(SOC_MCASP_0_CTRL_REGS);* N. b( \" K' o
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
, V' O7 j% ?4 X1 F) OMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
9 Z# T! d+ O6 @ l9 x& \. W. [McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
5 l9 }7 y' l+ UMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
: m# R9 X9 s% v% z( \8 ^- EMCASP_RX_MODE_DMA);
4 V5 G# }' y7 c1 k+ B$ Z( c/ VMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,( \$ j! o) x5 L; L, O: d" ^) ]
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
7 `) }" G, Z" Y( f3 G6 x* kMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, 4 |" d0 d8 y3 Z4 v1 s
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);( o' K0 c) n2 e8 m* J2 z
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, 8 j4 e6 x# G" K
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */# L2 z! S) } q# s: E
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
" c4 ] v# l2 |6 gMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
1 x# F8 V# b1 U c/ _) wMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,8 B D7 k4 Y! F- {# k
0x00, 0xFF); /* configure the clock for transmitter */
" X4 q# _0 p1 c/ X( XMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);( j" w+ ? g( @+ S1 p
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
8 N3 X! M% p: I0 t5 g. W* G& JMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
/ a8 S J! q; L2 ^- X, T0x00, 0xFF);6 L! q% J F& m% A# z) Y
) s, q$ ^, z2 w/ M. y0 c, k8 ^
/* Enable synchronization of RX and TX sections */
+ n0 u( c6 h! {: c! Z- }McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
- F0 U% @! Z0 h y& K& z( \* BMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);) N3 n1 y: o7 p
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*. U0 v# c0 `# O/ d& U
** Set the serializers, Currently only one serializer is set as* o0 Z+ [& ^7 t0 P0 ]0 T' k% N
** transmitter and one serializer as receiver.
8 H2 J" j/ Q4 {( S. f*/
) e n* }" p- R4 jMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);8 G' Y5 R0 B. ]0 H
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*5 O& ^" n d# x9 W6 h7 q9 C
** Configure the McASP pins 2 L2 D, v* ~( ?/ e9 H( }$ I9 t
** Input - Frame Sync, Clock and Serializer Rx
6 s+ A, }! p3 n* \** Output - Serializer Tx is connected to the input of the codec
. I( b8 R: g5 E, o8 A*/
3 |' y. ~( m4 @8 M% L* NMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
) u. A+ O" B3 \& k0 |2 w- O+ p$ w% }McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));# y" t7 E- L. K- a) ~
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
- z& e f4 b" \. {+ k| MCASP_PIN_ACLKX. o; U% U" `: J( T9 K
| MCASP_PIN_AHCLKX
. G% ^) V, Y8 z! v| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
& M r! |4 Y/ N0 y# [McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR 1 B3 i: a' o6 V2 \6 w( Z8 }; z" B
| MCASP_TX_CLKFAIL
: ]+ w. b& S Z( a0 c% `. D/ y| MCASP_TX_SYNCERROR
* q2 b6 S* S# q5 i9 Y5 F| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR ; r* |- |3 |6 {- q
| MCASP_RX_CLKFAIL
. z( }+ u% c6 H& ~| MCASP_RX_SYNCERROR - B' t: ^1 \- w
| MCASP_RX_OVERRUN);" P& o% ~/ `* e
} static void I2SDataTxRxActivate(void)
! c$ k7 S; E. N8 `& Q- t* X+ E+ F{
) t1 v8 }) ^% h/ C& z& m/* Start the clocks */
) ?; Y/ [. s. |, \- g$ p9 kMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);! L$ H: f1 Z& A# G+ Y9 D0 g
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */! y' ^1 W! V: h
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,+ R" F3 v/ _- D& ^" Q# V( S
EDMA3_TRIG_MODE_EVENT);7 _, K P" w' v1 M1 Q) w/ Y) H0 L& \
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
: I5 l4 e8 p' U3 ? YEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
2 T! o+ Y% l9 E. A1 [$ y' _; aMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);$ y" v. Y/ q; V# b4 r' ?! i- C
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */4 ^4 ~% ^1 E; k, Z
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines *// L- S1 y7 i0 e% S- W
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);( z- h: {) u4 l; s J
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
3 b* g! t2 ^7 w& P0 \2 y}
- d n; H' y6 [6 U: _- y请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. $ G# t* I; W2 U9 x4 ]8 [4 D% o
|