|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
( s* Q0 B( \' E# I1 i+ v6 k1 [input mcasp_ahclkx,
: B) g) i- z9 P$ |+ m% Kinput mcasp_aclkx,
% a+ R. n( _+ C- p4 Uinput axr0,. y4 ?4 a5 ^! P6 R/ @! F
# K, L" x" _+ _+ t/ [7 U8 u: ^
output mcasp_afsr,/ w8 E! Z) R4 X. e$ ?
output mcasp_ahclkr,: r, E+ G$ O# x
output mcasp_aclkr,
. [ g. p' \5 Z: k- V! t# @0 ?* U0 ^$ Foutput axr1,
# B' q! y) V! a1 v7 D0 e assign mcasp_afsr = mcasp_afsx;# S+ c6 f9 J3 [0 H6 }- t
assign mcasp_aclkr = mcasp_aclkx;( ~2 ~ ^! P7 {/ s
assign mcasp_ahclkr = mcasp_ahclkx;4 y; K }" |# Q( X1 n' z9 K
assign axr1 = axr0;
3 C6 Q9 q' ?7 t% `4 P2 L6 Q
! ]. T* x" O4 [9 K. G3 @( p在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
/ v* {5 [" z: n7 A: l. N Istatic void McASPI2SConfigure(void)
) H) `7 R8 S2 O. n2 A{
1 w% B3 C$ e, }8 m* PMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
) {6 `; ]+ e4 p4 AMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
8 |7 |$ y* C j9 Y' n, K, ^* {) |- rMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);" q7 Y( ], U" p0 s2 e$ S
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */9 x' S0 L' s& J, k
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,7 R7 S7 X+ h0 V( ?4 Q( ~0 Z5 @& s
MCASP_RX_MODE_DMA);. |- I2 V/ B; \ y7 w" X$ C2 t9 N0 V3 O' [
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
: S, I( X2 p1 m, U0 w$ `MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */; F0 n0 q; ]6 a* j1 r4 m
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
$ H* a4 z, r8 Q( y5 C5 mMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);7 F# ? f; P; B& b$ O0 ~' ^
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, 0 A1 _, u4 ~6 d8 X; F. B4 I" V
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver *// t4 g" B3 {6 i: w/ r% o# G
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
2 \ E. e5 ~! `) LMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); : H; Q! r3 b8 I( u. W
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
$ Q0 J$ D) u' V% C2 G0x00, 0xFF); /* configure the clock for transmitter */0 Y# e& _$ i7 R3 T" i
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
; s- P3 i# r; s1 ~* U9 A) P/ @9 p) A' SMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); 5 C+ d4 d. ^1 ~5 ]2 A
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,+ I; J3 R) a3 j J
0x00, 0xFF);
( t+ p9 t ^$ I7 i$ }
$ W" E3 Y/ r2 N/* Enable synchronization of RX and TX sections */
4 a! E- p5 f7 i$ _* O! }McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */- B0 z; p8 A6 y* S; L, O$ _# e
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
( j2 g! K. f: \7 N! p$ TMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*, V* o! D9 y, T9 C. y/ X0 s
** Set the serializers, Currently only one serializer is set as, c) ~9 Z0 z% G" G2 L3 Z. o
** transmitter and one serializer as receiver.. O" F( R+ E4 V. Q" T
*/. m. v4 r' z1 P) u
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);6 r& _5 u: \ O2 s; E! @
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
: `% P' }! |" G! |) P** Configure the McASP pins
: x- G: O# c& L5 R: r. J8 X** Input - Frame Sync, Clock and Serializer Rx# I$ E: L" N/ \+ ?
** Output - Serializer Tx is connected to the input of the codec
3 O, O1 z$ M' e. A*/
% _4 b' M: \" ]1 eMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
/ }$ [' Z1 T* b/ aMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
- P% A; s1 `8 ^/ y5 Q& c% hMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX3 I# t" w: F- C. d2 t
| MCASP_PIN_ACLKX
: `, h" {1 e3 P6 Q7 j6 B" ^5 _| MCASP_PIN_AHCLKX5 ^" e7 U) q1 e& F5 j; k4 t
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */ W* s# w0 u; d$ S
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
3 K( ~* L' O( t4 p: h( c; h| MCASP_TX_CLKFAIL ! x3 Y1 ~2 j+ N$ {8 @2 |
| MCASP_TX_SYNCERROR
5 Y8 q3 I# g" {9 h. z| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR 3 t- v# e* A# S+ D
| MCASP_RX_CLKFAIL+ G) G: i3 k; q8 Y
| MCASP_RX_SYNCERROR 4 [: P. ?0 A1 e7 ?* y! ]
| MCASP_RX_OVERRUN); n+ P( e4 O, u5 v# D
} static void I2SDataTxRxActivate(void)
2 V, p" d! P: j3 o8 G1 n{6 j% {+ U2 p9 C0 k; i2 j5 Y U
/* Start the clocks */
* D3 d5 ~, N7 B' ]McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL); [% ~$ r6 L$ j- P, R0 M5 F9 N" o$ I( q
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
: w. A, y; C3 X7 G/ ]EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,# f- ]8 r4 {& Y- P
EDMA3_TRIG_MODE_EVENT);8 F4 F) k0 N3 g2 _! p" j
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, . p. f# ]% l. Z$ W
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
+ y0 u, r" p+ [8 r Z$ L( ]McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);- P! ~: M% o* {$ y7 o, u; r9 N
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
1 T6 A* z; q0 F* [ Qwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
, p) y* j$ W* R; S- @8 CMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);; l+ T, { V p1 H
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);$ m2 u$ L3 b9 Q7 m. t2 S5 U3 x4 ?" `& [
}
. x0 V1 p5 Y# V4 Q* H& b4 v请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. 8 x* T1 Z0 i, z- s9 c
|