|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
, Q& _7 j$ c" T0 j( b$ Sinput mcasp_ahclkx,5 H( p; ^. m* Q3 A* H0 \4 L1 j/ d, `" Z
input mcasp_aclkx,/ K8 Q+ U- q O( x/ s) C- D# L
input axr0, H/ V0 r0 l$ k$ j/ ~
. @/ [$ e$ b5 B$ Q9 \) n5 Loutput mcasp_afsr,9 H# d$ G8 m$ n
output mcasp_ahclkr,1 B7 H" O$ j3 G4 B1 k; {. _
output mcasp_aclkr,
$ i5 q) o2 x Zoutput axr1,8 {1 o9 Q% @2 a9 E8 z
assign mcasp_afsr = mcasp_afsx;
( V& ?' ]$ K* A2 q& Q' j8 Gassign mcasp_aclkr = mcasp_aclkx;) c$ }' ^- Z/ G/ z
assign mcasp_ahclkr = mcasp_ahclkx;: H6 Q3 ?4 Z/ L8 `9 w$ @1 n4 ?
assign axr1 = axr0; - C+ t% M5 w1 P6 @& n2 C6 S! |
' p- V7 J; T/ y0 W: ^
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 6 [; ]; ^+ F7 S+ |
static void McASPI2SConfigure(void)
) i; Q( n0 B i% K6 ^, X{" N E/ L; ?+ e0 _) [' h2 z0 `
McASPRxReset(SOC_MCASP_0_CTRL_REGS);$ N8 b1 g0 w* F! k
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */2 J; G& T q6 d# o6 K6 l1 Z' V
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
_- |3 A, d( m' SMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */- V4 g3 [; i% \0 V4 g
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,$ i9 }2 m5 l3 M" C; o& j
MCASP_RX_MODE_DMA);( a' D- M, g7 o' c- O, F, G2 `( f
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
- K5 M4 D+ x- C/ y2 QMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
+ V$ c5 H ^: _& O+ k& kMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, ' N6 {$ i# \0 k6 u5 \1 M8 G, K
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);$ Q: f- t- {& e, U0 Q' P6 {
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
8 H& a( N# t; E. U% a6 ]- ?MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
% v$ L! A w* F. w6 z) |McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);5 n8 X& H( O/ A4 R2 G6 d6 c( G
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
/ N7 D! V+ Q! V/ _; a( I4 m( }McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
* @7 R* t: Q4 u* J ~. t7 a0x00, 0xFF); /* configure the clock for transmitter */
9 t8 ?3 S* o" SMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
4 @& i, k" m. W2 D1 j5 ]McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
- i# G2 H" i! w+ E; S2 |- \McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
. G2 B2 x. [7 `- c$ M# n7 Z0x00, 0xFF);
& [3 u7 U; n2 S1 a
9 V2 r7 d/ Q9 I Z3 c/* Enable synchronization of RX and TX sections */
- ^( i% e/ X( R, E! HMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots *// C9 \1 U( Y- L$ M! p
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
0 E( W! b( L- I u2 h& r. }McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*3 u9 B9 E' M2 U1 b( y
** Set the serializers, Currently only one serializer is set as
f; T& J6 { m3 Z+ g" p** transmitter and one serializer as receiver.
. r& ]$ {9 U( ?3 H# D% _6 E*/- X$ z+ @1 H! Q$ p* O4 X( N
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
3 b; H0 x! l( w' {, bMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
) E9 W, @8 r8 t. j2 h6 _( \** Configure the McASP pins u! F5 E( s) o+ r, J0 x3 ~
** Input - Frame Sync, Clock and Serializer Rx5 }6 S# I$ T- X3 v" I4 N
** Output - Serializer Tx is connected to the input of the codec
/ T% j1 n9 B" Z2 Q' L: x*/" s- |$ v( V$ v2 K" W6 ~
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
3 [* E$ T& r o6 Z5 hMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
! R. A* y# b& z4 U0 V- H( zMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
T, M+ b5 u0 U7 P| MCASP_PIN_ACLKX0 D. ~( U) j9 U$ G: D* w1 {
| MCASP_PIN_AHCLKX7 j" r0 r- a- N( B( @& f
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
: n3 m O) I) t# T2 i( \McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR / b+ E$ a# i, Q9 j
| MCASP_TX_CLKFAIL
! b( }- k' c. o' ]. @6 E% z9 h| MCASP_TX_SYNCERROR& ^7 `5 f7 E6 k9 M% F4 }; K7 {/ Q
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
. e& h# v/ f. ]9 R( Q1 \# ?1 E7 z| MCASP_RX_CLKFAIL, P9 z* y2 O& _; R7 i
| MCASP_RX_SYNCERROR - ?0 z5 _' L* |; O
| MCASP_RX_OVERRUN);
' E' \6 n" U2 m" \} static void I2SDataTxRxActivate(void)9 N5 ^+ O( G* Y5 g- E
{
+ p& F7 I3 k) {0 p6 L9 a; h/* Start the clocks */8 a3 M$ a% F1 m' s# v/ T# }
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);' A G1 l1 n6 I! z. i' i
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
% E ]# c+ I9 p2 ?EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,8 J8 T3 G6 R9 N+ c/ m- m9 x
EDMA3_TRIG_MODE_EVENT); U( `( D* o) K8 p- j/ @
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
# I- \; N# `: U; m0 GEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
% y; G3 H" d: j: R& B3 B+ DMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS); g! O( @3 P0 o2 M; X& K( {
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
( Y$ t3 M4 ]" Q$ ~0 zwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
6 l) F' ~' h) M7 Z6 ?( P# AMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);
4 b2 P) M. ~$ @3 K, EMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);& V% k( Z" L. P
} & A2 @( D, ?, O0 b+ _
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. $ F9 z1 j+ v' l9 g2 f
|