|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
% B. h6 {5 e2 `+ E! E7 d Z4 C0 R; A9 Dinput mcasp_ahclkx,
) P& R3 I/ g' h3 |input mcasp_aclkx,
& | r! i9 C( w4 s# `% _, Oinput axr0,
9 R' J5 m9 r+ W: \: y# @* W. H5 w. q
output mcasp_afsr,: l9 T R% F: H
output mcasp_ahclkr,0 }' e& @/ K, `6 g( p# d* h0 Y
output mcasp_aclkr,1 m/ B+ U! A7 n4 Q/ v2 `+ j) ^' E8 b
output axr1,
8 g# n" m) V# f. ? assign mcasp_afsr = mcasp_afsx;
6 C! V: `8 J- i8 _0 k9 X. a4 vassign mcasp_aclkr = mcasp_aclkx;# L! g, p" n7 ~# I
assign mcasp_ahclkr = mcasp_ahclkx;
6 K% O7 [& a( Vassign axr1 = axr0;
( d2 }7 u( w; [% A; q6 j% k
. T7 @! ?3 U' O在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
5 R) G/ M6 X2 ~: ^3 b) k- t/ rstatic void McASPI2SConfigure(void)
+ n7 \+ C- y( V$ p/ `+ g8 `{
/ @5 l& S# z0 A' W3 I1 C3 L1 CMcASPRxReset(SOC_MCASP_0_CTRL_REGS);8 Q1 d6 |! T% h" W1 O+ ?5 Z9 X
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */1 q- ?7 z( ?" E8 X( F
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
! h0 {, y) j- t' W) C% dMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */2 |# `2 J: M: r! _8 y |
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
# @1 q# @! R: EMCASP_RX_MODE_DMA);. d9 Q7 b8 D$ V4 M
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
% i' Y6 ^- a, [3 u1 DMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
! n1 O8 e2 D, pMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
5 D; B* J: z$ [5 n; w% SMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
1 Y7 |4 P% G [McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
2 e- o- P, V q, IMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
- u$ l* q; E* LMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);3 V9 h5 L7 t3 x
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); & o9 |- W& d4 d/ p* T$ E! k
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,) g6 d: K% Z2 l, f0 P3 v7 h
0x00, 0xFF); /* configure the clock for transmitter */
- w1 A7 X, M$ b( C& x1 vMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);0 |3 ?2 X' j6 K. ^
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); 5 f+ g! F, r; g! x' d# h
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,- S' [/ Y0 I; J M" V7 ^% D$ K
0x00, 0xFF);
. k; Y' ]7 |: Z \4 p0 b& t) z! \) v5 O8 {; x; a, j1 B0 _9 M
/* Enable synchronization of RX and TX sections */
6 s$ ?, W% B; Z! o {* RMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */- N' N t/ }$ w* v( y3 b2 B
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);% e1 O9 \/ P; q
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
# H( A4 }9 |) |: I) V** Set the serializers, Currently only one serializer is set as6 I8 J3 o& S, l# C+ E5 Z: y) `
** transmitter and one serializer as receiver.
$ Q$ \/ M( g1 d' i: x, a*/
' E' E9 z. K% ]! E8 O5 ?6 U# OMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
$ R# S0 x% P0 MMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*& W* s* P0 Y& `+ y! f# k
** Configure the McASP pins ( y( ^1 o8 H2 I( X) f0 i
** Input - Frame Sync, Clock and Serializer Rx- X5 b% s, r/ \" k# N E
** Output - Serializer Tx is connected to the input of the codec ( }3 f% F, H7 m
*/+ p$ H1 k6 L0 j: c8 G# b
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
- s! g* o1 {7 \: [/ e9 w! hMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX)); B3 @4 _6 E' z
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
: k# C0 j! \$ ^) b7 l, z| MCASP_PIN_ACLKX! J4 {( C! }5 z$ R& }/ p
| MCASP_PIN_AHCLKX' O+ \! q3 F7 w
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
/ b* l/ |$ A% N5 W1 A4 aMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
6 D# i7 j9 h b3 x| MCASP_TX_CLKFAIL
# e0 T! r' f7 f3 w8 `; k c| MCASP_TX_SYNCERROR
# x9 u/ [* t; ?/ H& r0 ^| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR 3 q( R J- _3 f8 j4 Q
| MCASP_RX_CLKFAIL
! v0 C( Z" Y' H0 r' _3 Y. {| MCASP_RX_SYNCERROR 5 N! \8 X) c( w; B8 r# l3 E
| MCASP_RX_OVERRUN);
- L( K: Y! N5 b! x' c} static void I2SDataTxRxActivate(void)
! J9 d, N+ j5 k9 O: R{ n, `' ^/ P8 i8 X2 t/ O5 r
/* Start the clocks */
' \& }& o- Y9 L0 E% vMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);! G' N& L: {9 p) r, d
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
8 M; h, Y. i* j: W3 K9 D1 GEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
8 e4 C, O" z% y2 a) HEDMA3_TRIG_MODE_EVENT);; K8 d& z- h9 z8 @8 u
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, / @* Z7 d- q: z- g8 ^
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */* t) w, ~0 _! g) [: K$ b
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);/ B' s6 m ^4 q+ E1 ^6 ?4 x
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
, Z% B) V+ V% |* O' G0 Jwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */. u& U$ Q" R+ B0 [: u
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
& D) e: N$ g. H4 Q, KMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);
1 j% R/ w9 y; x5 z9 _& N1 }} 0 ?( A( `# W' o0 E4 a: P! Q
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. 9 a. U/ I' M4 h: m, ?; @' }2 G# B' I0 T
|