|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,; [6 ~ m" C& J' O' z
input mcasp_ahclkx,. V7 \ d3 J* j/ j) U9 Q, }
input mcasp_aclkx,* s' p" m6 a, Z+ |
input axr0,2 h- q7 O0 G4 n* H& s7 z5 o
9 I) G5 v( K$ Z
output mcasp_afsr,
/ D0 O$ c$ P5 Aoutput mcasp_ahclkr,
# ~5 x8 a$ I. H9 }1 y9 r [! ioutput mcasp_aclkr,* }- ^; H- A' V- j8 F' _3 O4 S) O- [
output axr1,
, R- }% A' e1 k( [4 T/ x assign mcasp_afsr = mcasp_afsx;7 Z8 Z/ b; m8 G* z- E( d5 @
assign mcasp_aclkr = mcasp_aclkx;
0 ]/ |' z3 J P [. A- ~- ?& eassign mcasp_ahclkr = mcasp_ahclkx;% n7 ]% D0 w" T( D* F4 v$ G( B
assign axr1 = axr0; + H" c; g1 i* }5 S) `% B* B
) p7 J1 a+ Z; d2 Q4 C' k0 j8 {
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 7 v$ ]. [1 ?7 v3 T! c! ?& {8 j. b4 w
static void McASPI2SConfigure(void)* H: K/ W* a- U# R
{/ ^! n' z0 |' @- r; _- @: e
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
0 @1 D" i; W: l1 f% GMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
2 U! a8 m/ V" B$ i$ p& z% ?McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);6 H8 U4 b! q* x, T8 W5 \; _: Z$ A
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
O0 w. S. Z4 d3 U- j6 m2 DMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
( B# e9 Z# _5 R" V, KMCASP_RX_MODE_DMA);
8 h6 f. z! y: A. v! X9 b1 m, AMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,5 D" w0 b. }- _
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
# u) Y9 p. g+ N$ P: t) oMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, - s* ]2 c0 R9 n* K! i
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);, Z5 ~2 R. B( h' Y O
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
% Y6 w# K, u! o# WMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
& c$ b0 a; D1 A/ AMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);$ V5 b3 \! z# w) {
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); ! G5 D) ^0 P0 ]' o
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,5 p* m: T7 y ]( E1 Q% w' L
0x00, 0xFF); /* configure the clock for transmitter */& \; D3 g$ P9 l
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
2 o* {! O6 S& J) E. |8 ?4 p* k0 d LMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); I6 Z6 F6 P8 D1 |. r0 I6 k
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
8 b2 q' ?: q6 V% t0x00, 0xFF);: [) s4 Z4 g* Y& X: {' D* q1 M; x
2 M0 _; D5 Q/ s* \, M5 \7 y1 w
/* Enable synchronization of RX and TX sections */ & m ]& i, Y: g8 x9 Q n% v; j
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */* `) P6 Q3 ^6 ?' a' e( N% @) I
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
& r' Y2 `# j# q( d0 S1 y& `. DMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*7 E. ^' B' P+ m! W6 n1 X
** Set the serializers, Currently only one serializer is set as# ~; ]$ M3 C6 S, b
** transmitter and one serializer as receiver.
& m# z( T% D ^7 ` w1 [*/# o: s+ N& C+ Y$ x4 `- k+ f
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
2 X- m2 M. m- t. |4 r/ G2 [McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
$ _1 W3 K& C/ C: i% Q: y** Configure the McASP pins 8 e, k: d$ A$ p8 y& ?" v6 d
** Input - Frame Sync, Clock and Serializer Rx; \2 q/ Q9 w$ X* N
** Output - Serializer Tx is connected to the input of the codec & ?: E# ^& ^6 j
*/: p9 }! n7 x: }5 n; R
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);0 o) i' r2 z% A
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
2 ]+ Z3 F- y- k JMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX1 a+ r7 h; c1 @! W
| MCASP_PIN_ACLKX
' k8 s+ Q% o. G$ p| MCASP_PIN_AHCLKX
2 C; e& | a0 b' n$ u* U% R( J| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */, V# d [3 g& _; D: i+ U) o7 l
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR $ `0 T- u, F0 d8 C! i$ h
| MCASP_TX_CLKFAIL
" U! W3 {$ s0 E$ k2 e| MCASP_TX_SYNCERROR
% F" u. |0 m' \2 ?$ P7 K| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR $ S, h' |! a: {9 j- d
| MCASP_RX_CLKFAIL
8 \) ~6 ~4 |, i3 q# S: G| MCASP_RX_SYNCERROR
( B8 D6 J6 F' n- V' `$ ]| MCASP_RX_OVERRUN); F# l3 J0 u) ~0 R; p* G! O1 J: w! p
} static void I2SDataTxRxActivate(void)5 K9 ?$ b. E" v' A8 y
{% n* [- ?7 w3 @0 w8 N/ S. n
/* Start the clocks */* p% D A& ]) B" y5 U
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);5 Q( c u# T0 q/ x% r4 i
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
' ^9 J# M, Q$ E7 u4 p- L& IEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,0 R% M& S0 K: r5 c2 M- D3 L
EDMA3_TRIG_MODE_EVENT);
! t2 h2 l+ m( M' REDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, 1 v% S" y$ ^. H; p1 ?8 h' z( D
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
* K/ C% s* n/ E* FMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);/ _0 n# s. M; X" @" r
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */7 l7 K4 k8 p S+ t* j2 q6 H
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
- p" ^# f; J) l$ ? t* O0 TMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);
+ m i2 B' \, b+ @6 j$ C3 dMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);
8 U2 J% E9 t+ M/ Q2 n7 p* h} $ l# M0 a# p8 Z
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. $ y% u- W( i5 l$ S+ Q/ u
|