|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
! q5 J! T8 y/ m5 @9 ^8 ~4 {input mcasp_ahclkx,
% O( a/ e( Z( @( T& _( zinput mcasp_aclkx,* ?; |7 F6 H- O8 L n. y, c. _
input axr0,
' _2 Q/ f3 s' U; O/ C
) J, x1 T7 I/ doutput mcasp_afsr,
9 b1 E7 X M1 l: {- J( Woutput mcasp_ahclkr,
9 d: ^% l- I# C% f4 d5 V. P Youtput mcasp_aclkr,
* E/ }1 Z; Q# r1 u1 c' koutput axr1, o+ s; D0 U) `
assign mcasp_afsr = mcasp_afsx;( e- R" N! w. B" M
assign mcasp_aclkr = mcasp_aclkx;
9 x8 t: `* I# Z) C7 @1 sassign mcasp_ahclkr = mcasp_ahclkx;
+ T. @' m9 b( G$ \assign axr1 = axr0; * J, F# @ [& O0 N! C
$ m6 x9 q$ f, i6 y3 u
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
; C, o" J! p+ b" `5 ustatic void McASPI2SConfigure(void)
$ U" ~7 H2 J& s! O{
7 Q2 l4 x5 W4 ?9 F1 M6 J! H2 RMcASPRxReset(SOC_MCASP_0_CTRL_REGS);6 i# {6 I9 B1 @, Q- _
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
- c' \3 b A; cMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
) E0 ?0 @, v: p/ \McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */$ e, Q" }) W7 h) V: h X
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,/ ~, g4 s1 v9 `3 T1 i) z
MCASP_RX_MODE_DMA);
% G" h5 \5 z1 u5 K$ v; sMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
! `2 ~+ l0 D% V% p9 HMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */1 |6 c2 V; S9 l0 `5 n- ?9 _
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, 6 M- G+ H$ `- Y
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE); W- L$ e& H" t! i& b
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, 5 i. Z9 p7 t6 B0 G7 D# }
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
, @$ I4 G5 y( ZMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);1 r* t; F1 p Q5 f! D- j
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); * L/ K: L- ~" U$ z5 y/ F+ ~8 i
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
8 | i2 k2 _1 g2 U4 [9 `7 K0x00, 0xFF); /* configure the clock for transmitter */3 z, j. w* a2 N& ^0 V% M
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);2 u& ]- ^2 c; H; o. T% k
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); $ V% I5 r( E1 u: r# D
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
) A& r* q( _7 x8 D: e6 D$ N0x00, 0xFF);
: O) w( a' g, ~4 R0 I4 j$ D/ v& c- u0 Z
/* Enable synchronization of RX and TX sections */ $ D8 C7 F$ w- {: J6 g, v$ Z
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */3 Q0 r& N& t/ R( B; w
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
9 v, w9 v* O; \McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
6 w1 d3 ?# G4 F+ f# {% D5 s" Y** Set the serializers, Currently only one serializer is set as7 @" v. i5 x( _# i$ Z
** transmitter and one serializer as receiver.
. q1 V6 h# Q5 p0 x* `- j; l& w- n*/0 K2 V8 S2 \; T. X) m/ }. H% h
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);7 m" Q0 k' N. `1 T
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*2 x: ^- {3 n7 D, a% r4 m6 K
** Configure the McASP pins 1 r4 K7 }, `* _. Y+ I
** Input - Frame Sync, Clock and Serializer Rx7 A% p) l3 u, o( r$ M6 s
** Output - Serializer Tx is connected to the input of the codec * u4 P1 q8 ^' w) M6 n8 J' F
*/" Y. i3 z; m- n
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
. W3 C% S. h. [+ H. HMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX)); ~: W1 W$ L" e9 I0 J
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX( d. t( }* _+ G7 R0 I9 ^
| MCASP_PIN_ACLKX9 ]( x( v0 Z+ E+ L) \
| MCASP_PIN_AHCLKX) Y2 D) r v2 u% l& R6 D
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
% j: g; K+ L$ g( ^) T! j" V4 z7 AMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
# R4 z3 R; I/ t2 u' T7 B| MCASP_TX_CLKFAIL
" ?- T8 m' L3 t9 H' |/ P| MCASP_TX_SYNCERROR
. ]0 L; f4 |, X- A$ F; l/ D9 ]| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR 6 s9 Z0 |, I* q1 F
| MCASP_RX_CLKFAIL
" m5 F, L1 L# F| MCASP_RX_SYNCERROR 1 A3 B& e* D. J$ Y( y
| MCASP_RX_OVERRUN);
O. a0 L, K( W6 D" F$ G* ~9 z$ O# k} static void I2SDataTxRxActivate(void)
" n; z# J6 |. a V{
* h+ o" i9 _% |% f* Q; v/ D, K/* Start the clocks */
, v/ S4 k3 S5 @7 }' N! {McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
+ Y5 \1 g" ] l$ M8 CMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
" i. D$ \3 O9 n0 K+ rEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,% I: S+ Y# z" \; ]" ^# t1 n! A/ ?
EDMA3_TRIG_MODE_EVENT);- v* _0 w$ d# w
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, & I& C/ }7 K' O
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
1 T) S- I+ w" ]( T6 mMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
5 O' D2 M9 ^8 ~McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
0 g3 I/ s2 O' u9 E) b$ nwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
% T% N7 {; X5 U. VMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);. y7 i6 T/ Y4 C0 J' l+ T. c
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
3 u2 j+ |- |0 z1 Y}
# t. |( m. C5 V# j- g请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
' f9 @* b, Q5 w* l |