|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx," g# b% J' i$ k
input mcasp_ahclkx,
0 ~2 F9 z* ^$ K& r4 O' g* Vinput mcasp_aclkx,
" R |4 s! O6 @2 j& E' einput axr0,* \! o! q3 u2 Q3 h# C/ e
# _' }. Y8 D9 }9 z, }+ X% b8 D" ]
output mcasp_afsr,% X9 g9 D$ S% d& x j1 `
output mcasp_ahclkr,
: p! H2 l& U- {3 ooutput mcasp_aclkr,( r1 U1 B% d! G6 t+ R3 \
output axr1,
+ [, |$ U. A- b! W* Y) B assign mcasp_afsr = mcasp_afsx;0 ?+ q4 a5 D E6 k5 ^
assign mcasp_aclkr = mcasp_aclkx;
* A2 e2 e! d q0 t6 \assign mcasp_ahclkr = mcasp_ahclkx;
+ V: M, F* F4 o, cassign axr1 = axr0; ) S. k; C* |( d/ v6 z0 C1 Q
/ A9 ?+ j) V: m* X, Q$ @
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 1 r& A8 l' p6 V
static void McASPI2SConfigure(void)
0 L/ a5 K! v$ v* N8 U* L{( i/ F/ \1 K3 J; R4 S! t0 H
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
+ f3 J- W) o. }8 u$ H+ S& SMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */% h" v. \, c! W4 Q9 ~ z1 Z1 Z8 G
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/ u7 h! J# }6 `- w$ c1 c+ \- |8 rMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */9 C! r8 F) ] k+ |3 L- _4 o' z
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
( @$ r& ? @# hMCASP_RX_MODE_DMA);. j! j% d4 s" K: f f
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
1 z, B( s* f& `( T; n3 Q; {MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
6 w7 B" k1 L/ r5 H. z% IMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, & N* G' S- V) ]+ l; O
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);! Q3 J4 I, P# Q) O# S
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, + H6 Z( r. l3 L: Z! F4 d
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
! ?3 z+ V/ M* X* H+ Q4 o; ?McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
! Q' S# Z8 w- a: ?( lMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); 3 x: X* _6 {6 `) }( t
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
+ j7 T$ Q1 v$ M2 b: X0x00, 0xFF); /* configure the clock for transmitter */7 p2 g5 w. W1 P. h
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);& j- [- q/ P T ~+ M7 j
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
2 P/ y8 T: H# @McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,# C- c ~/ Z% C& B, d
0x00, 0xFF);
, `8 g0 X# Y8 ^1 o) m# p5 h4 }1 g' z) b
/* Enable synchronization of RX and TX sections */ * c5 _" C+ {5 v& |! _
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
2 r6 o3 h j" \McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);) `: M( P6 Q; ^% j- \5 M/ K
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
Z0 ~: \- n4 X, ]2 m** Set the serializers, Currently only one serializer is set as7 Z3 f6 m- B+ e, c5 e- m2 [3 `
** transmitter and one serializer as receiver.
- D2 C' F$ n- j; g2 Z) u! d% ^0 Y*/$ e; ]4 j- O! V4 C6 U( z' Z- E. M
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
: E4 s. j2 Y, mMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*7 l) V: f; P6 ~ }
** Configure the McASP pins 9 G4 c+ _- f$ r2 M$ }1 J9 {
** Input - Frame Sync, Clock and Serializer Rx
# ~, l; G% X! i1 ^3 j) [** Output - Serializer Tx is connected to the input of the codec
: m$ O8 L, _2 N+ A( T& t# Z*/3 U& Y, @* E( \) Q, r9 z$ P4 d
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
1 p* i: }# K4 n% c- p, U0 h$ ~McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
: e- N3 A7 Q1 P& z, A( V3 {$ D2 RMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
& }2 V% q+ a2 j: i| MCASP_PIN_ACLKX
4 Z3 f; Y$ S7 w' P; r| MCASP_PIN_AHCLKX
- d3 o7 m. X4 B( C| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
L' _+ I5 {; WMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
- `9 u$ ^5 F' P9 H2 [| MCASP_TX_CLKFAIL
- z! r2 t; F, Q3 ]- A| MCASP_TX_SYNCERROR
* t. p$ g( ^' [0 [| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR ( D- h6 w% W# J; }( {3 }9 _
| MCASP_RX_CLKFAIL" ]! M7 i" E: X! n+ m. M3 y- M+ g
| MCASP_RX_SYNCERROR
/ q- ?* f! u- K| MCASP_RX_OVERRUN);) a$ v& u( U( P; g) U
} static void I2SDataTxRxActivate(void) o% |: s: O' A9 Z5 c G# X
{
/ I% U9 `# e9 _* {* ^4 W( |4 Z/* Start the clocks */
2 U1 n9 `9 u& }1 t- AMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);( [/ J0 x y6 e$ W* w
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */, r, G2 g8 Q- m2 Z5 v X& k3 N
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
9 c. I! F+ ?9 [* W& d8 tEDMA3_TRIG_MODE_EVENT);
3 g+ ~( |( ^) t" wEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, 8 j' d, f A5 q0 w
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
# S; i* N( S8 a& f+ V- w% mMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
5 S8 D1 ^2 \+ v% pMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */7 b9 c0 x; Q$ i+ B2 H- E5 e- w) M
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines *// o5 s$ T" ]: y( I3 ?% U' V( G
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);) Z0 x. _- E+ q$ a
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);8 o% j1 L; E w5 P
} ; U/ b. v1 o* `
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. . ^0 D3 J& x e/ j
|