|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
0 b& x7 o. |" m# y8 Z3 I, zinput mcasp_ahclkx,7 d# b6 W& \) b& v- `) c
input mcasp_aclkx,
1 w8 v4 y% s2 k, h$ X1 y! G, M/ Iinput axr0,' {) D9 [/ A; \3 B6 c1 H' B3 L
7 Y, R' Z# q* v' E' N/ j+ P1 y7 g! i
output mcasp_afsr,3 z0 [0 J0 k8 a6 |; Y9 q: {4 E
output mcasp_ahclkr,
( w, y7 O8 f% Loutput mcasp_aclkr,/ B2 E- P; Q; @0 B
output axr1,1 t' l, X3 ` F; n1 `1 C5 d
assign mcasp_afsr = mcasp_afsx;
2 H% B5 D) t7 P/ I- f% Jassign mcasp_aclkr = mcasp_aclkx;
- ]4 U1 r$ Y1 ?4 M9 aassign mcasp_ahclkr = mcasp_ahclkx;3 {- Y& U) a" W: x: B8 W
assign axr1 = axr0; 7 @* t9 D( Q0 |
' b1 ~) k; o. ?5 I
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
: d& A7 H# q, i/ ~, t# v) R' xstatic void McASPI2SConfigure(void)' Z: q+ M! W; i! H& q! J: j- H. U
{4 O0 U" |: {& J9 _
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
; F ~$ K6 F XMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer *// h6 X2 O y Y% h
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);8 {. T X! a6 q) f) G
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */4 s) k+ C$ E! r3 c
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
8 J+ C$ p2 E5 g7 }: G2 e ]# uMCASP_RX_MODE_DMA);
2 Y2 B% ?6 s6 H& ?! S3 @( bMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
S U0 l! A& J( B9 Q+ k. qMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
3 m6 G% \! s/ }# }! bMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
% w: C" S' V: H. i1 j9 pMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
9 R! B' s3 D' [McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
k( X! U# W; ^* E# x8 o) F$ I! dMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
& ^ M, e4 K/ |0 y" _; yMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);) J9 L b( v" R) m( V- W( a
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); , F8 X7 P( Z( e, R
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,9 G0 i, |. H9 |! p7 w3 b
0x00, 0xFF); /* configure the clock for transmitter */
' A" H% `6 p+ `& vMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);4 t- G2 {7 h) o; ^
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); ) ~5 z1 d4 U" `
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
' I4 R( G( D7 t; D5 o! k0x00, 0xFF);
0 E# O, ^/ O' ~4 \! R- h G
* a/ s% g) N5 j$ e1 r/* Enable synchronization of RX and TX sections */ 1 {) p) n+ S. n& E. E! J
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */+ w7 \% t8 I$ r. b
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
: E! i4 E' C, ~( v1 Q6 M0 LMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /* V; Z, ^ m) ~
** Set the serializers, Currently only one serializer is set as) S: o+ f K' \/ i/ a( z
** transmitter and one serializer as receiver.
' m+ E+ k( u* @( Q# R$ O*/# Y; \% k+ x* w; |' e2 J+ t
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX); t& c' p2 d7 ~2 |1 }6 A$ D' T' k: K
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*. x$ }* p& e2 M1 A( v; j
** Configure the McASP pins
: ^; x2 Q, C1 t& Q3 c7 C2 l** Input - Frame Sync, Clock and Serializer Rx
! w' ?+ k3 ]& E' y- R) Q# c7 V** Output - Serializer Tx is connected to the input of the codec
$ E2 R5 _ ~% Q6 j" K: t" Y2 ~0 d*/& P, P$ Y7 }- X% r
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
, _0 j; c! d Q0 I8 r; f0 J4 OMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
0 y# P- X% O3 v8 h' F+ p: ]* S/ d. eMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
# E( q+ ~( l- |6 r9 S4 O4 ]; s| MCASP_PIN_ACLKX/ \ r) T: q( t( s$ |8 x: ~2 {" w5 b
| MCASP_PIN_AHCLKX
& n' u3 }& {* x4 u5 c2 p| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */3 a$ J2 x; H( }
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR 9 i3 c3 w8 Y N; B5 e( @
| MCASP_TX_CLKFAIL . A& P3 v& H! q" P8 Y- K
| MCASP_TX_SYNCERROR
8 _1 r V! C/ l* ^| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR 3 w% S2 U2 l- N
| MCASP_RX_CLKFAIL7 \+ O5 _; l7 ]8 q
| MCASP_RX_SYNCERROR " G/ u4 X: {# U2 E6 Y e d
| MCASP_RX_OVERRUN);
7 B# G. m' r& s0 A2 I8 k* J* O} static void I2SDataTxRxActivate(void)" g3 W2 H6 N8 G" W8 g( p) I0 S* _. ^
{
( K* [. h/ C% q2 u1 ~' E4 H/* Start the clocks */
- ?5 Z/ i" i/ HMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
( v0 C/ i: A7 s/ X _9 ^3 X cMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */* |, r; Z. i O/ n$ j$ v
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
. ]+ i1 d+ E' MEDMA3_TRIG_MODE_EVENT);) z7 n; {$ p- Y& }0 m5 K6 g' T
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, ( S0 d" T( ?. a: A
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */+ {1 m# t. y( N# q1 ~
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
+ w8 t1 ~8 H p' q( j$ kMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
# a3 f+ }5 M2 lwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
+ J, v! ~2 s0 o5 Z) v( i# H7 kMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);9 y( h6 n: C4 v. y3 k* ]2 w
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);' b* |) _6 ^& B( e0 [, V
} - G+ \4 E7 F. W% o. ]; r
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
- Z$ }1 N9 P( B6 S) @) U. } |