|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
& {+ X# V" N: }6 |2 e1 m& j& u/ ^' sinput mcasp_ahclkx,- R4 Y7 [! l1 _9 e# j* y
input mcasp_aclkx,
, g+ N4 @/ B' A% }, U) Iinput axr0,
# b, V4 J& ~; T$ X1 g, {, z0 ^0 ~; K4 Y8 C5 x; u
output mcasp_afsr,
1 H, |; B' F! q1 d# Qoutput mcasp_ahclkr,( C3 H; j, z D2 [" V
output mcasp_aclkr,
- r+ J1 F) ?* G. C) qoutput axr1,7 x r% J8 j7 Z1 J
assign mcasp_afsr = mcasp_afsx;3 Y4 S; [% u1 c7 L# ^! Q8 X8 o
assign mcasp_aclkr = mcasp_aclkx;
) a1 B% C' R* E: oassign mcasp_ahclkr = mcasp_ahclkx;' |5 J* s8 h2 D' h! G7 A
assign axr1 = axr0;
- N! L O1 l6 g& d5 G, s! g$ P9 |& K
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
7 @. H( n5 w; l/ x1 W% D3 S, K! s/ }static void McASPI2SConfigure(void)! K5 [- _7 o, {5 M/ u+ {
{
' n% ~+ X" S1 H* P0 e7 DMcASPRxReset(SOC_MCASP_0_CTRL_REGS);3 E8 y' W6 D' n, W: i
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
6 V7 A1 w' S3 q" kMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);. O/ p/ Y& n, Z0 Q
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
; U! X) Q/ m: a1 ?" n( dMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,) r9 ^& Q! f! w" l9 Z, u7 \# N. @
MCASP_RX_MODE_DMA);
: j- [% O9 R8 @! B6 j/ |McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,& t( e! k1 M* x/ N3 c* G
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
& |' p" M" S% Q/ qMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
/ `% C0 }( f+ R- mMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE); t; r# M; {* }
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
" m8 u% x: [4 c0 ^1 k: s. a9 ^5 |& qMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */) V$ ~' t) j7 i5 a& m
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
* N8 |$ S7 z/ Z5 G* DMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); . h) |9 ?9 l0 [! P5 O3 R# e
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
1 R# p \6 Z+ U$ X$ p( g6 x0x00, 0xFF); /* configure the clock for transmitter */
3 e* I) a3 V$ |9 @) A* t5 A5 g: PMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);" ~* E- R0 A2 c
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
K4 _" z& }1 F; jMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
# m( j& W5 n# ]/ r4 h% F5 X _0x00, 0xFF);( ^6 T# \( F, T- E; z5 W q
$ x5 q* \, r1 t- i0 q3 S* f/* Enable synchronization of RX and TX sections */
5 s: \" [/ \! Y$ s, kMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
: U( H% t0 v {( @. jMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);) l! l5 N' v( e3 o9 f7 @) Y3 B# H
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
2 c3 ]5 L0 h0 y** Set the serializers, Currently only one serializer is set as
3 ]! ^, l" R0 R** transmitter and one serializer as receiver.
: Q1 P3 s% a2 M. d$ k- y*/" X7 a& s/ v3 z+ n# B
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);1 D0 N) k( V- J' l( ?( {
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
) L7 |# v: `1 F** Configure the McASP pins
4 U0 X/ Q2 |3 e9 X- T$ F; p- T6 ^** Input - Frame Sync, Clock and Serializer Rx
4 j& b/ t* f# ~ Q** Output - Serializer Tx is connected to the input of the codec
: \6 e7 M: f0 v' f: w*/
4 v& R) U" i i7 l3 UMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);: G6 v" }! O) ^! M9 L, ]7 ?7 T
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
3 R* _8 }9 Q0 x: \+ ~McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX% b/ `$ _; n: u
| MCASP_PIN_ACLKX
4 a1 n5 ?& _8 z| MCASP_PIN_AHCLKX" m* x" Q# W+ e: Z% f
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */. a1 T! Y5 `; ?
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
3 {. ]6 I: U! A: e" W1 C| MCASP_TX_CLKFAIL + ^1 A6 L v; X
| MCASP_TX_SYNCERROR- k$ o8 G j, f4 r, T
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR ( b. l% D( j6 C( L4 v+ }& v# S
| MCASP_RX_CLKFAIL+ ^) C3 ?( V" x
| MCASP_RX_SYNCERROR - T0 k; Y/ \: J# H( `3 r% j
| MCASP_RX_OVERRUN);
$ s2 r7 x1 ?6 K5 U3 G) ~# \) j) Q" [} static void I2SDataTxRxActivate(void)' m+ M( R @5 m v7 G, z
{5 y) |0 s- p% e' U8 |' ]
/* Start the clocks */
, R `' P3 t% A; M. QMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);8 ]1 y+ P; N& @
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
. ~1 T, b9 N$ A1 IEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
1 E* |6 H4 c) Z( g) KEDMA3_TRIG_MODE_EVENT);
4 ]1 E3 @# `4 g9 UEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, + s& j+ {7 ~8 p- i) Z
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
- \8 J D6 v {5 x4 V* sMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);5 ~$ m3 E' a. j; R/ D
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */( o# `6 t ]6 p
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
0 A) O' v0 S. K2 N. f& {6 i, xMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);
* B( Z$ I9 ]0 p" xMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);
9 E4 K4 T) N3 P} ! u- a' [8 V( {
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. & a2 R1 n F# F& ]' V% k
|