|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,% l- @; B4 Y% m' _
input mcasp_ahclkx,
! u1 }+ J: e8 ]- E! c5 yinput mcasp_aclkx,
* G: X' |0 x* r; uinput axr0,
- a& F, y6 [9 H+ b( k P+ u1 Z1 T6 u+ Y: h! x2 z. H
output mcasp_afsr,
9 r5 Q6 f5 y! e' ?# Doutput mcasp_ahclkr,/ ^! s4 Y; y2 F
output mcasp_aclkr,. y5 S5 L% f/ F$ Q0 A0 R: L
output axr1,1 j+ ^% G$ H. c8 L/ F6 ^. z& o
assign mcasp_afsr = mcasp_afsx;
/ O& U+ C+ l; B$ {5 Qassign mcasp_aclkr = mcasp_aclkx;
' w( ?* o: d1 f+ |0 ]7 H) Uassign mcasp_ahclkr = mcasp_ahclkx;
) B- ~6 ^9 H$ _ e+ n$ _$ }0 bassign axr1 = axr0;
1 @4 N. S* ?: T" _5 T+ w9 }
" l: x0 \' G2 R4 P: {" X在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
- d/ ^2 P% U% z) H9 gstatic void McASPI2SConfigure(void)
- k( V( a# }: x, T \+ ~; B{- n h0 Q0 I5 ~4 G' C
McASPRxReset(SOC_MCASP_0_CTRL_REGS);; F' V6 h9 W( K2 f0 U% ~$ W1 W3 U
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
7 ] r6 }' w! o4 rMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
0 d# [4 c5 W/ N" ]' h XMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
. R" S" j4 d( i3 `McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,! m+ ?# e+ U/ D
MCASP_RX_MODE_DMA);: s% `! o6 N C, {, t6 i2 D! d
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
7 Q* x6 Q' Q }3 j- ZMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
; N9 Z2 p9 q: E) }( gMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
9 j5 I! X% O tMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
# g, U# N1 I, z& H7 V- |. FMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, 1 G& ~# J5 h8 _$ X/ k1 r( ~
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
" V5 R: A! u2 J9 b2 wMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
' {% k) r/ ~. C; H& d- aMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
% F; `; a# f+ o. [, O* l1 yMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,' A/ G5 z+ V. ?8 @6 x
0x00, 0xFF); /* configure the clock for transmitter */& b% h, l! x$ ]8 ~; m f9 a' Z
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);& e+ u# j# i$ ?# S; m
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); 6 V- [! x! _* }: }% p
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
/ L: B' S2 o, Z# o4 k0x00, 0xFF);+ ~% P9 k6 R: r3 A j+ B
, t$ R8 R7 s) N, j8 ]+ r/* Enable synchronization of RX and TX sections */ ) H2 J4 r" w( X, o* O: b5 n
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */8 }& l" c6 q }
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
: C7 W5 N% L4 m8 U$ PMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
1 g, T9 A( Q( L- U** Set the serializers, Currently only one serializer is set as3 E" p2 l+ ?0 Q6 i' ~8 D
** transmitter and one serializer as receiver." c" L* X2 `- U) z
*/; R0 f4 e3 u6 g2 g
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);/ u% D6 s4 ~1 X# i
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
% u, h- n6 [+ {1 e" S: B** Configure the McASP pins 1 f) U5 x/ d6 g0 b' G8 p# u2 D
** Input - Frame Sync, Clock and Serializer Rx0 n/ \ C9 [& V( S$ z
** Output - Serializer Tx is connected to the input of the codec - v) ?, c- i& r' j# l) L
*/
/ K; l" K' m& N5 A7 ?: _* lMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
; d7 l8 K6 _" [8 V# T" n$ [McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
+ t1 w% V& N& t) UMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
7 j. e: p7 t. w| MCASP_PIN_ACLKX* J# z7 P% y, P s# }+ h6 r
| MCASP_PIN_AHCLKX
9 f( y1 p/ I& n| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */; P0 n$ s& n }4 W2 L
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
, i2 G# v i/ k+ c| MCASP_TX_CLKFAIL # v) k' C. d( i7 |2 _9 X
| MCASP_TX_SYNCERROR& P4 W8 o( ~8 L7 L9 Q
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR " e' j) x1 e n& s8 T
| MCASP_RX_CLKFAIL9 U) |5 y/ d( q$ V9 T) |9 z
| MCASP_RX_SYNCERROR " A* v, r7 O: B
| MCASP_RX_OVERRUN);
4 v% e! ?( Y3 |/ O1 ^. n) ?0 ]} static void I2SDataTxRxActivate(void)
6 {( s# O$ p2 m( M{
' n. G& _7 {+ t$ w+ y4 ?- n9 g/* Start the clocks */
( ~: |4 ~ X. v" q4 V" ~- q9 WMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);+ X# P; F, f$ u2 h
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */- i7 k. n% |7 D9 X- t
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
# l& a# K5 z, F, pEDMA3_TRIG_MODE_EVENT);! W4 Q! y, Z- n. b) G+ L' [% y& x6 o
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, 5 z, c: w& h. o0 ?
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
* I: ]8 w. [% mMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
6 R% q# t. a/ g1 n. e4 s/ h( TMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
0 V) d6 T. c4 K- v+ ~9 j7 |while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
! M9 L2 C4 f/ A* u6 M- |McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
* e; e {7 A5 t8 b3 R6 k4 {McASPTxEnable(SOC_MCASP_0_CTRL_REGS);" ~0 V4 {+ B5 L3 l# i; @
}
% k& h6 T( k$ X$ q' R" T6 y( Z" j请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
8 z& H6 s1 L: o# ~& p |