|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,- g _3 ]1 f& W( P4 d& P
input mcasp_ahclkx,$ ~; o2 N; ?1 J( Y. M
input mcasp_aclkx,: l2 H, a" ~9 X# b
input axr0,
/ w# e9 @- t' l$ R. S7 [6 K9 J, v6 @! B2 }' ^$ V) w
output mcasp_afsr,) B5 i7 F' P1 E1 V6 [
output mcasp_ahclkr,
1 F% W V6 e2 ^% i& }output mcasp_aclkr,* p. B1 }' j5 |" B. l
output axr1,
9 s; J5 Q. z6 | assign mcasp_afsr = mcasp_afsx;# b. C. p6 P7 @' a
assign mcasp_aclkr = mcasp_aclkx;% N4 G' P- O7 a! W4 f& h$ \
assign mcasp_ahclkr = mcasp_ahclkx;% O) {7 ~2 O' r/ G2 E
assign axr1 = axr0;
" O* o- h n" I. d5 O; o+ V
% \4 u( q& Q+ b0 y+ D$ v2 X M; D在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
) a' f% O# `: y9 U1 Kstatic void McASPI2SConfigure(void)% \; C! G# R& G6 `+ w) [% G
{
+ W% f# Q- |; l3 E! z' UMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
; q, \4 F m3 }& E( Y7 Q& wMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */! ?1 o2 Y" j- p# E: |6 [; P5 J
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
; i# K% M. \2 BMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */# K* M; R$ D3 X# S6 J' X# E6 h
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE," Z q: X" O% j# l# |
MCASP_RX_MODE_DMA);# y- O7 ~7 G9 e8 {! e
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,3 V7 f0 }6 I o- Y: i
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
+ F# c# N4 l, t# F0 S, mMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
0 U+ D- d4 H' u% AMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);, @& o) P( v5 \
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, & R4 s& q/ K$ |: c
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */' } [, M/ e ^& R: {9 r; r) O
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);& G( Y) n: z2 C$ `2 U0 A3 c
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); , A4 i: V$ W M$ ]) Y# v
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
! R$ i5 C) D6 f- ~. ~2 f0 P8 M0x00, 0xFF); /* configure the clock for transmitter */
% m8 ~( k# _3 e7 P9 i. r, F/ ?. UMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
& \. z# K# |9 {, j6 N2 b8 N6 G* OMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); $ Y% M. F3 O4 O' O; A
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
$ f' f* y( \2 k& e1 M5 N0x00, 0xFF);
, X S$ U2 \0 M; v: `; i5 }1 e7 S# {
/* Enable synchronization of RX and TX sections */
& a& L% f+ _& K$ Y1 O, L8 J6 A4 sMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */- [! N; e6 w# H
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);' o$ f% M' b5 |+ C$ R+ N5 A) j
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
7 y2 e( f d( D% y** Set the serializers, Currently only one serializer is set as
- e7 N4 o* q9 F0 @** transmitter and one serializer as receiver.
1 I" t" }$ _4 U' V: X*/
$ v4 j/ e' j1 \, j1 G/ ~* tMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
# i$ S, F! E" H4 E% ]+ ]% P3 SMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*5 o8 Q2 o! c" c, ?5 w. t
** Configure the McASP pins
0 t3 H' t& R% p9 X* o5 E** Input - Frame Sync, Clock and Serializer Rx t( H9 H4 l, L# [6 s
** Output - Serializer Tx is connected to the input of the codec
/ A" q5 b! }+ m+ m* Z. M0 h*/% V) w B3 z$ t/ b/ ^
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
( S# ]7 c& U q2 y/ t" X) S& wMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));' D. Z3 F; V) D& Q8 L
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
" }* H8 Q; Y. J- U6 A# A: g| MCASP_PIN_ACLKX- p9 a _1 E5 o- Y3 z( }/ S' e
| MCASP_PIN_AHCLKX% N2 e9 h" `, |' C& N2 Y+ P8 _: X
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */5 a0 l0 G2 q5 [9 W- y4 V! }& X
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
: E, q+ j: F+ I" o$ j: m3 c| MCASP_TX_CLKFAIL ! _% z+ |3 g' s7 U7 h! O6 {
| MCASP_TX_SYNCERROR# t) u! C3 z9 y
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
9 h# _6 d+ s* G* F l2 e| MCASP_RX_CLKFAIL
( z; s& b- V( G6 G8 a2 G| MCASP_RX_SYNCERROR
/ @, G$ w% R9 T5 }, ~| MCASP_RX_OVERRUN);" j$ Q& j1 B# |
} static void I2SDataTxRxActivate(void)
) A* m) q8 ^! B) n- T {{
2 x7 \4 {8 U- B& G4 \0 O& [/* Start the clocks */
( K3 t# }/ \4 J. f, [2 V' K- j' Y6 dMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
0 }) e1 }! @6 G- C" }McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
! _9 d# ?! _- C% R ]EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,0 {. P! v+ B: |
EDMA3_TRIG_MODE_EVENT);
& _- f8 [& Q5 J* x$ L- P/ `( [, `EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, 7 _) S {, U4 V$ n+ p
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers *// L6 Z* Z. g" c
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
" @5 y7 j. m& U2 D4 I) dMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
9 i/ \7 H4 z3 Q7 ^% p) nwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */" c7 w% q# @ [0 u# }
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
- t: _1 {- E4 r. [; nMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);
8 m3 u8 ^7 V* y6 t% m% j}
" }; G# ]& d Y- H' y8 p0 Y请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. " f8 r* |8 E) b
|