|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,7 c ^. r* b2 Q3 v
input mcasp_ahclkx,6 R1 o) n( A8 k% ^3 H8 ^% @
input mcasp_aclkx,
& A( L7 z5 t; u4 Uinput axr0,
3 U6 E7 {8 M) C) Z% L/ @
8 h. ]( g0 R# s- Ooutput mcasp_afsr,
/ Y: _+ s% {; n. ]output mcasp_ahclkr,- n2 x. N% s" k' V2 n% F
output mcasp_aclkr,
0 q# k( o! u B9 L% Boutput axr1,
4 `, g7 O5 H6 ?1 g" [3 D" X5 U8 d' K/ x assign mcasp_afsr = mcasp_afsx;5 |7 A- {! z7 e$ F& E" y2 t# w3 ~
assign mcasp_aclkr = mcasp_aclkx;
4 Q( G) i7 h# m/ |" \assign mcasp_ahclkr = mcasp_ahclkx;; X. ~/ v6 c2 c) y5 _
assign axr1 = axr0;
) l# N- t) S" V, C! c3 y4 F7 {4 T5 C1 P: E
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
' H9 l8 I8 _, u& m5 Lstatic void McASPI2SConfigure(void)" Z. `; {* G7 @7 h: \, h
{' C, p2 d; f9 o$ B. u1 A
McASPRxReset(SOC_MCASP_0_CTRL_REGS);7 g$ J! B! R: n9 n7 Q' Q `( g
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
" }- M# v3 l+ DMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
' X) `2 i2 U* J0 _McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */! s! w) r' N/ y9 _
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
% p/ V" E4 p+ f- Z; `! hMCASP_RX_MODE_DMA);" _' S9 H4 ]- N, K7 s' U5 @
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
7 s# Q3 U: [& o) Q' a5 B" eMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
$ b( n+ b+ k! J' ?+ `% hMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, - w( W, ]5 C4 Y
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);3 N5 g. A& W3 M$ k" P8 C# M3 w) l Z
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
) r- M/ T$ f) y# Y6 R9 SMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */, U- V+ Q% ^8 r: Q( h2 G0 A
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
+ G ~% ]% ~, S E' s U% r9 B qMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
$ k5 S: C1 Q* ^2 O. WMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
. f' ~% s; ^6 E, v" X0x00, 0xFF); /* configure the clock for transmitter */* ], I+ Z/ a4 O: N: I
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
0 C6 k! \7 I3 qMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); 3 a- s" N. w# {- h/ O$ k7 o9 U( q
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
& R: W: F! e: J/ t+ n! \0x00, 0xFF);
; z3 R3 U3 @) `2 A5 \1 j" F5 A5 Q' X2 H/ o# i
/* Enable synchronization of RX and TX sections */
+ W( ?& I3 J, N$ c) V. ^. mMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */# j! Y. H8 N' [; `) o4 P
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
8 C# }! A9 |* y0 J( M! D& yMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
4 ^ O; c0 l2 T0 i& W** Set the serializers, Currently only one serializer is set as) B9 _( I$ B# D$ }
** transmitter and one serializer as receiver.2 j! Q* h9 N- |
*/3 L8 l# c' n b
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
7 G6 C3 q5 G1 q+ c* }$ bMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*9 t5 f6 ^$ k, U7 L( J. A
** Configure the McASP pins
) S. X5 l2 I% l4 K** Input - Frame Sync, Clock and Serializer Rx
# r7 N& g& k4 v( N) k6 `** Output - Serializer Tx is connected to the input of the codec , j, i( V$ E- _! i* o5 c; J7 r
*/
: Z7 {( G7 }2 g& b! FMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);. n8 m4 Z( ]' a% [4 {4 _
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
: ~& ~. p9 Q) M6 ?, [4 TMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX2 J" D' h8 t( B: @. r- i: R
| MCASP_PIN_ACLKX: Y" D3 T( n1 S
| MCASP_PIN_AHCLKX
( A# g# e3 J# m" G3 W% J+ k| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */) C9 U$ I8 U5 U( e! T! y
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR . d% ]; O# q$ ]
| MCASP_TX_CLKFAIL & m. G8 c+ f) E# Y9 { N
| MCASP_TX_SYNCERROR
4 v- b& m8 C9 u| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
_/ z \, C, e' P6 d8 v+ U| MCASP_RX_CLKFAIL
% w: ?& C; M: t" R& D! s' v/ S| MCASP_RX_SYNCERROR
/ z- A4 A; t D| MCASP_RX_OVERRUN);; ?' w7 t8 @1 |. O+ }; J6 F& q
} static void I2SDataTxRxActivate(void)3 T1 l5 Y; E- U6 s; r, N
{
* ]5 g" J7 q: a, O) @1 {/* Start the clocks */
8 H5 \( n+ z* u% X: hMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);) b9 {3 Y4 p+ |" ]/ O p6 D6 c( Q
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
) g; y/ |1 }" \0 u- s. {. ^EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,' I. Y* C% k: `' s
EDMA3_TRIG_MODE_EVENT);! q4 x4 Y0 I4 o- W
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, Y O: `0 ?: D8 j, x9 T
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
+ U) d/ r* `; _9 {2 aMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);7 j% b" C2 R9 J: P6 X& m: i
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */0 j7 X+ }, c. E0 I) y! k+ j. \
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
3 Y; c c! Y3 P$ n0 UMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);* p. E9 h8 k7 N/ ~
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);! a: E+ X. B! m: v# U
}
3 f, ]& K( N+ J: Y2 L请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. 6 }9 c) @: |. C& V: T$ a9 B1 T
|