|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
" _3 y8 Z: l0 s9 Y$ S0 e6 H; ]input mcasp_ahclkx,
- u# F0 H0 R9 S x7 G! ~input mcasp_aclkx,1 U& P6 d* t) R- ?& Z- S" r
input axr0,/ U% q! ~/ u% h+ i# _; q
; r' V4 k; B/ A! u- D1 ^
output mcasp_afsr,- S1 r* W- }$ V: V4 {
output mcasp_ahclkr,
S/ t' f# p4 aoutput mcasp_aclkr,
, {3 v% n+ T* G0 z+ K! X4 Zoutput axr1," u1 s( \0 K3 ]5 S, V
assign mcasp_afsr = mcasp_afsx;
" X9 k1 w) }! z7 B( I6 F6 Zassign mcasp_aclkr = mcasp_aclkx;
6 T1 } r: e3 m" ?1 Wassign mcasp_ahclkr = mcasp_ahclkx;; x9 G' C3 r& t$ ^
assign axr1 = axr0; , X! ]) V; B9 E2 {* O
* r0 P6 p2 N2 u% e
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 3 {$ e- n5 b) U2 p* t( |& t1 {
static void McASPI2SConfigure(void)
: x' m7 b8 z7 U4 U+ h{/ U! r4 B3 A, ]# C6 C
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
) A) O1 m2 D% e& x" ^McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */; \ v* M0 M6 p0 X. U) ]
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
# B+ j$ R! n% C/ M# hMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
6 y4 P% M5 z- W5 }& iMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,9 G1 E1 a8 V/ t% y9 f
MCASP_RX_MODE_DMA);
5 I! C8 U- d; VMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,7 T' J: E" t9 _. @; h* o. \. u5 {' x( E
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */0 B* t9 m" h$ s1 ], R+ i* d
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
/ f: }* r3 K( JMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);- B0 C5 E! b* Y2 {1 E7 R
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
/ {$ u7 y1 l6 |. ]! s2 A! bMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */1 {, J6 f! `; B3 Y& e9 ]. R
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
2 r! X; J7 z: T, Y) k+ K7 EMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
2 e( u; _, f: y$ zMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
; z0 E$ n6 C1 j2 Z1 F7 O+ j0x00, 0xFF); /* configure the clock for transmitter */
" p3 [% F1 q2 W K! L6 GMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
, i& V: L1 T% n3 N- j7 ?" A5 UMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
. M# ~% u9 _0 u; P" kMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
! e! j' j4 k6 r j. m! A0x00, 0xFF);
) R4 K2 z6 Z4 y! T9 }8 E8 Y) E+ S/ c% q
/* Enable synchronization of RX and TX sections */
# B/ V8 s2 H6 E( fMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */( r* L9 @1 v0 N6 a3 s1 B, A* O& U* }
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);% }& ^: O8 {4 b% v/ ~
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
# Y" n" }" v$ j: y g* Q. O** Set the serializers, Currently only one serializer is set as
; B) b- O1 e$ D** transmitter and one serializer as receiver.9 j! E' o/ k f0 y1 @1 ^7 u
*/
& K# t3 u9 m8 XMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);. Q9 i `! C/ U7 ]+ i
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
6 C9 j$ |4 k, G/ B4 B4 F** Configure the McASP pins j: q' z" q& a, |
** Input - Frame Sync, Clock and Serializer Rx$ N0 R \: ^" I: l
** Output - Serializer Tx is connected to the input of the codec + o- [$ {% q+ Z* {/ {2 k( B
*/
# L& G3 I+ |7 L7 K0 |1 h+ `McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
; V, p; G! Q) E! E1 L" {6 {% BMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
* i9 ?# G- x2 t7 T7 t0 \7 `. x9 |McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
8 a2 W- }% R+ f9 D% h| MCASP_PIN_ACLKX S5 F; F+ ~; w6 Z
| MCASP_PIN_AHCLKX6 y y ^9 \; ~1 F9 Q
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP *// j) N# r+ D8 |! b. m$ e
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
5 L8 v# l: A2 M| MCASP_TX_CLKFAIL : }5 y' f; K, H# I4 q: Q0 Y+ [
| MCASP_TX_SYNCERROR, J8 \1 a( e" W9 v. F4 ]
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR % p( f, Q B/ u9 J0 ^( _& s
| MCASP_RX_CLKFAIL
( W; @7 M1 O6 G| MCASP_RX_SYNCERROR
4 X% n7 D( {; L| MCASP_RX_OVERRUN);, S1 u8 v, W+ |/ ?7 f5 K: y i
} static void I2SDataTxRxActivate(void)
* J ^) v8 v3 S' _1 p+ a{
1 h) S- ~+ n L/* Start the clocks */% j' @( x8 P( R
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
- z/ c, N9 F7 K6 t: z: q' a+ ^McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */3 v0 p* t1 N' ] D* }
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
9 N. x/ l# h; j0 r/ S, i1 nEDMA3_TRIG_MODE_EVENT);6 s, X H% z! ~$ @( O1 o
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, ) P9 R0 q% a% j8 B8 I
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
2 r. d) d( i" ]; MMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);/ p5 n6 I4 K7 E( N; _: v/ w* Q
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
% J3 q( r/ b9 Z9 Dwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */$ m( i4 a* y" \2 J( V
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);; k1 d: { F s! a3 b3 F2 s
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
( @6 N6 q+ E' U' a$ J# a0 }2 X1 k}
* u* m) N. K0 j" \请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
4 F5 J7 A. K A# A |