|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
5 G7 h3 F- |+ f0 T# p' kinput mcasp_ahclkx,' n% X* I* `( g9 w2 M7 X' ~6 v
input mcasp_aclkx,/ w6 b& O9 |5 ?8 G
input axr0,4 F7 C6 Z) z8 V5 u; i/ ^1 }
, [( }$ [# S$ x' y
output mcasp_afsr,
; K7 l/ m' P, c& noutput mcasp_ahclkr,
) _$ _- b5 z& `6 ?: Aoutput mcasp_aclkr,
$ J9 k6 v. E* k7 ~( k# ] Moutput axr1,$ N0 x) v6 s5 a0 A5 x. `
assign mcasp_afsr = mcasp_afsx;
$ G* ?( }. P5 `, h- Q; i! Nassign mcasp_aclkr = mcasp_aclkx;
! Y X6 o, K7 U6 a6 |assign mcasp_ahclkr = mcasp_ahclkx;; ?+ Z; f: @/ u/ a9 }# D: S" u& E
assign axr1 = axr0;
1 Z. J# p# g5 e E/ x% h* W) P' ^; C+ B: K
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
7 N( W% d. G7 j* d0 Q3 p o" Q+ F; _static void McASPI2SConfigure(void)8 g7 O# A ^1 a, f. K
{( _% a/ f3 }! f4 V7 v+ A
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
% H. }7 z! C9 x0 c) p! a' XMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */5 L+ B$ u; i: Y" [1 s% _
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
. X2 w% n% ~1 j9 I5 \McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
5 R8 b$ D( G/ f6 P& j; V. jMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
" U7 d* |" W5 ~. QMCASP_RX_MODE_DMA); \8 u% q3 t) x4 @$ O- G
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
# L' n" u8 d& s/ `MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */$ D& l: ^7 q3 K3 [
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, + Z% O0 B( G# n: [
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
% T& l+ \/ ` {% HMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, ( z7 }2 I, F* R
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
9 n) |$ d. g# E" V* A- i7 vMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);6 M) s0 D: V% i- L" T
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
2 L6 n2 ]/ [6 m0 U& {( {9 _! [& DMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
+ h# c1 a: R: T( k1 \; l! `! F+ _$ J: a0x00, 0xFF); /* configure the clock for transmitter */
2 W7 l' H' {: j7 EMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
$ w( @+ @( B9 H% l5 d( DMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); ! g" y0 W, x; _
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
9 t" L. H) a8 p0x00, 0xFF);
( g. X. N' Z$ P$ ?% ?0 g' ^
& H; P w' K1 m7 a; w9 E/ g6 B/* Enable synchronization of RX and TX sections */ - y4 I2 a4 G( e9 J# x: i
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
, ?0 S# J9 r3 t4 M9 ~. ?) _McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
! |% c4 g* b" `9 G9 K0 eMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*3 A9 y' `$ {- h- g% l2 e1 \$ Y
** Set the serializers, Currently only one serializer is set as: i$ x8 B) W- ~
** transmitter and one serializer as receiver.7 X8 @- B0 i' x. X ^( A
*/
0 L0 |, U$ @1 {% b% ^7 E7 g1 xMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);) _6 ?/ J" d) k3 t5 c! s
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
/ o, G- Z3 n" x/ q/ L** Configure the McASP pins
) Q ?3 V) Z( l) E** Input - Frame Sync, Clock and Serializer Rx- i( d2 }2 h, \7 c$ [" Y$ G
** Output - Serializer Tx is connected to the input of the codec ( n+ C5 _3 L! h& Z
*/ c2 L; W7 L5 t+ H7 `
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
" ~2 U2 P5 s/ Z' JMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
* t8 d" W( g- P, }; n+ O# iMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
! `+ G# A, W' f7 T# w| MCASP_PIN_ACLKX
Z& E ^5 J8 C1 c( g% O& d7 a| MCASP_PIN_AHCLKX, H ^" \# u0 V& U* J# P$ I
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */: R K) e, a' V8 ^. S) n
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
: f; u6 R' g. s: x! Y# H# R3 [| MCASP_TX_CLKFAIL
8 W; d8 n+ l: X* O h| MCASP_TX_SYNCERROR
! s* D: {& _- n- Y* `1 o- @| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR 7 `+ z6 E% q) }; N; r: u
| MCASP_RX_CLKFAIL
1 a4 X( j# E! x: V: D+ W| MCASP_RX_SYNCERROR 6 V" @3 J, c( ~& Z/ R
| MCASP_RX_OVERRUN);
0 }3 ^0 b6 j4 b, {. Z} static void I2SDataTxRxActivate(void)' h& H* r5 x, n/ P
{- h/ p( N7 D& a
/* Start the clocks */
) b* Y$ I1 B# I4 AMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
' _% O4 A( E5 y% m) FMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */# Q. I9 n6 L+ i z6 z4 ]
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
: r# z9 x, T# I3 EEDMA3_TRIG_MODE_EVENT);( [! e9 J9 K* E0 m; b
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, + ]/ u4 N! j1 ]. S( D% H! T
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */! @2 x0 u9 e+ F- m' d3 Y
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);$ G' T, h! E. w* L7 t6 x
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */& x: T+ L6 }. Q* ?2 z! K
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
# _9 g- X/ a5 E5 V& C# YMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);% R7 D) Z/ R# p0 M5 K+ ~; ]
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);1 z1 J8 ?* I. Z
} 3 C6 [- D& O' G) ^) q
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
! r6 J9 Z4 z4 C0 C |