|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,3 P( }; C% v0 l: _
input mcasp_ahclkx,
# Z" Q8 R% ]$ S; N7 hinput mcasp_aclkx,
* h o; K' T8 v' {input axr0,; H, [9 Z/ G% r
' D, W9 q3 q2 V2 h8 R; ooutput mcasp_afsr,
+ q0 S: F& h" b( _1 {( Zoutput mcasp_ahclkr,
" Q7 a) A9 T0 S8 | m, ooutput mcasp_aclkr,
& d3 _$ E9 _* O+ A# d* i$ X% Eoutput axr1,0 O& w" r* H5 s3 j
assign mcasp_afsr = mcasp_afsx;+ @5 `. l { L' I9 ?6 r$ G
assign mcasp_aclkr = mcasp_aclkx;
5 _6 ]' Z: g0 x& I" Z; ?. Aassign mcasp_ahclkr = mcasp_ahclkx;! K- M' m& I; j! `% a7 m) H- p
assign axr1 = axr0; 7 ?6 i3 G% p* |5 E2 Q! \
0 N" {% d: F4 u4 {
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 X! H6 ^ _3 S
static void McASPI2SConfigure(void)6 `- ~; R/ d' X
{- }$ t* C3 I$ x
McASPRxReset(SOC_MCASP_0_CTRL_REGS);( V2 ?/ [4 f1 R l* Z5 G9 E3 ~6 R
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
3 T$ R1 F. p5 w6 U" uMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);: w5 p( M* P* X& I# ~- _6 C
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
" C! r2 ]- q; _$ zMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,6 P8 K2 c, Z4 d: n- B
MCASP_RX_MODE_DMA);
/ `# [( |. U$ c! J" |9 J- z$ nMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,! ]) `8 A* q; f7 @ g
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */% J+ P# A# B$ ~- G, I `
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, , e; g2 P6 k. g* ]! j7 t0 D
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
' J( A; O& V# R2 n8 O) nMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, : I8 ~: y6 a# ]2 e
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
# ?/ s k2 ~: s' R" l+ ]: S$ M3 i4 dMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);$ L5 W% C8 z* X! x" C9 e; F
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); " X Y3 H% b* Y% f: k
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
% J- K4 d6 ~$ |8 @& Q. G0x00, 0xFF); /* configure the clock for transmitter */
; k+ X7 s2 O0 `6 HMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
. ]6 J* z2 |$ @6 ^/ g* T; G* `' `McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); 2 B3 V, P& x4 I
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,2 L0 k/ R' h% l q$ u
0x00, 0xFF);
- h# L, L! f8 y% }
& i4 s& O$ t. U# {+ P4 e P/* Enable synchronization of RX and TX sections */
3 Y: V8 O" O/ R4 }( u) k1 iMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */- m Q6 x2 A: L. [7 e( y( K
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);" U9 R7 R# L9 G. ^7 ?9 ? `
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*1 u$ ]( x# b. b" F% d& N; D
** Set the serializers, Currently only one serializer is set as; z( y# `% l" U6 F5 c# K. Z, G
** transmitter and one serializer as receiver.$ k$ _$ J2 `! F" W9 o
*/
6 p& j4 U1 ~, W% ]0 D6 `McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
/ d4 i! r1 e: T1 tMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*5 a& n! e7 M4 C! N' d
** Configure the McASP pins $ T8 d( F/ m0 M8 G: a1 Q5 p
** Input - Frame Sync, Clock and Serializer Rx
3 H3 s1 t( x- V% N) _9 T** Output - Serializer Tx is connected to the input of the codec 4 A$ M3 F( \. r6 y& H9 c3 C' I# i4 [
*/
* J4 X4 S- l* r0 z0 G x9 e% L8 FMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
( a' x" d2 k5 B; V1 @! Q; A5 Y! ?McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));- R7 J2 L0 z( u& x5 Z
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX A: Q! w7 t! f
| MCASP_PIN_ACLKX
" f- H# l' M5 g' Y$ [/ C" K& k; d| MCASP_PIN_AHCLKX e0 a9 S' `' k: a7 b8 [
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
% y/ g) e* y) hMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
' ?3 e4 L R* C0 o$ c/ f+ `| MCASP_TX_CLKFAIL
$ s8 u4 Z$ B! ~* M6 @5 B| MCASP_TX_SYNCERROR+ f2 E1 ~8 b7 u
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR $ ?) Y4 ~" d' D- e/ G0 S
| MCASP_RX_CLKFAIL' }% L9 ]8 m# Y) A
| MCASP_RX_SYNCERROR ! E/ _) i, a0 _$ r+ D
| MCASP_RX_OVERRUN);
/ j% f Y: p5 o G} static void I2SDataTxRxActivate(void)
$ m4 c$ }, f v, A, k- s1 B+ ]) G7 z{! F5 v8 l$ B. u! C% |; \* {, g
/* Start the clocks */
6 D* A. B8 l/ w2 S5 {McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
! {8 |1 F& ^) L2 ]0 BMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
8 U% l+ r5 k r# EEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,1 k! y! U5 B6 P
EDMA3_TRIG_MODE_EVENT);
9 z$ H: J* B2 b- T. _( f+ `EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
2 I& j( R; }3 {+ u6 K0 OEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */8 s9 d9 }) g% E. n% l" f
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
9 y. \ F+ u# ?; I4 TMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */ _* y. ?4 p' t- f1 m: u
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
! l- _7 i, g% x( Q! Y3 {McASPRxEnable(SOC_MCASP_0_CTRL_REGS);& u0 m1 Y* t: [! I; L* v
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);+ z8 S- {) q6 ^% @) J, m
} 4 e D: U3 \# K9 M
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
. Z) O9 L* |& k n: I7 q1 O |