|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,- l; F6 p/ x1 v x2 Z
input mcasp_ahclkx,
$ E& N: p4 a5 n+ K% h+ c! }- Oinput mcasp_aclkx,) A& s, O, P5 ^3 {' ?1 P2 d2 U$ w
input axr0,
, m/ m, @4 }6 D8 H7 |* M V/ I/ n1 X1 r
output mcasp_afsr,0 T; a2 J; t2 [
output mcasp_ahclkr,1 s, w u1 z: G% A$ i+ r
output mcasp_aclkr,$ n w5 J( T9 A1 m: F$ M
output axr1,
8 x: _" A8 ]/ H2 ]7 x& H assign mcasp_afsr = mcasp_afsx;
; P4 X# L/ b" I4 ~) d9 \' D2 Q' i+ vassign mcasp_aclkr = mcasp_aclkx;9 c, N# i; @4 K7 a; M$ W2 e
assign mcasp_ahclkr = mcasp_ahclkx;
% o: q7 N* U& {# ^4 B5 Oassign axr1 = axr0;
1 W/ [8 O$ k3 X$ N
. S+ {: E3 ^% k5 L1 s在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
9 ^! v7 K- v9 H }8 t% Cstatic void McASPI2SConfigure(void)) N4 V$ u4 i. g: [5 s5 G8 K6 c) v
{# Y5 a9 F; B8 w6 l
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
, I3 d0 O, s" E: J5 f3 oMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
% h1 T. c' K! s4 qMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);' F' o1 H$ m4 {6 y9 z$ _
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */ D. E6 y" e4 k; f. P
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,7 |9 h! j! O* r$ g
MCASP_RX_MODE_DMA);
, }% I: c6 \) v, x$ S9 A6 NMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
4 @ L3 {8 W: w0 Z3 tMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
8 n+ S0 Q1 _* e/ NMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, $ @" S- i( r/ D6 O% o5 ~
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);- E% |- C* h3 s2 w
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, 2 }% E' S9 p* m* m) D
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */* y: d3 T) B6 D; E
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);& @6 @. h* |: l
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
% c# r! O8 e' z7 w+ c/ b# j/ t& v; [3 ZMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
$ n. A. c; e' \% N: l0x00, 0xFF); /* configure the clock for transmitter */5 s {, M7 P* r; b. |9 J4 L2 [5 N
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
- N7 C$ O0 z3 O0 L0 }& OMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); ! D7 |1 U5 p0 @0 j
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32, B& X8 x8 o$ l) e* q, [1 ?, q& D
0x00, 0xFF);
) g3 r1 b* {! A, F
6 e0 l Y! c' m# H/* Enable synchronization of RX and TX sections */ % B! ^0 c e0 F
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
, q- q, m' C9 z! x$ AMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); T- |6 d5 S* z# [) f P
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*- ~+ ], V! x4 y f; H9 K" [5 d( N
** Set the serializers, Currently only one serializer is set as
) F9 ~2 S) N" I) b& r/ p** transmitter and one serializer as receiver.
1 ?; l) L/ P$ d& j( t% W( ?5 R*/
: V3 t1 N# }0 m$ Q, EMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);7 G4 v9 t; d3 H* G# |: S; S o
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*( Y6 D1 L2 H" J" D4 i3 J# \1 v
** Configure the McASP pins / r6 f+ c) B4 ]6 H; G) c' K/ ^' \1 H
** Input - Frame Sync, Clock and Serializer Rx
$ u5 m3 V4 i1 g7 I** Output - Serializer Tx is connected to the input of the codec
5 j' b* Q2 a" A$ E, ~*/! {# X, K" V) f. A* v0 V6 b
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);/ r; R& `1 G- [$ g8 a# |
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));( ` e" i3 t+ R7 {3 J) z
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
& z$ ]2 _% W- y5 P1 t| MCASP_PIN_ACLKX
! n3 H! y- M2 C3 c/ f| MCASP_PIN_AHCLKX8 A1 x6 Y; ^) c7 X; H! Q
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */' u0 c8 L- L2 @3 E
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
$ f7 H/ y, q% m8 \; N| MCASP_TX_CLKFAIL
2 {9 m2 q4 R& c9 I' c' u- ]' {1 [2 X| MCASP_TX_SYNCERROR% n* @& O/ z# v/ ?
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
. s |2 v! |, j$ Z4 W/ n| MCASP_RX_CLKFAIL
& r0 t# A$ m2 [9 R4 N| MCASP_RX_SYNCERROR
# N' z- ? b/ y& z| MCASP_RX_OVERRUN);: J$ S( p8 C5 y4 \! m" j& H
} static void I2SDataTxRxActivate(void)
4 I& z+ U z D" X3 y+ I- I- ?; b{! x( w' [* D ]/ L
/* Start the clocks */4 w; S4 ?, j# L; b! }# A
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);% W' ^2 R6 n0 [, S! {3 Q* e5 F8 ~
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */; t$ S. Q3 [, I1 ^
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,! ?) e9 j/ u9 M. Z1 m" V/ I
EDMA3_TRIG_MODE_EVENT);
) q; U: k! A- |: b$ t7 [- rEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, 6 n; L( P2 @+ ]
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers *// F" A9 O* G- ^$ c9 Z/ i
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
- |# }) N6 y2 _' z" D, ~McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
" j q+ X, s( O; Y- k b6 Swhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
" V5 W z, U9 Z, U. N+ i; kMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);
3 [* L" N: w' C# YMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);
$ u; |5 G) D$ E8 _/ m; B} # t2 R( X: I6 V8 D7 X7 q
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. 6 s0 |, j: Y1 ~7 V
|