|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
. P5 f9 _* G; q; X$ ninput mcasp_ahclkx,
. a g# q2 C( g% C7 uinput mcasp_aclkx,& Y0 G0 Y4 x, z* e6 r* U
input axr0,/ l- Y: J% Q, s4 W
1 Y z5 A9 V% Q: routput mcasp_afsr,' V9 v% I6 e/ m; l( |; z; L& D
output mcasp_ahclkr,
* I& q% t g2 A" d+ houtput mcasp_aclkr,% Q: ^4 q( ^3 q. U
output axr1,
' W9 O* |/ R6 A* J" } assign mcasp_afsr = mcasp_afsx;
/ l* o& O7 g- U7 c5 ~( \8 H) Tassign mcasp_aclkr = mcasp_aclkx;/ f$ @% }5 U4 q4 ]1 a
assign mcasp_ahclkr = mcasp_ahclkx;* n4 x8 O9 p# O5 v% S3 T
assign axr1 = axr0; ) a3 h/ s- ^3 V2 \
/ ~! A9 w9 m% c% n( f& T6 o在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 , n, U6 l8 t& l! q6 L3 J# f
static void McASPI2SConfigure(void)
% S; P1 q+ b& I' y! Q c& B* L{
' [9 |4 k& a4 ?' ]) f* kMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
0 E) q5 B; j4 x1 yMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
) z: D! G, b* tMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);$ |) c! E7 b! B, i9 M
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */$ I7 w2 ~% u7 u( T2 i2 b- r
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,* m0 A# a9 L7 s% J4 J5 V$ G' p d! q
MCASP_RX_MODE_DMA);
_5 g4 o r6 _3 {3 {6 [0 CMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,% u z' v1 a* w3 l0 i2 w( }( E
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */1 @- _" n6 M$ k. H# \/ U
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
. O. W# ~$ s" K0 f# `' EMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
( `& h8 X( R9 R5 uMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, 4 t% W% B F1 V# h# t
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
; A7 T3 E$ b$ u3 wMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
6 q, d0 a9 F& hMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
# @% B j% }3 a- X/ yMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
2 O: L# }- N9 D7 ^0x00, 0xFF); /* configure the clock for transmitter */
9 D8 D5 Z+ \/ d3 [% b; TMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);: i8 @$ [5 H$ j7 t/ O) W- C: E. U
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); 9 o, L( S: {. U0 u0 S4 @# X+ Y
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,, D1 M" e" u |, r
0x00, 0xFF);
. {, p, _# a# O, O# g& R7 S/ C7 R4 J, I- |& w z/ e+ i) S$ W
/* Enable synchronization of RX and TX sections */
, C& n; o6 L1 |7 sMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
0 @% r+ |# ~% P4 H4 B2 [McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
, D1 B B, }% T0 y+ r/ _McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
8 A1 v6 J8 B( o2 j8 h) o** Set the serializers, Currently only one serializer is set as
% V* C f3 ]+ A& i** transmitter and one serializer as receiver.$ e( }, [, K. W7 n
*/
" T! D) L' y) H$ w LMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
8 K6 @- s5 W) G+ GMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
7 C8 }) H5 `$ J" [2 J: n** Configure the McASP pins % \3 F4 H2 D" r
** Input - Frame Sync, Clock and Serializer Rx' \! I( \' M6 a7 n9 o
** Output - Serializer Tx is connected to the input of the codec
. n' _3 V' p4 }*/. }2 c0 k* R! N; k1 A% v( p8 f# j9 N
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);" u4 ]' \1 x+ Q/ S
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
! E/ h# t& Z2 Z0 C8 y# d, VMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX( T8 B& v- Q) T3 ^
| MCASP_PIN_ACLKX
6 b/ i# }: j1 G7 d| MCASP_PIN_AHCLKX/ l! ?0 s! v/ [$ O/ s! n
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */; W( \5 u p+ x g+ j7 A6 k# S j; B6 C
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR 4 A( z# R( ?5 l6 S9 v, E$ z/ p
| MCASP_TX_CLKFAIL
' a# S4 a. t0 N' ?| MCASP_TX_SYNCERROR" {" S" T. v5 J
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR 7 S. S9 |3 s' K% D& X" f$ s' v
| MCASP_RX_CLKFAIL6 ^5 O6 f0 B% |( x2 m: q/ I: q
| MCASP_RX_SYNCERROR
( p* B/ b2 \; a3 X/ e' {1 I) H| MCASP_RX_OVERRUN);
7 z. P, W2 o& t} static void I2SDataTxRxActivate(void)% [; L* [; X; _8 l' h4 C
{: W9 n9 A! h. [+ d
/* Start the clocks */) z% y6 E& m7 R; V, m9 l8 T
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);" `1 d) M( U4 H
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */4 [ |5 N b$ Q) Q: G
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
F, _ P3 Z `1 h/ m8 EEDMA3_TRIG_MODE_EVENT);
8 N7 n) f7 @' G0 N( b/ [; ZEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
0 i' w1 D; _9 {! |EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */ N+ J3 ]! s6 D
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
7 v" y9 l( x, c! i+ S- HMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
/ {4 z E/ r9 r. x# l& ]. dwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
2 j- b) Q/ _ LMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);$ m+ ^" J. @9 q* X# q) ?
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
" f5 @. k/ E" A' O3 x8 S}
9 |7 m7 h" g7 ^请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
& F# b! r5 ]1 G; }5 F |