|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
( A/ {5 ]8 b% b3 O9 einput mcasp_ahclkx,: l: Q7 g4 `+ q/ |* [, e4 \
input mcasp_aclkx," ?, z8 S, t5 P. y% \1 W% j
input axr0,; E3 T9 u- W- U3 ?
1 g% N d! y- Z( r' o1 T* h- qoutput mcasp_afsr,/ G: `( K* _$ G
output mcasp_ahclkr,
) q. ?+ ^& d! q, ?) H. Loutput mcasp_aclkr,. ?$ q& f9 a: i& c: \- {+ b+ C
output axr1,1 s* G; _/ a+ p) O* t& W
assign mcasp_afsr = mcasp_afsx;' G) C( d4 i1 o3 L8 V
assign mcasp_aclkr = mcasp_aclkx;* F+ j% Y* v8 A; K
assign mcasp_ahclkr = mcasp_ahclkx;
3 u: K, f1 G& w" oassign axr1 = axr0; 7 t0 K. O2 U) ]" [
- F/ v6 e* j$ p1 ~. b$ \在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 9 }! r: W: }( m) l- @8 P
static void McASPI2SConfigure(void)
4 a" i* e/ N' }% H- R{7 Z, X* z& k; U1 G6 I
McASPRxReset(SOC_MCASP_0_CTRL_REGS);2 L0 @, X' V8 U( ` P! M8 E3 P/ _
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */5 ^$ r3 x' T6 _" E
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
% g$ p. I7 M9 g S! N) ]McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */' Q% e5 T! b" E9 k' Z( k3 }; u
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,4 x. g Y$ }4 L, F l
MCASP_RX_MODE_DMA);
* F. | T& e, |) z$ w( MMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
5 `3 ]8 x+ V: O/ Y9 ~MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */& K6 B' R2 [5 p8 @
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
* T3 S" e. V) v* [3 `9 @' y. pMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
( l' R& ~" q6 Q4 d( pMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, " c4 A( p0 k( D* `, R6 ]
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
" i) G; v& A5 [ T" Q; o) Y& V: ]; JMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
# k( G5 B; K3 v+ [( t/ NMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); ; Y# [! a3 U/ T9 g0 X
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,! h- T W% y* }
0x00, 0xFF); /* configure the clock for transmitter */
% u7 f* d$ `5 m& L& UMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);7 h3 x) y' M5 ^7 {& H
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); 3 B! K5 D( d! ^
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
, i; ~1 J0 M2 ]9 C9 v& V+ a" {' y N% w0x00, 0xFF);
8 Q0 D2 F( P7 U' @0 ~6 v
2 d3 z$ a: S4 x/* Enable synchronization of RX and TX sections */ & M7 f) ^% N+ F0 ]* @4 i
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */; B& W' h5 S& j% r; a3 Z
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);9 x4 E) i0 m$ c0 W9 K! U
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
5 ^* ?8 u9 G* h" J j. k# n** Set the serializers, Currently only one serializer is set as( V7 U( L. r: r; R9 I1 W
** transmitter and one serializer as receiver.
2 f8 s4 N2 Q) G. A) |+ X6 Q: B*/5 V1 |6 K7 b9 A. y
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
1 U$ Q' I$ ?* S* ^4 ~# WMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
/ L2 q- A( Y4 i+ a2 L& J2 M** Configure the McASP pins / G, b7 Q1 B1 |; M! K0 \, @
** Input - Frame Sync, Clock and Serializer Rx; s# K- d0 G7 `9 a- d, q" J+ _
** Output - Serializer Tx is connected to the input of the codec 7 ?4 ?/ Q( w! M1 i) f
*/
5 g' p0 D% w' UMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);8 l, T* y( F3 t( O
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
1 N5 B& C* U( X! m# h; eMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
% D# i& ^, P* N+ |/ O6 o| MCASP_PIN_ACLKX( l0 N9 f. G' z* l
| MCASP_PIN_AHCLKX$ L, Q) G2 i/ T1 H( `7 D5 l
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
7 i1 j* Z4 p- H1 hMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
2 c* C- }7 F: B. W. a| MCASP_TX_CLKFAIL
* O& `$ u9 L: s2 B( N5 v! K| MCASP_TX_SYNCERROR/ O A& L! N5 G; v* E: @( W
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR 6 J6 ?4 v: m# a5 }1 }
| MCASP_RX_CLKFAIL
! ~) z# I" A7 U| MCASP_RX_SYNCERROR
& E f5 Q* b; a# Y- g| MCASP_RX_OVERRUN);
+ J. A+ Q8 P+ w5 v& F( `0 i+ _} static void I2SDataTxRxActivate(void)
/ ]& v. }5 D' r7 q{
8 n8 g/ e5 u5 `# h6 C5 t2 g7 ]/* Start the clocks */
4 j9 ~& l/ U) qMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);. N( G, k7 u: q- L/ W# \
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer *// z/ Z/ y4 _9 a5 [
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
! C) A7 v2 N! \- XEDMA3_TRIG_MODE_EVENT);
. L/ K6 H9 V. i: f# m# n3 zEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
) c# s+ y) {# |/ a6 @EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
3 D8 m) d: I3 K4 z* l9 K* LMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
( R; A$ e: ~4 h! DMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
0 U+ X4 r8 W; c# o) d) [3 X. S, xwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */! J+ C) V$ K$ @. I! N
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);6 `- \! K7 d- h* z. m; W: w
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);' B0 C2 l; B% J, V; K D0 \5 W
} " g/ k$ b+ a b- \0 E
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
6 F7 O$ E+ i- |$ `6 n# G0 v) Y; \7 u |