|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
0 f- ^: L. X3 d/ ^# f7 ?, ainput mcasp_ahclkx," e, h7 A( a4 `1 B
input mcasp_aclkx,7 t5 i, J+ T+ L+ R6 D
input axr0,: V5 |9 b2 M) J: [2 R& i
# q: O6 R! y. ^+ S# ^
output mcasp_afsr,8 O1 e/ j: Q. N. _! ^- k5 `! ~
output mcasp_ahclkr,9 y- T3 q5 A2 R: i- D1 b/ T
output mcasp_aclkr,
9 u$ W1 A T3 X) V1 K0 Aoutput axr1,8 N! w( Q# f: k \* ~/ x
assign mcasp_afsr = mcasp_afsx;6 i. `+ X: e2 [5 G* S$ F
assign mcasp_aclkr = mcasp_aclkx;
3 U& w# k R0 xassign mcasp_ahclkr = mcasp_ahclkx;) q8 c# Y1 L- z% B% s9 g
assign axr1 = axr0; 2 V& c* H- r9 d$ m1 ]
" |6 c- W9 @" O& l9 g- `) I9 C在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
' P9 S: i7 @; ystatic void McASPI2SConfigure(void)
6 _$ Y# Q. H8 o# [{
1 D9 g- k* x% L$ s: QMcASPRxReset(SOC_MCASP_0_CTRL_REGS);. D. y, T, y: y1 j3 [ g' u
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */( P8 q5 o0 ~( a
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);9 x; p C% h9 \2 L7 C
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
Q! L+ l! J2 MMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,% @) T4 L- [" o0 r3 H! `# `
MCASP_RX_MODE_DMA);
4 a2 C- [$ C/ J- m2 E! E: sMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
+ r c1 J- `% Y. g" tMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */0 ^6 q# S1 N% M* r6 f# z
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, 4 t2 F2 ^' i, }- C
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE); G- ^2 F2 v( Z+ g* d
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, 3 v4 x+ W. Y# k' |' j4 g
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */- s; N( i \& c! O& s; Y4 U# F" ]
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
2 A6 ^+ g- ~) x, P; k7 UMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); 9 g' d Z4 A0 z _
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,1 v+ y4 T' K# @' k2 O
0x00, 0xFF); /* configure the clock for transmitter */1 h# ?, Q5 Q5 j
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);( o1 f. }6 {" ^ p: u( O2 u# B
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
8 J% f/ _3 ]; m$ z+ m6 xMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,5 P P: Z# t9 Y$ P5 ?7 \
0x00, 0xFF);( i9 x8 l4 }' X' C2 m
# p7 C' }( J* F& H; L5 @" ?/* Enable synchronization of RX and TX sections */ K' H! t/ P1 {: O, m
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */* |0 l0 a& ~; U& e5 b
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
6 W1 z4 u) j- S, m' O* hMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*) T. s5 F/ ?& [. [( T ?
** Set the serializers, Currently only one serializer is set as
6 ]7 s& A& W% Z1 h0 j* v5 i" c** transmitter and one serializer as receiver.
/ [, d( b W0 }) t+ D- n*/5 n3 s! o8 I- C$ H7 i. P
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);! `1 Q8 v3 \; @0 Z8 L. i
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
7 W6 j3 M" _% J; M! _, q** Configure the McASP pins
) M# e2 y: t! B8 E** Input - Frame Sync, Clock and Serializer Rx6 N# j* I1 S2 F# S
** Output - Serializer Tx is connected to the input of the codec
7 C5 L4 H7 x( J) d- d6 p*/
" e7 e( ~* K+ |2 ^! q6 SMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
3 m& r* L- m- Z" K/ O4 f7 h6 d* CMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));! s$ S5 |( E ^3 j
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
! L G+ A; g3 G| MCASP_PIN_ACLKX6 O7 h' J, r7 p% E
| MCASP_PIN_AHCLKX
N$ s7 c" a$ @# ~: [4 h$ Z8 N# j| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
; ~0 F+ k3 E& K; W3 |; NMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
& j: \' D# d; P' x% m( K| MCASP_TX_CLKFAIL
0 C5 I4 b# o3 R3 z. I1 ^| MCASP_TX_SYNCERROR
$ S6 k3 h4 }" T g q) y3 _| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
+ r c3 S! B) h8 u| MCASP_RX_CLKFAIL8 h t, P1 T# u5 ^5 q P) u1 m
| MCASP_RX_SYNCERROR 3 G' e& y$ y" ^/ |9 S9 ]/ A: a* P
| MCASP_RX_OVERRUN);6 z) C: L/ R; \0 A, w
} static void I2SDataTxRxActivate(void)
: b) Z* [7 x, L/ ]9 P! @( v# f{
9 F9 K7 |' Q- K* j9 p5 q# E: [& ]/* Start the clocks */6 a7 {0 m: F0 l1 h! R
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL); \# s, Z: ?( K( C% d
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */4 C+ e$ d- v1 \/ ? W1 Z
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
" [ I2 s# I) B, q7 c: PEDMA3_TRIG_MODE_EVENT);* i' ?* D) E9 \( n" N
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
9 S) v$ t$ J7 }7 iEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
& h9 ^- b6 G/ s( e& O! IMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
( O# g9 |4 W6 X8 o) c9 e( _McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */# d0 Y" ?' B2 t( N- @* ^
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
/ T# t# P0 m; u3 M iMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);" t. m# n- A, S% v4 g: ~
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);( G1 }% L3 _2 H. K# r
} 5 p) H7 S, }" a7 A
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
5 Y& K/ K7 C+ f- S( f |