|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
% S5 S6 X9 ^8 i" V: N& [" U5 S8 Iinput mcasp_ahclkx,( ]5 g+ L& y. u6 E+ T9 b
input mcasp_aclkx,- L1 \8 t! [, w. s0 V( i
input axr0,
; M2 g% a8 f7 F a1 I9 A3 Z9 n$ d9 I$ H9 F' \0 A1 S. k! c' l" S
output mcasp_afsr,2 L4 n1 x1 _3 m m" G1 U
output mcasp_ahclkr,9 t- G9 g; ]' p3 `
output mcasp_aclkr,8 p5 t: O9 z' O3 e1 V5 [
output axr1,- C, P: I& e+ |$ D4 @9 f5 w9 E K- a
assign mcasp_afsr = mcasp_afsx;
( M, H, @5 v5 Y7 b4 Cassign mcasp_aclkr = mcasp_aclkx;
* n: o/ I" R9 g* Cassign mcasp_ahclkr = mcasp_ahclkx;5 U l: w4 |% ?7 h# `
assign axr1 = axr0; 0 \5 V# `7 Q# ~0 ~0 r' a2 d% Q
7 ], R: g+ Z- `8 E% W在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 ; e8 r3 r9 H0 t6 q [
static void McASPI2SConfigure(void)8 y/ H- W! P3 l& h2 J; E) S, t8 @
{. b. L% @' ^3 s" P3 N* m$ f, \3 v
McASPRxReset(SOC_MCASP_0_CTRL_REGS);2 n0 X3 _2 }( ?# V [8 p% t
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */1 a F0 q" p6 N, B1 p' U
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
5 o$ B# w2 ~# RMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
8 V4 V2 x' d/ N( o! q' A# aMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
! T) l1 \/ b: G) V! ?$ {+ V) pMCASP_RX_MODE_DMA);$ n A; j: @4 V% u& j6 v2 a) ^
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
) M* U2 o$ p9 K7 v0 e8 G: w2 LMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */) x+ M& ?8 g) V! `7 `9 B& i! F* F
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
% A M! ~; o9 o6 y1 fMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);8 V% c$ ^ ?! V9 z ~' l
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
A' R2 W2 ?. r" MMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
5 p) W& B/ f" m; m8 ZMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
, H# B5 f2 o3 n/ `McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
' H2 F" C- R# u: v( Q% u: tMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
; A% m6 J, k3 `' C; L/ k/ C0x00, 0xFF); /* configure the clock for transmitter */) X( O- i* a5 G' q. [" q
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
" k$ v2 |, S0 @$ P0 }, v4 y2 EMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
+ _5 M+ [* ^ t \0 C6 b! TMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,7 f3 H4 k- g/ a d8 ]; A9 F6 I
0x00, 0xFF);
& B9 w1 Z/ M" ]1 F: d9 a4 f8 A
; x W) b; A; B# ] b8 ^# z/* Enable synchronization of RX and TX sections */ ( Q- `5 a: F( d7 O
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */ h- j, H: O A# i3 w* {0 `( |3 O
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
) r; Q' F. ^( s" w: UMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
. A: D5 h* R, E4 |. `$ V, R** Set the serializers, Currently only one serializer is set as
( E( h# P( b7 v** transmitter and one serializer as receiver.
- G j" r* j7 V7 g*// C8 @1 c+ k+ h0 {5 ^
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
+ F$ {( n4 E" j# ?( B; w8 G2 TMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
9 j* y3 O0 j# w2 e) m% U' I; a& d/ n** Configure the McASP pins ' g3 G1 f# W( x: h
** Input - Frame Sync, Clock and Serializer Rx
! Z) |5 B1 B" I** Output - Serializer Tx is connected to the input of the codec & e4 v! _2 B- N$ Q, p5 c9 Q9 ?
*/
! n1 T- w7 g+ xMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
: l' k* a7 X# a1 B5 PMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));( a9 U% `) l8 a6 N6 r8 \
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
) K* _* n* o* X, ?5 k9 a| MCASP_PIN_ACLKX, [- B; z4 `* {$ F, g& b4 y$ _
| MCASP_PIN_AHCLKX5 z8 h, h% Z2 U) t1 u
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
6 _ u. [5 t$ y$ ?McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
% z4 S F2 d& a: r1 V) e( V| MCASP_TX_CLKFAIL
& _0 e" ~# m% || MCASP_TX_SYNCERROR& C h( D& [ f7 C4 w; b/ i
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
' F( M& c% u1 r* O) @- }| MCASP_RX_CLKFAIL
2 A4 E m* f6 R% S% T| MCASP_RX_SYNCERROR + j }2 g& c& Y% c7 F, g
| MCASP_RX_OVERRUN);
' R! ^+ a/ _4 m% R& v% M} static void I2SDataTxRxActivate(void)2 r2 y' q" ~. A+ i% x
{$ X" }* J4 L$ Z; G2 R* Y* C% _
/* Start the clocks */
) s7 A, I5 z, v) t# z5 CMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
2 f, R! ?$ d7 P5 SMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */( S$ C0 H; O# `# I5 K, K" k
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,9 J" v+ W/ ]! ~. G% d- R* E* y
EDMA3_TRIG_MODE_EVENT);
, u/ C' G0 U0 AEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, 2 i8 J; c6 a; V+ B7 ?) s) a% Q$ v
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */# H3 X4 S, B3 E1 I
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
5 N1 W5 y; T/ zMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
, ?: O3 P; W7 j( hwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */2 F, `& C) X3 [
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);' F# f7 y0 M5 \ F6 q
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
3 o; v- z# [/ m% r8 z8 ]- U) R}
# \; d. }, U4 ?请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
- H: z' j* k' q* G3 x. P |