|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
q, ]* c V, j6 x# W3 d. a' @input mcasp_ahclkx,6 {0 ?1 x' x2 q: ?( I5 x
input mcasp_aclkx,
$ l+ }# @# j8 z6 X# J. P1 T( Qinput axr0,
2 W/ Q# V4 y, ?# W8 u8 ^6 m6 n/ U* j: X0 m: C3 k
output mcasp_afsr,
4 `7 Y2 X6 U5 d/ R* J+ koutput mcasp_ahclkr,3 o" Q- T% n+ J) v5 o* i3 r8 }
output mcasp_aclkr,& Q) d2 x: C( Y0 J/ ?
output axr1,
. v* Y' q$ J# }! r+ Y assign mcasp_afsr = mcasp_afsx;
/ I, D w/ E+ g2 |2 T' V7 ~* qassign mcasp_aclkr = mcasp_aclkx;
]7 f9 k. z, s2 b) m# zassign mcasp_ahclkr = mcasp_ahclkx;: d6 d6 B }/ Y; }2 c
assign axr1 = axr0; 7 ?2 B( M2 C1 Z$ I4 H
: `* g( h' Z0 K! }5 O在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
9 K- P5 {4 Q/ E+ k' ]2 r! rstatic void McASPI2SConfigure(void)
. U$ ?! I# f. B4 i6 n* Z{
6 o) u1 C7 i1 Y2 R rMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
% r; |4 j# ]8 Y0 ^McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
4 j0 J7 L7 Z' \- CMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
" E; S( V2 z# M A jMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */4 v2 [* g/ `; I; d6 N) Q$ A
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
, y" g; ~/ r% K; J. s) S' G8 BMCASP_RX_MODE_DMA);8 ]/ j) w/ M4 U6 \& k, [/ z, G
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
! m9 q& K" A; v2 H9 A" A" C! g/ x; z6 HMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
" t" S* [ L% I$ b, g% A- V# E HMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
4 T3 Z/ r, `! i9 T3 p. E4 dMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
/ [- t+ L5 {: F, h/ ZMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
6 D' N b8 m2 {; |& ^MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
. s9 W# ~& B5 x. ?' e9 }& D3 K( aMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);) q4 y9 [) C6 I1 X! o+ L' r5 s
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
1 v' i/ }9 q3 C4 K3 p( oMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,1 f* ^. U3 V/ t4 i1 z6 Q
0x00, 0xFF); /* configure the clock for transmitter */
: ]0 A) E+ ?* ^2 c T$ hMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);& l: m4 c4 ]" |% Q4 c$ @% y
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); . ?0 U$ S) z! M2 u9 a
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,3 |2 a0 i; C# P9 z/ \
0x00, 0xFF);& b( D$ M& x/ q9 z3 G z2 K! t
( F6 b) o: G: }6 ?/* Enable synchronization of RX and TX sections */ : ?& s8 O# P3 M' a0 Q7 k
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */; o( O" K% l% O( i7 ?
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);1 L6 H- B5 x# q# F
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*4 A4 m5 f) m& T1 k5 Y2 [5 G: }1 ^
** Set the serializers, Currently only one serializer is set as* A; Q( N7 P4 y* _5 O% W
** transmitter and one serializer as receiver.
a3 C) c+ D3 j3 X0 h( t*// L" ^6 q+ V6 w4 j8 _7 T: [
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);$ j0 Q8 H/ n v: n% i
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*) w d3 ~# Q; ^4 p p" g% R
** Configure the McASP pins 7 I* k5 d( K! p* g% y
** Input - Frame Sync, Clock and Serializer Rx
7 h) n* Q! z i5 S5 _# t; z$ g8 K. y** Output - Serializer Tx is connected to the input of the codec
, S* Z0 l+ V! j. C1 S4 _! [: m) c*/# G+ S1 I7 H/ i& y
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
8 w$ M; y4 q9 o$ x) f0 }3 {McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
: f& H6 i1 f2 ^& j: u# e; z! SMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX/ v# W) I; r1 `8 F! f9 } w; Z& \5 `
| MCASP_PIN_ACLKX0 H# i2 t7 F0 [3 e; z
| MCASP_PIN_AHCLKX
. \8 L$ d) F3 d+ @| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */8 [' M, f3 e2 A- m$ _
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR . n. q, c# @# ~) q" ?6 u0 X7 M
| MCASP_TX_CLKFAIL 9 ^; r0 n. m" G4 ~7 f
| MCASP_TX_SYNCERROR
+ g8 [1 m3 N! t| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR ; y8 ^# v1 G7 `; k* a9 O0 x1 o
| MCASP_RX_CLKFAIL* S/ L# D) d9 A( X/ O# |, \- L
| MCASP_RX_SYNCERROR 9 k7 |2 h8 }( w1 I F( K; ~
| MCASP_RX_OVERRUN);/ H- o9 d9 u) R; ^" y& D
} static void I2SDataTxRxActivate(void)
/ j% b1 X G6 H/ S" H4 [+ l{
+ b" W' {5 }; A' v: m& z/* Start the clocks */3 Z0 z. e' C! p6 A% y' v
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
* F0 x! \7 ~1 U4 g- g. @McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
& \. H2 X7 c+ Q, Z$ E i$ xEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,( a4 r' T- c3 S. C/ ~( R5 M* C
EDMA3_TRIG_MODE_EVENT);
8 f B( U3 ], |2 L1 U* s9 ^EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
$ |7 @4 Q4 s8 K; VEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
& z" J- s6 `5 D: CMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
7 C8 |9 p/ q. fMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
G+ W; w W- _: L @" i* Fwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */3 v5 A1 d4 m* q1 E' ~
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);- k0 w$ Y) B! D: W
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);" w8 H, x4 w' k1 J$ u4 o4 f
} . r- I, D7 v& d" F
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
4 J1 R2 u3 `# ~, F% @* b |