|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
$ d- z- n+ ]- ]0 V9 \ Ginput mcasp_ahclkx,
5 r9 k2 \$ f! M: b" ]input mcasp_aclkx,
, W" Q/ A1 a3 D+ `2 C' L U' dinput axr0,
4 f. s/ a$ j! D1 F7 b5 X" `+ Y7 [& z2 k% c, e! T
output mcasp_afsr,3 ?8 T1 Q. N, z$ w, x+ B" ?
output mcasp_ahclkr,1 @- F, o4 A' f7 Q, S
output mcasp_aclkr,. @, Y; R4 E) H, w) {: T) M
output axr1,( V, j* b9 A7 S+ {$ ^; j m4 B d
assign mcasp_afsr = mcasp_afsx;
. K3 o$ n' t& a5 Cassign mcasp_aclkr = mcasp_aclkx;, O/ o3 K2 m c, k! W
assign mcasp_ahclkr = mcasp_ahclkx;
3 c5 j. B# f8 hassign axr1 = axr0; " }' d! x+ N" e2 V1 [
0 f7 k, Q( J8 T. S+ [. N& s
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 3 x# G# {! d1 T
static void McASPI2SConfigure(void)0 r7 R0 s/ b4 F; L9 q, |2 h
{; p) s- N; F* r& }3 l& k! U, S1 B
McASPRxReset(SOC_MCASP_0_CTRL_REGS);" B/ f& ^& F2 N9 J+ C
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
0 L* x/ n- K4 c5 ?; B* y- c+ fMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/ U% [3 I7 W5 H# p6 vMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
, ~- M" U" R p4 }7 h( w4 _McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
/ {. p+ E+ v0 F4 e pMCASP_RX_MODE_DMA);
. A6 @5 r' z0 ?! w6 hMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
7 X. J4 o8 m7 d0 Y; `0 t2 FMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
* t* c" a6 d% C) oMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
9 j$ S0 N* A0 r, _ V& NMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);: v x# X0 { R) F) \
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
0 x# @+ u4 s/ g& F# ?. O2 j8 PMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */# _; P% O b2 Z% R1 `* S) a" r
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);/ a) Y, \2 I7 b
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); + {- d* T. u2 z! f, X9 Q& `# c# k! M
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
! |6 v& Z2 Y+ J- ^0x00, 0xFF); /* configure the clock for transmitter */6 I: i; q4 |& ]1 A# m7 Q
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);% ^: r' a% q1 ^/ `7 P; @
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
' C. f9 P" r% Z1 B% }& DMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,: a2 M& L2 @" R! A& ]
0x00, 0xFF);
) q8 U O$ y/ y3 P- ? V* B$ r+ Q' c2 k
/* Enable synchronization of RX and TX sections */ ! N8 |( D; ^1 p0 I' O
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
, T; u6 ~5 K6 r9 O" `4 A4 ~ o9 Y; pMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
. M) Y& c6 W: z8 D- P7 G/ BMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /** `" h$ D" |0 S# L1 M
** Set the serializers, Currently only one serializer is set as- E( p/ ?6 D$ h: l: r& r, F
** transmitter and one serializer as receiver.
" \# [) `, u8 i6 ?# a' t*/( u1 t1 F. O+ _/ ^1 ?; S
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);: m3 ~& e& c. j$ d U
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*6 e$ ^5 t* a+ U! ~
** Configure the McASP pins
/ F% ?1 d. B6 O5 u; p' K" @5 }** Input - Frame Sync, Clock and Serializer Rx% \: l8 }, q/ M( `* R
** Output - Serializer Tx is connected to the input of the codec , s4 S* c' r# X8 w
*/
n5 j b# ^& vMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);9 U" X' h2 D4 p. b% H
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
0 r$ _) s1 c1 q* l, W+ P% F" s" I" GMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
& N. j8 f0 y$ b| MCASP_PIN_ACLKX
8 g5 j! ^8 k( E) n* i| MCASP_PIN_AHCLKX$ o1 ]7 J+ f/ d E+ Y% E) o
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
# _! |3 |1 D$ qMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
$ o0 n$ R8 G2 ^| MCASP_TX_CLKFAIL " z$ z# G: s+ G5 K4 N% M M
| MCASP_TX_SYNCERROR6 j r1 X8 f" [ ^" j. s+ ^" _
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
0 R: |+ L' E+ |8 |3 j4 T5 } R& i| MCASP_RX_CLKFAIL
' A. O, {: a1 H i) z3 z| MCASP_RX_SYNCERROR
D8 C ^8 ]% q5 K$ ~ @! a| MCASP_RX_OVERRUN);
( E: b5 C: B# s# z0 M& v! o, \} static void I2SDataTxRxActivate(void)
; a: e. f: l6 H8 G{
' ?) [! B8 }( q7 U- X9 `/* Start the clocks */
* Q% z4 t) m3 J$ G+ z$ Z8 x5 P) DMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
# d3 m7 a$ p! V/ I9 HMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
1 }- r) O" h2 ^) K- KEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,, O4 \- v7 A5 b0 K ~2 G
EDMA3_TRIG_MODE_EVENT);- q8 F: V! A4 q/ a. c" @+ t
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, ! C( Q! e( I! D9 z4 o
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
1 f& p+ W% P9 o8 n6 `0 f; r( fMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS); E6 F0 E4 m8 G3 z8 L! v
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
$ ~- X, S. L8 a, y1 Y5 A3 M( qwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */: v& V) C' m, k2 y
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);) H% t) ?( \ E S; s, P
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);9 O( ?# A/ x0 w0 m, p( o1 c4 o
}
& G+ G: O: Y* s' W5 l+ h6 ?$ T, t请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. 0 s# f# b1 `6 J! C
|