|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,# N& g& }( e9 W2 m% J1 @; q3 w
input mcasp_ahclkx,* m L5 C( K0 T, u* j" f
input mcasp_aclkx,
g- H# ^) ?+ f& n; einput axr0,* I1 V. V' G$ t \3 ?+ e& c+ i$ Q
' M1 n; X' ]9 q$ d+ Foutput mcasp_afsr,
g3 w+ h! p$ V" t; K) V' u; M5 f) }output mcasp_ahclkr,# Q5 u* s5 i1 Z. b- k
output mcasp_aclkr,. o" ]1 K. g8 O4 B. C' |6 M' T
output axr1,
% [1 K% ^2 g/ G n assign mcasp_afsr = mcasp_afsx;
! Q2 L$ D% w- D0 \) y/ K* K' X5 Aassign mcasp_aclkr = mcasp_aclkx;
6 m" V# G. o$ c$ i9 y& T7 G5 Cassign mcasp_ahclkr = mcasp_ahclkx;: o4 Z6 T' Q; V8 m& |* j
assign axr1 = axr0; 6 L! }9 B, V/ M5 o/ |7 v0 P g+ t
4 a9 x5 d* i, p/ k
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
2 H; K% Q E' x% r0 I( `static void McASPI2SConfigure(void)1 |% V1 {# C3 u
{, W1 S5 V$ r# P- S. U( c* W
McASPRxReset(SOC_MCASP_0_CTRL_REGS);$ j' R4 ~( k e- R3 ^
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
( }3 P1 c- H& J% q; r% [4 l4 yMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
" ~; t$ Z4 z+ ^; {McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */8 q' Q; o4 n' p& B
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
( N" n7 u. C+ T3 M% D$ s$ R! c" zMCASP_RX_MODE_DMA);! q8 Y9 o$ c0 p% f* j
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,! q1 _" D* a: I; B( g( Q: r& \
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */! V! b s% ]2 ~
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
, l; T5 y7 \" U" VMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);% W; x. O5 J7 R2 f( T5 I
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
+ E% S3 _3 n; [6 _: p" rMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */3 V+ I; |' [* b5 Y
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
3 f" C1 h! D- y! [3 f' s2 E& PMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); + U P# o1 n8 o% w m, V: E* Q7 s0 b& F
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,5 x$ d& `" e9 l- V, F8 p
0x00, 0xFF); /* configure the clock for transmitter */
. l1 j& f! w' T* ^McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
( m1 p3 n* j- R8 a: kMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
. ]# l0 \* H! A$ S8 EMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,. v9 j- z5 `' k( M+ u
0x00, 0xFF);# h- F4 g! e3 s! v# U$ `% L
, y D1 p6 ~' Q' d; d1 ]" N- s3 Y/* Enable synchronization of RX and TX sections */ & R( y9 @+ c, c& j7 [
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */, h; y, T9 d l8 a
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
; n v9 t1 {. L9 kMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
: G2 i( I" }# g( F# L, J) D' \6 ^! q7 Q** Set the serializers, Currently only one serializer is set as* c' K0 S- g7 F' ~4 ~ Y
** transmitter and one serializer as receiver.6 n! R# g& A _( F: w4 ~
*/$ c1 t1 S6 c2 y8 E. f% \
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);7 ^' p- J; u3 l" z% v4 O
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
, ^3 J+ G" b/ X# x4 X* [) i% @** Configure the McASP pins
& d1 o- H$ L4 o8 ` `6 I3 R** Input - Frame Sync, Clock and Serializer Rx R* u& J) k9 p! n
** Output - Serializer Tx is connected to the input of the codec
8 |! ~3 K# R$ g) t( o- a% k*/
7 \; H" L' r4 H/ hMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);) B2 W0 c1 _4 B% @. D
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
* j8 r- Y0 [/ Y3 C2 pMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
- s, R) {$ v0 R7 C* `. y| MCASP_PIN_ACLKX
% C' X+ @1 b% O( Q7 D# d| MCASP_PIN_AHCLKX
! V% Q/ u1 `, J- b| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
7 z% e3 j5 B) dMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR ( V- W) l( _8 p$ K- I
| MCASP_TX_CLKFAIL
# J) l, S# p( X, o+ E7 _7 c| MCASP_TX_SYNCERROR
$ q1 D' p2 `; @& |6 m3 F) p' o( w| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
2 T! ?8 i: ^2 T* p0 h# J| MCASP_RX_CLKFAIL$ x2 C' s4 ]& W( Y4 |( Q: x
| MCASP_RX_SYNCERROR
& P2 s2 [/ l& r1 C% X# a| MCASP_RX_OVERRUN);
0 l3 |3 W2 ]: b" {& ~/ t} static void I2SDataTxRxActivate(void)
. [9 N5 R3 x& k9 R: r. k{- }4 |% G* ~9 a# J' }9 r
/* Start the clocks */# a& G- O$ U& U8 F
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);0 \, R% Y# \4 T% Q+ i1 ~
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
/ @ o- S1 E, ]: G6 h4 K zEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,& S; j! c# D: ^- I
EDMA3_TRIG_MODE_EVENT);6 h7 V: f* `' |1 J1 ?
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, , _7 p+ y: k$ e
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
; [1 m& ]- Z& o& x9 k/ _$ kMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);' y8 [3 X8 g" _- G4 L, L
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */; p& D4 B5 R( r* L d2 T( w& r
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */3 G- \' u5 \( A+ {# d0 T0 p
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
$ N# m! I& N/ S6 q# O; X/ h2 VMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);) n; g: D& ~; ~4 T- M9 x& e
}
4 Q# {* Q% e! v$ W2 j# d" u3 e4 J请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. , ]6 x9 O; c2 C8 o' n
|