|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,( T, H' U6 a# h- a
input mcasp_ahclkx,
0 i9 f0 c( w1 I; l3 g$ Y$ rinput mcasp_aclkx,
( ~1 L" c! {% y8 cinput axr0,
6 w, y5 A7 h# k! z9 M
5 o" e6 V, ~* Z- l& Eoutput mcasp_afsr,
3 X: A$ y0 E; k. [1 zoutput mcasp_ahclkr,8 [$ }4 D) _3 |" b
output mcasp_aclkr," r( x4 g! v! a
output axr1,
# X& {" Z/ B& t assign mcasp_afsr = mcasp_afsx;
( h- C3 \& s& N8 u1 {assign mcasp_aclkr = mcasp_aclkx;9 Q. Z9 n/ o+ t1 A, o- B
assign mcasp_ahclkr = mcasp_ahclkx;/ I6 n' X6 m* B
assign axr1 = axr0; + k A7 I8 O, A
* c) t$ h3 A1 }$ S在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 $ Y3 ~2 _" x$ a, x, t
static void McASPI2SConfigure(void)
L8 B d) F y& t% @$ N{ O' {# N/ w2 B: p# ^& J' {
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
. e+ l% v' q3 I7 W! `- C* }; kMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */$ ~# s# n" [9 V
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
, _" [7 P5 U9 x3 C) h* ?+ rMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
% i. \" O) K! L' fMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,6 S4 R4 f( w, [ J7 Q4 c0 J y1 J
MCASP_RX_MODE_DMA);
+ l: M8 s* |/ X6 `McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,+ l, L; h' j9 f% j( H" o
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
7 d6 t; c# A* t) G6 GMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, + A0 u' @+ H' Q( ]& q0 }- W7 B \! X1 h. R
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);! i. y+ R& E$ }0 E% _" B
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
0 q% y: H2 ?1 s" pMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */3 p1 K# P/ v" v3 }- k
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);6 H( a# _5 G6 z2 p- U
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); ; |1 V7 W4 N5 D1 ~1 [: b/ i3 H
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,( d$ |! o E/ y Y3 h+ s
0x00, 0xFF); /* configure the clock for transmitter */% J' L( B( S) ^ s. i$ R
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
$ h$ Y/ D$ u# N3 |6 b* i! r1 E& [McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
! m) w& ]+ B0 I0 |2 G& PMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
4 _) |/ c. u. @/ F4 W0x00, 0xFF);
$ B: c* Z7 {6 B! Y1 g) K7 j u) p/ z
& T ^- v6 a8 ]% f5 C+ {/* Enable synchronization of RX and TX sections */
9 x, C. L9 k" o0 OMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
0 x1 O% v' {3 \- }McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);9 j+ }* g# M( F5 _
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*7 G( A7 r) \$ E4 z7 j4 ~0 Y
** Set the serializers, Currently only one serializer is set as; i1 a/ {- _3 u. a8 R
** transmitter and one serializer as receiver.
: @* j& S7 B" g1 w% z*/
- g" |/ q9 }) c: S, Q3 p! jMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);7 `/ L" k% w- k2 S
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
( k ?) \" ~2 @** Configure the McASP pins : `* Y8 h6 J: d+ n6 c; L
** Input - Frame Sync, Clock and Serializer Rx
! T+ C5 ?5 S) \7 [- U; g& T. ~/ D** Output - Serializer Tx is connected to the input of the codec 1 R+ A) H: L: C; I* n k( a
*/
4 i: `# x: r/ f" k& A2 g/ vMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
4 V0 G, R! G5 U% ]McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
$ h+ V0 t$ _* D3 ~3 J! c9 I; oMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
. X( D$ `# P7 L: a, e5 e| MCASP_PIN_ACLKX
% q& H! U0 ^' n7 j. f# }7 d| MCASP_PIN_AHCLKX
6 Y! _0 w( G3 `. T1 `5 J| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */" ]% {* s7 c5 J2 I
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
7 y) x+ `2 W \& f; B; Z7 o| MCASP_TX_CLKFAIL
u, t' w, j1 A& G! z j| MCASP_TX_SYNCERROR
9 g% e( l, G4 A+ ~| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR 3 A6 f8 f# J+ a* g
| MCASP_RX_CLKFAIL
4 b2 z1 t4 l5 A' W, \( P. d| MCASP_RX_SYNCERROR 0 i5 p# b4 K) A H+ y3 @
| MCASP_RX_OVERRUN);, F' I! s; h& |" y
} static void I2SDataTxRxActivate(void)* U2 o) k3 K! P1 F
{
* ^* t/ l E3 H/* Start the clocks */
; x: ?: q5 d$ {5 Z$ s4 PMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);, I$ X; P! m4 ?( u* |( F" a
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */8 i; W/ M+ M5 p7 X7 N
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,, {& D" r5 ?6 C
EDMA3_TRIG_MODE_EVENT);: f/ p3 F! B$ c' w4 [4 l! k1 @
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, 4 B3 `' O4 m/ ^
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
& \: d2 j7 J8 I4 R+ a4 yMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
|7 K( Q$ P/ w+ k$ b3 eMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */0 h8 y) W; I8 ?! l! z8 b
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */. f- G/ |' W: U5 z, G
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
& s/ y, n0 W0 v9 M0 o+ ?$ w4 r! v& }% yMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);
3 B) L$ {% o: C3 J# S# }5 R}
8 m. D# u9 z1 j请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. * O5 T5 T, e' w! o0 l
|