|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,$ V, k6 }2 N- l. n7 n, h
input mcasp_ahclkx,$ p2 `8 _4 W! F+ }
input mcasp_aclkx," v G% @% Q* o B
input axr0,4 ^" f' \& Y2 A# q$ K/ z
! N( o8 m& \, @3 m. A6 h! d2 [
output mcasp_afsr,) V+ I$ b: [# S8 ?8 a. f% U: {2 J
output mcasp_ahclkr,: i0 X, d( E2 k+ a& k0 ~ ~
output mcasp_aclkr,3 C# x1 O4 L/ k6 v5 {5 N- w: G
output axr1,3 D/ a* K1 O7 d; [
assign mcasp_afsr = mcasp_afsx;
) y _$ F! G5 w. @; G2 h- }6 iassign mcasp_aclkr = mcasp_aclkx;
) L# B: W9 k3 E5 ^8 }8 lassign mcasp_ahclkr = mcasp_ahclkx;7 @: S3 N7 ^: k4 z
assign axr1 = axr0; 1 S/ j( R+ m' X* R. r
9 a- N8 x; A+ U+ K1 d3 E
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 6 S) t7 l- a+ n/ ~; Z; w5 ]
static void McASPI2SConfigure(void)8 g( K4 b) m- G5 Q9 U/ m0 O$ P
{- x9 v" q4 Y g7 q4 M) \. m
McASPRxReset(SOC_MCASP_0_CTRL_REGS);$ ^7 [( h3 {' e9 p0 B8 k5 m
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
7 Y: u2 m$ n: S( j- A _& @McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);5 l: w2 j. M) y. ^
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */* M8 t7 m2 y) g0 g' z1 ^' d
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,, Y4 I2 G" H d2 A5 ]7 o
MCASP_RX_MODE_DMA);
+ S8 }. u# Q( ?8 _+ K5 DMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,% z7 _( [+ ]2 A" b/ E; K: y
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
2 e$ \2 k% \6 F! H+ m) c7 FMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
+ w% N8 N: S# ?6 {MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
. Y _) d- V7 w2 ~, {; Y8 \* Z5 VMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, 3 d, C- Z# F, @0 M& |
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
z) ]' M. {3 W3 w I5 k: X7 p) KMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
. _/ t" P6 M$ u6 IMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
* E1 K5 a5 P0 f9 a. W& zMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
% M/ g5 R( X$ N5 x0 x) R9 B0x00, 0xFF); /* configure the clock for transmitter */( J1 y) G7 E' |+ N" P7 f( E$ p' e
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1); j; n; P, j" t6 t
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); % z1 J/ V+ ^4 _5 R$ r! \
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
# z* v& j0 I7 e6 q2 Y2 f2 T0x00, 0xFF);
5 w" w, T" t' O# i" V3 o
6 a: W% r! X; l: u" V2 [/* Enable synchronization of RX and TX sections */ ) P2 z6 a2 e3 I* D( L& J# |
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */0 t1 I# t J' Z! l: S6 H5 k
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);" I+ I- z; `# x/ @% Y' M! X K
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*9 N. g8 p. {4 ], U6 J# L
** Set the serializers, Currently only one serializer is set as
) V: N' U- b2 E8 [4 u+ J** transmitter and one serializer as receiver.
) ]$ X& D; q; a+ O! s( C*/4 n+ Y% y x: [6 i) X. Y
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);* Q" m* m0 A% ~; f! F" t, U7 A
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
! n1 H* v2 D( v% F. y4 x* S** Configure the McASP pins 2 c o5 c+ r! f2 u; `2 t
** Input - Frame Sync, Clock and Serializer Rx
: v* {; }5 P. s4 K, X6 t** Output - Serializer Tx is connected to the input of the codec / g% e9 N% m7 V+ @$ ^- l* q& a( p2 b$ ~
*/7 O7 }" x8 U( Q5 c
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);% F _& s9 H. B- C* | a4 e
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
% O `0 X- a' ]5 zMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
3 |& I. G% N1 i R: O| MCASP_PIN_ACLKX" ]- D$ P; P; D2 L
| MCASP_PIN_AHCLKX
1 Y; e! K7 d3 K* B; P# m K| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */0 [" d, u) |6 x
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR ' Y" B; V$ l% A& K5 }$ U* k
| MCASP_TX_CLKFAIL
. n; S5 r( X4 M& W0 {| MCASP_TX_SYNCERROR
5 u# O E: {8 O| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR # X8 q& F6 A/ L9 d8 s5 c, x1 g
| MCASP_RX_CLKFAIL
- w5 {' }7 H9 f+ ]# [' J0 o& P' Z1 G2 M| MCASP_RX_SYNCERROR 5 Y+ s$ Y/ S0 R Z
| MCASP_RX_OVERRUN); y y( b Q/ t3 ] {
} static void I2SDataTxRxActivate(void)
- Z0 t: T( o* j& p1 W{3 H. s3 a% u3 o/ x
/* Start the clocks */) I9 l4 ~% S/ t4 o6 r
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
8 m0 k0 @. |3 x2 {, MMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */9 ]- x: V: ?: B; m) @
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
x9 y" S1 y3 P8 ~7 H0 ~; }EDMA3_TRIG_MODE_EVENT);
2 C( l& U6 J. A. r b7 J6 J8 KEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, % P6 b- ?8 l7 j/ c
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
- F F( e* `8 A6 [& {2 D) CMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS); e( ^! p3 g3 |: z1 x
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
0 L/ `$ \2 Y# R) R2 Kwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
" Z) g8 f0 [) Y) b% M$ E, s6 w3 f- NMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);
7 r5 n Q5 ^$ c; J7 wMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);) ~- n8 f( [8 \3 n7 P8 q, i1 z: C
}
& m. J' V6 i& ~1 e) I q7 e. I+ N请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
& ?7 ]7 n+ s' w9 |6 | K5 W# X' ` |