|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
# C& b4 B# ?) ]6 _, S8 z, F7 @4 Rinput mcasp_ahclkx,# t- u1 Y# o* O5 _3 c* c0 o
input mcasp_aclkx, Y$ } n4 U( b; H2 b$ B9 d7 V
input axr0,
3 h1 ?! [3 B6 N8 |$ W3 \! S& ]' _) J4 p; }9 `& E. x
output mcasp_afsr," E, g! }" Q8 O* w' P
output mcasp_ahclkr,
% o7 b5 v4 c& S0 `! E# N2 `3 q) Moutput mcasp_aclkr,
( D% ^0 ^7 _1 G! Xoutput axr1,7 y0 D% U0 g; Y! r# C$ }
assign mcasp_afsr = mcasp_afsx;. K l) T: L6 t7 K! {
assign mcasp_aclkr = mcasp_aclkx;* a$ _+ _! w) s. ?; `& }- A
assign mcasp_ahclkr = mcasp_ahclkx;. W) f! G( C/ h# r5 ]$ w# ^
assign axr1 = axr0;
2 ~! V2 I$ J/ O) S8 T) b9 g) g& S+ T& X! G! j6 g* {# _+ l
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 1 g! i/ \ d8 o) V
static void McASPI2SConfigure(void), {# i5 |/ i D' H8 i5 L
{
% U; i, L/ s- E2 ]McASPRxReset(SOC_MCASP_0_CTRL_REGS);' [9 w' D2 }, k, m- p/ h h
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
" a# w5 X& d8 S7 c. h4 x) KMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);# n- H. W6 p+ y- I
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */2 O' r4 k" _7 w A# y' v5 t
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
# N) B6 A/ b, yMCASP_RX_MODE_DMA);
& ^1 g0 E' ]. p+ Y4 N. hMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,: @6 `( v/ u- e* o% u/ A, @4 y: H+ N
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */' f9 k2 m. p6 T1 g" }
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, 5 t, V' s: [6 A$ a5 ^" W* B5 ?1 O
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);; q7 p3 i6 E) L+ ^) U7 V
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
: K/ ]/ B% O9 z U1 NMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */* L D( H8 g6 y
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
) c- d8 j6 X2 y/ R* v+ b gMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
6 ~- P, m0 H8 K% a) {7 KMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
# L5 P7 x/ y) q; M% t9 l+ c0x00, 0xFF); /* configure the clock for transmitter */2 v- w& \6 F7 \( j- {* d" a6 n, O
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);1 v% Z: T, o8 D( C$ d; e
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
o, ^" I1 b: o' C/ I4 g* {. Q; [McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,: l. i: x/ S5 x
0x00, 0xFF);
. L7 ]% \$ g( l/ K; g9 F1 j" R3 O8 y8 U, e
/* Enable synchronization of RX and TX sections */ ' @; \+ D f& n3 i& [9 Y
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */7 o9 A5 o: X- x7 U; O/ L
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
# L. o* c6 }% g8 K' lMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
. q1 S* B; m' X: ~7 [** Set the serializers, Currently only one serializer is set as
/ ~/ Y" f/ a" X. u, x! ?7 I A" F* X5 r** transmitter and one serializer as receiver.
; u u6 D5 M2 Y3 r4 `3 P1 a*/; ~7 u( c2 U$ b( E9 @* A; m5 t
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
; P# t9 v1 A" ^* A/ `$ rMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*; [0 p6 I+ j. C! e3 B; L" p: r
** Configure the McASP pins
/ h) j+ `. g# Y1 [$ M$ a# }** Input - Frame Sync, Clock and Serializer Rx
2 U! K0 D) R: r$ ^: J** Output - Serializer Tx is connected to the input of the codec , a! X& K8 h6 }3 ?; R
*/
$ }9 L2 I D9 `0 a1 a. Z5 DMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);! [, m' u6 \! T" l g6 u
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
: q/ ^' \# m( n- t2 w; |. oMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
! R* j( w1 h2 n1 n B) I/ h! Y| MCASP_PIN_ACLKX, J, Y. `+ x5 | w) H5 q% M! {
| MCASP_PIN_AHCLKX3 N# F% X8 ~* d0 i
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */5 T( e: A0 m0 e8 S2 ~6 g1 n
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
" D6 {$ D' T- G* b* ?% C1 R| MCASP_TX_CLKFAIL
6 ?+ d' Y$ h. d5 w# O| MCASP_TX_SYNCERROR. h2 ]: E7 g/ p o
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR $ q- L4 ^. [7 ]. [8 p
| MCASP_RX_CLKFAIL
9 N g* B- G4 t+ e| MCASP_RX_SYNCERROR : ^+ |8 D3 n6 b! O7 Z6 s
| MCASP_RX_OVERRUN);
! J% q5 a# o8 e B} static void I2SDataTxRxActivate(void)
1 Q/ N0 k' j8 ~# D{ a. h7 a9 g; o* f5 }: k
/* Start the clocks *// L6 e/ W j; `# I8 ~1 j+ A( `( i) v5 S
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);, [5 k! G: m+ v, {4 o+ ^! B' C @
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
! k1 Z% S7 y B; U1 \* X0 JEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
5 K. S! e4 G* B$ T) |# rEDMA3_TRIG_MODE_EVENT);
2 d, v- u2 `0 }% w3 PEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
3 W3 j# n k; [* u7 YEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
/ h! A) W2 p \2 Q- t/ wMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
' _# j; D: f% PMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
. w# B' k* _9 @) D, ~' G, C6 ^while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */; d8 P) ^" F1 L ]+ Q
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
1 S6 L! U$ q5 O5 A* wMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);) [% c, N% s5 B7 f8 t, H
} # l5 v% o# m0 q0 p- D) S
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
- J$ u' c' I `! ~6 J |