|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
# j/ T1 ~& x" `" w n2 J7 minput mcasp_ahclkx,
f# t7 t6 M4 Minput mcasp_aclkx,
9 O) ~% r+ u2 v6 k( m& kinput axr0,0 G1 ~; Z, Y) I
. k* b) o7 f% M! \3 u% ?; {
output mcasp_afsr,3 j5 W% n7 m; }# l% v* F
output mcasp_ahclkr,& x# {3 A* a! i- i! q
output mcasp_aclkr,/ `8 J9 b1 L! M
output axr1,1 @% o4 l/ E1 C" B5 D
assign mcasp_afsr = mcasp_afsx;: ~" \7 O6 G$ e) Z# K* K+ B: |
assign mcasp_aclkr = mcasp_aclkx;
9 R! z$ v7 v5 f2 B/ l8 |) E; g$ Cassign mcasp_ahclkr = mcasp_ahclkx;1 l& j9 F2 \) ^6 g8 H1 L2 X5 S$ k
assign axr1 = axr0; + g5 ^' K A% \1 ~6 m7 e6 |
. Y0 {! S& e+ ~* S x( b
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 ' N/ w+ g+ q; B
static void McASPI2SConfigure(void)) Q k$ n3 Z8 B! F' Z
{% Y1 Q! [6 _) T, s1 A A
McASPRxReset(SOC_MCASP_0_CTRL_REGS);# L. |$ J/ a% j/ U+ M
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */ I- {2 c( t. O3 r; m7 v# _
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);3 M8 F" u4 ` `3 z3 y, J
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */, `/ J% p# f* H: F- Z" F
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,# ~ s* v0 j+ H) Q/ A; i9 [# g
MCASP_RX_MODE_DMA);# |. C1 M" r9 x; j( J! j& ?& N
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
$ Q; T! t$ ]3 l( t* I2 B5 FMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */, a4 P s# x1 T+ B! R+ f
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
6 R% g: u3 K: L7 zMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
4 }" [, M: a! l, [8 S/ PMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
5 ?9 A4 r! _; @( iMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */( }4 b5 b' y) D8 n- c
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);6 q: i; C) i5 _% l" G+ N
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
4 ~+ C) G* t% e+ Q; NMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,) Y' y2 B" Y) N
0x00, 0xFF); /* configure the clock for transmitter */$ M- e# N( N: f2 H9 A' K( S
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);# c8 m. s/ K: K8 O% H
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
6 _: ~4 d( \; i2 V2 v1 @8 LMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,. \: G, g& Y1 m3 d. ?
0x00, 0xFF);' D( N- C0 U v6 a* R
0 y, l0 w; c" ?1 F- U# {- G
/* Enable synchronization of RX and TX sections */
& X3 G- O2 w6 x0 s' F- h. A- oMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
% j) d5 `! x" c' E8 Q( kMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
2 {4 e3 r9 K$ G. YMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
: Y8 N6 m7 f& k** Set the serializers, Currently only one serializer is set as8 [& T1 J1 R+ R* l7 i" s, P
** transmitter and one serializer as receiver.
$ {/ w4 C9 q4 V! g d*/* |5 o9 L. {( f9 b. S. T
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
5 E+ T! i3 ^6 @. ?, a KMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
- q6 o: t, r" M# G @* a** Configure the McASP pins
' y. U5 O/ O' C! _# H. B& M** Input - Frame Sync, Clock and Serializer Rx7 J% X# m& z+ ~: ? D ~
** Output - Serializer Tx is connected to the input of the codec ! H& R: Z! t. L) s$ Q
*/$ R9 R# K. L: F) }% W5 o
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);% f7 ~( Q" t/ c8 u' J
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));) V; c. c; C) s# }# l
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX0 P4 N0 ?5 I7 l: Y7 l7 Q, V( `2 y
| MCASP_PIN_ACLKX
* v: @/ v8 |2 V( {2 m8 u| MCASP_PIN_AHCLKX! W: G. }4 n" n. F) L4 _
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
, I. m/ }/ s% E! F. \( ?/ a) HMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR 2 o, g& f% ^* U' @# W1 n
| MCASP_TX_CLKFAIL
& v0 n# y# a9 H! _8 ?| MCASP_TX_SYNCERROR
+ n" ^# p, i' Q/ q! \| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR + a0 [, c |( z3 G. ?
| MCASP_RX_CLKFAIL
! d* w3 x9 L( d' R6 F M# z| MCASP_RX_SYNCERROR
@& G% B4 R6 m" B| MCASP_RX_OVERRUN);
( r, P3 s% v7 T* [7 \( P3 O/ n, T3 ]7 v} static void I2SDataTxRxActivate(void). P4 O, K, _, T6 L* C& X }
{
5 x2 A/ @. U' K. J- a% L/* Start the clocks */
3 x3 Z4 j$ Q, ZMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);8 i" b4 v! N9 j5 H3 u, J
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
, J5 O2 b# i$ z6 \; d2 p8 jEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,% l0 b1 h. e1 ^0 k5 ]- [
EDMA3_TRIG_MODE_EVENT);0 T0 n! j% i/ g4 V$ i2 `8 s
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, 6 R5 [$ S( ?1 s8 q" |; ^
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */" R/ I7 N' Y1 ^( D6 l# E) y
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
. J) o7 W O; oMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero *// _3 a4 I" C4 P2 m1 a( w
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */# Y: O" l' Y# G5 m/ X0 a6 Z
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);. X0 x- d9 O3 e# ~8 q
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
% R/ G0 j# W3 d1 y. Q} 4 V2 `2 p9 I) D' s- `) F
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
, D! H5 K% w9 V4 F% A* k; n6 u |