|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,& D, B! j! L4 j# w% t0 I; l; T
input mcasp_ahclkx,. \" ~( Q, D: e3 J+ F9 m
input mcasp_aclkx,
# T, ?6 j e' {6 [8 U7 K& h: d& \- m L" kinput axr0,, V! F1 g4 s2 G# X' t: C7 M* X; D
. T5 X$ q ~- o0 Noutput mcasp_afsr,
. s) D" Z' x4 }' m+ routput mcasp_ahclkr,. G5 `) }) y8 Z. L. c
output mcasp_aclkr,- O3 U6 p1 R- [ g2 M: \2 Q- X
output axr1,
* }8 {# X0 `: E2 e* I$ ^7 D2 ] assign mcasp_afsr = mcasp_afsx;
( f; b; T& q0 ]7 R% P7 q8 h) @3 `assign mcasp_aclkr = mcasp_aclkx;
( z2 j% g7 y9 S; f7 F2 N$ _, i& A- m. ]: Zassign mcasp_ahclkr = mcasp_ahclkx;
$ _0 F" p, }7 A5 ?0 ?, T' rassign axr1 = axr0;
0 y1 S9 U+ [3 z4 @
/ b) v3 @8 U+ J I1 n$ k0 l" v在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
8 |3 i. _8 O8 q |1 qstatic void McASPI2SConfigure(void)
3 E% p4 j6 F; H$ I, J{8 Q5 E9 Z; D+ g! y9 S4 {; U2 A
McASPRxReset(SOC_MCASP_0_CTRL_REGS);: n- N% K) _# a' f, z* g
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer *// g: m5 { N& d8 o/ s
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);- c/ } l! P+ M d6 T$ j5 l. c/ `
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
+ p5 m+ z7 ]8 A4 u) Z& NMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
5 P; i0 D! `3 {3 N+ h) oMCASP_RX_MODE_DMA);$ [- ^6 a3 `/ Z6 A
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,* i8 ~9 a1 Y! X }/ j, f0 @, n+ @
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */0 Z; b ]0 [6 ` B% u: f
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
: i: A6 N0 M3 S; Q! v3 {: ^MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);* [) @/ ^5 r/ i- p
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, ' q, Y' V. q& ]3 D0 w
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */' s, |) V1 \0 }" ?
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
8 w1 f( e a9 D8 u. r' ]McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
n/ b8 B+ {% m5 }7 {0 T- pMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
4 {2 T* H5 \) g0x00, 0xFF); /* configure the clock for transmitter */
( g# N# F$ E$ |1 \McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);: m' ^9 d$ n6 @( n3 T
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); 8 X" J7 w2 a1 V
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
8 Z8 w1 K& q4 W6 w% M+ q9 g0 }0x00, 0xFF);
+ ]9 C& g+ z- n* k
4 A: V7 ^: L9 V/ z5 A1 n6 z+ r0 ?/* Enable synchronization of RX and TX sections */
* U0 P2 K- l9 H4 c& P" f: eMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */0 c+ A' R3 E1 i8 | x* q0 Z2 B0 o
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
: v0 E9 ~) r) ^5 U3 x# [: {4 qMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*1 R" M/ s( j' `) V: Y4 Y
** Set the serializers, Currently only one serializer is set as
+ v! j+ B' Y7 v- l( p7 {/ j8 h6 r' C** transmitter and one serializer as receiver.5 K* z* s6 _' k( f% G* N; N
*/ ~7 K3 k2 }$ {+ u8 j3 |6 H
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);0 z4 b% V' l2 i% O: I. M* m/ Q0 Z$ p$ ^
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
& V1 z# z6 z9 ~; k** Configure the McASP pins ; t$ `, h1 o& H* t* A
** Input - Frame Sync, Clock and Serializer Rx
, ~1 [1 C* F( `** Output - Serializer Tx is connected to the input of the codec 7 d. m# |- O* o0 R7 f1 ]) d
*/# u+ `. A$ w, }. o; o3 h- |: [
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
& g/ S7 j8 g4 M2 v3 }! W4 ?3 OMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
' k: k" n0 x# U! L, c KMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
# o* R$ Y! D$ |5 t) l| MCASP_PIN_ACLKX
: H$ u# }1 Z1 b| MCASP_PIN_AHCLKX
9 U' N' p9 \- b" u% e| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */4 r: k/ z. e' x) o
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
8 t+ Z P/ W; t5 @8 b1 F, |$ b| MCASP_TX_CLKFAIL
& |# x: C# {7 t| MCASP_TX_SYNCERROR' r" E/ O/ U/ |% }
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
) T8 @3 b6 J5 U| MCASP_RX_CLKFAIL
+ C7 V p5 p8 q& x) s| MCASP_RX_SYNCERROR % B& [$ o) \$ V1 Y" [! g* b
| MCASP_RX_OVERRUN);
* @/ t. i' w8 U. X0 x+ k} static void I2SDataTxRxActivate(void)
0 g6 G2 |$ z9 W& h8 P' U; U0 a{
- v) |# U! Y d J( K x: N/* Start the clocks */
5 O$ Y1 Q' d' J1 bMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
. O3 N% j: d2 _/ ^9 t# m! L" MMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */2 @, f2 S8 P4 l) K
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
) m* x' ^+ t2 M3 \$ T: R4 ]EDMA3_TRIG_MODE_EVENT);
" ?0 P/ w' w% |1 U. Q0 AEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, 7 ?. i% V0 @2 t( {7 I
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
5 s8 [' i4 z) I1 H* v) o2 mMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);/ v% n1 r' K; B5 W
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
4 j6 j3 Q3 {/ x& e/ g# m1 f5 D; P% Hwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */' x. Y& D1 @ e$ Q
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);. [" f3 R, R9 @) o+ B/ |$ D
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
' ~6 |7 F0 u9 j5 f}
' @% Z; }) \; K* `& D' Z; S请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
4 @& r+ Z' l, U3 U- t4 j |