|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,8 m- j5 N5 ]* E& i( h
input mcasp_ahclkx,
# y0 R% m8 G) s! jinput mcasp_aclkx,+ e% I% B6 Y7 h' [7 X
input axr0,
2 ^- a @1 `3 U& V& |6 @9 Z) z7 N' k. Q3 s5 J( |
output mcasp_afsr,3 E1 _' t1 u) T! n
output mcasp_ahclkr,: [# i, S% @! U g! c6 F
output mcasp_aclkr, l! H6 x3 Z+ b+ d! G( P
output axr1,/ }$ T/ X+ M% O$ i6 \& P
assign mcasp_afsr = mcasp_afsx; S/ S' G G/ M. y& D% ?9 I1 j% e
assign mcasp_aclkr = mcasp_aclkx;
$ U! c5 i* F$ E9 _( Bassign mcasp_ahclkr = mcasp_ahclkx;
, ]2 }* S7 ]6 jassign axr1 = axr0; 8 T0 ?" n8 v4 ?9 G/ a/ n3 A Y
! Z8 {$ F5 f- `( w, e! A: G
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
# t: `- K# Q& `static void McASPI2SConfigure(void)- }+ _3 M! S6 P- y, W% W9 {/ n. {. N
{
% R' Z* r* h$ V) q$ L9 v. FMcASPRxReset(SOC_MCASP_0_CTRL_REGS);/ M4 C- R0 O* |' ?. t& h
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
V' N6 u: Q5 Y3 V* dMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);2 f8 ]4 j# \' P5 k+ `) [5 M0 K
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */1 C4 L: } [. C9 A- ?$ k
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,, X+ f- o* f! B
MCASP_RX_MODE_DMA);/ d5 p. q/ R, Y, T' ~8 m4 X! ?
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,( {# h+ e) J3 y9 F! _
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
q& e- ^6 N! ]8 |1 n* YMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, ! p4 _7 w$ C; p Q: C
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
; i5 B0 ~* ]8 GMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
& |! I6 P1 C( ?. DMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
# V0 ]3 J! G6 H1 Y, n; f; S2 xMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);% T J' ^1 c6 |6 n* @5 w% g# Q
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); 4 `! {& [* Z* U& K" |
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
" f& _3 j: ^9 Y0x00, 0xFF); /* configure the clock for transmitter */
- q0 H8 ~2 W4 r5 h3 eMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
9 f1 `2 p& X4 n8 uMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); ( ]) T& p3 E' w; Y: Z, Y
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,5 E* _5 b4 G+ R5 e5 C7 e% z
0x00, 0xFF);2 q. f- G8 z/ S' F2 p
1 [ I8 M+ W: [9 _% S/* Enable synchronization of RX and TX sections */
$ w8 L( a. I* L& H$ hMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
8 j6 v; R9 p M- W+ ]McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);. r; a9 b* X9 T
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*0 i1 [6 l5 T; _4 a6 I
** Set the serializers, Currently only one serializer is set as
7 {' D6 h& |+ k- O3 n6 ~# q** transmitter and one serializer as receiver.
" |$ R) r# I- a; q1 _) a: z*/
: k# t; \# l2 D8 q% o' r/ _9 m3 f, ]% HMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
6 B" C! {, k0 |McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
! d6 h2 t% q) c/ `** Configure the McASP pins
$ G' b: L' }* Y1 K) Y" g; E** Input - Frame Sync, Clock and Serializer Rx8 W I# i! D/ {6 T3 n1 k" u" f
** Output - Serializer Tx is connected to the input of the codec
, v/ K% X" D" G: F; A; N*/
+ n. X& v" S5 y! o- l& m% YMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
& v1 G5 ~& Y c. a4 G! B+ W0 B6 _McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));# j% [8 o x5 ]5 D. r
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
0 A6 @$ D) W4 x$ C| MCASP_PIN_ACLKX
5 Q w! z1 ~4 J( a5 n. c| MCASP_PIN_AHCLKX& p7 C9 |8 O. B: J9 N! w
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */; }1 {1 M3 I, }/ r
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR & G& m( B% o2 d( I) h
| MCASP_TX_CLKFAIL & y$ h! Z [( D; p+ O# g; ~
| MCASP_TX_SYNCERROR1 S/ ]% K% l, ], S3 z& j. B O9 Y
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR % r l/ {0 ^; J* H3 T
| MCASP_RX_CLKFAIL
1 ~+ C; x( D4 i. z| MCASP_RX_SYNCERROR 8 A |+ W0 q3 K0 Z. F! H( l
| MCASP_RX_OVERRUN);
1 t7 \( J3 g" G* }: u, D} static void I2SDataTxRxActivate(void)7 ^2 \) y! A' P1 X6 x1 t
{
' n. E/ \5 q& q K! J/* Start the clocks */
, }' p7 A' {. LMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
; `9 f2 i/ r! w/ |McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer *// F8 H9 K" y& ^; E
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,' H! s# p' p/ x" b
EDMA3_TRIG_MODE_EVENT);
9 t) @6 b; T9 h& iEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
& h1 \/ g9 z5 R& \) q/ P8 m/ OEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
+ I9 Z) C- _" f3 m1 V- e$ g- a- U |McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
5 @4 g) w" ^$ z, mMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
" h4 Y, k) l* X/ F" C1 Bwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
; N u) n; f1 o5 LMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);; H$ ~. n" E9 [; T% H1 F
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);: C7 E, z( s {4 V6 c+ K% u0 W2 f
}
# C1 { Q( L3 m1 w8 N. G请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. $ U1 L/ K2 ^! V
|