|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
5 J+ ]! F: Y- G5 ` M Ainput mcasp_ahclkx,
; C9 v; z% v8 v: G5 T; Dinput mcasp_aclkx,6 V, v, j7 `1 h. n( v
input axr0,
: v$ q3 P0 E& ~ z- u& p4 J$ E h" c5 r
output mcasp_afsr,
t9 q2 t* B1 s" U, z# goutput mcasp_ahclkr,$ @* V' O4 e, v' R
output mcasp_aclkr,
) l$ L- r4 m' ]' routput axr1,
+ ]' D+ |( M$ g0 x assign mcasp_afsr = mcasp_afsx;3 u6 P5 Y5 t5 ^6 ]8 E
assign mcasp_aclkr = mcasp_aclkx;5 t3 X' g* H, _+ Q! J5 w
assign mcasp_ahclkr = mcasp_ahclkx;
) c% R! |" T* L0 }assign axr1 = axr0;
i/ T, A. x# M; j; z+ g" a. N7 \
. M* r6 n0 ?0 `6 m& x在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 & a3 L8 _0 \& q5 x. R' V4 R
static void McASPI2SConfigure(void)
) x$ b8 R- N `& z{
5 s" K9 M. {8 W; N% nMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
0 N5 y$ }) T7 BMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer *// N: `; e+ l. `7 r
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
; D$ h- v5 q0 X, @" bMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */4 H9 |* w/ U4 @+ e* O
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
2 P, y( x( }% o6 U# rMCASP_RX_MODE_DMA);
- k2 P9 e: l0 R x0 c zMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,9 ]+ o2 E+ J/ ~6 c& O% C0 V" g( w
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */" ~6 |; N6 U( L
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, 9 J6 C' Q8 \* J3 p n- O
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);9 X/ L) J( j8 ?: B) V3 _
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
' E# c# k, Q4 nMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */+ H& X$ g, z, ]( o
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
, v7 T6 h1 `! m% }& OMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
5 ] _/ x. ~1 J2 @5 S3 e# _# fMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
) ~9 I. M5 i6 }1 T" g; ~) r( u0x00, 0xFF); /* configure the clock for transmitter *// L- A& O% ?! F9 b+ T; D! Y
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);: H5 R) v% ` x$ c
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); & Q% r/ A& \- e% g" c
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
) J, t& _- I s% @5 j0x00, 0xFF);- ~1 q% R' w1 p% P+ }
' T" A7 Z6 Y6 P& U, Z/ T6 G
/* Enable synchronization of RX and TX sections */ ; c$ U! c7 s" B" Z8 Y
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
# f' u. E" u' y+ p* sMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);! u" F5 j! z/ l+ v
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
6 ]: K! @! r' E+ Q** Set the serializers, Currently only one serializer is set as6 ^$ S" X% f4 [$ S4 E# V% w( k, p
** transmitter and one serializer as receiver.
- j4 P0 Q6 s+ b/ s*/
) ]. H( d! q, Y0 }1 J1 B3 F+ V5 ZMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);- w6 L, N7 t4 L% M! W
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*3 C/ P; |7 L) P6 d& R1 k) D
** Configure the McASP pins + F) \2 O4 _( s- s
** Input - Frame Sync, Clock and Serializer Rx
* `+ o" O4 |: q) l6 v8 g& q- p** Output - Serializer Tx is connected to the input of the codec
' _4 i( J$ f$ P! T1 V*/8 Q7 u9 k# u% A9 v. d' n; M
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);1 x1 j+ E: h9 Z0 u
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
8 K! |* [" v9 V, V$ AMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
7 ?- m% [! K' o6 p! \* C9 d| MCASP_PIN_ACLKX1 Q1 F4 U# y% F8 e
| MCASP_PIN_AHCLKX
: m2 \& D/ N# Z O/ L4 v| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
$ `2 z' N2 y& D. l) U9 z [4 tMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
1 V" G/ R' d! E+ ^2 i! t| MCASP_TX_CLKFAIL
! k3 k0 _) @- F& b* k! h| MCASP_TX_SYNCERROR$ R% ^& h9 f- C- }/ T5 X
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
) B; ~9 X+ O% `9 T! C0 J| MCASP_RX_CLKFAIL
3 m, J) C' S5 e5 H# |% u| MCASP_RX_SYNCERROR ) f+ j8 p7 t4 E
| MCASP_RX_OVERRUN);9 m) }2 l) A& |% |
} static void I2SDataTxRxActivate(void). w& V$ w% | o, `) z: w" J
{
0 T5 T6 G6 @' m# A0 _0 H. w/* Start the clocks */
7 K4 E: z+ ^% s7 S/ D* NMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);8 t t& y3 J7 w% w* L' H" o c) q. y& Y
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */8 {1 c( O p' @$ l' m9 d
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
+ |) R! e! R8 M, P0 H. q' _EDMA3_TRIG_MODE_EVENT);
* {! x2 |% A: ~0 G5 P( ], ZEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, : n/ S6 V9 s( @% u# |9 n! I
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */2 Y) Z6 H+ p6 v! P- X1 Y6 F) ~
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
* T0 q( h1 ^ H! r4 OMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */8 X6 _$ ^8 D Q/ P
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
7 Z+ d. F2 _2 t' T4 G( K7 VMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);. M' `9 t+ [ _1 `
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
6 ^ T- S* D( C5 ?}
7 w; _3 o7 r9 a/ E请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. ! |/ C' F, T7 g- i0 D
|