|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,+ r' H; F3 A2 ?& E6 i
input mcasp_ahclkx,
1 S2 J. T# a8 [5 J1 H$ ninput mcasp_aclkx,- U* I4 O2 I5 e4 c3 A/ z) H
input axr0,
4 ]' C( ?2 V/ p* K, O3 C# W/ ]1 @9 d
output mcasp_afsr,, o6 X2 b7 [8 z
output mcasp_ahclkr,% x9 k/ u0 b, [. e
output mcasp_aclkr,! X6 I1 |% Y1 m
output axr1,3 Y0 x$ G; R; ~- v
assign mcasp_afsr = mcasp_afsx;
6 A) Z x; |- q4 w9 _/ q% Rassign mcasp_aclkr = mcasp_aclkx;
2 a- ]9 h( J' Y3 v! y- W( Gassign mcasp_ahclkr = mcasp_ahclkx;
/ t4 u4 i( m( I# |1 bassign axr1 = axr0; + l- C- N2 s' n8 A. k) n7 u( G! Z( p
/ s3 Y) W7 H. b0 m4 T6 N0 Q4 m% j* w
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 ( w8 G B0 U6 K
static void McASPI2SConfigure(void)
' f) L {0 X9 `0 |{
6 O. v3 w5 p/ s/ }' TMcASPRxReset(SOC_MCASP_0_CTRL_REGS);' E3 g3 ^& j/ w" m( p
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
5 J( X, ] A! e8 PMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
L; A9 Q2 q! f( s' XMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
2 a. q& @/ N" F- NMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,/ E" r' B( Q% c8 n: n2 j a7 b
MCASP_RX_MODE_DMA);: N: `. C& |5 ~- \# R9 a- x& t
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
' x1 O% s& H" {% c# KMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
9 D3 p9 z) l: C4 E+ h. JMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, - [. ]' c+ f6 B0 v- p5 N* g
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
1 j- h( Y/ S* E2 j. w; Y+ CMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
2 j# y% B Z2 p6 Q$ Y2 x5 [MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */$ [8 a) |: g! d$ ~6 P
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);8 h* p& j; r* ]5 W
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
8 a- j% W6 ]. V* P9 `$ p4 tMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
% \. Q6 \/ }* ~, t! {( a0x00, 0xFF); /* configure the clock for transmitter */
/ ]6 `9 z2 Y3 l8 M8 |McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);( K, u' j: |. }. _* {
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
; g1 r q3 Z, Y5 j6 \" \McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,9 [8 I; y9 w, H9 {5 e
0x00, 0xFF);
. {& a3 N5 O$ Z2 s, j$ J) ?: g$ W
8 _+ Y: |% l J' P9 u& H- }4 X/* Enable synchronization of RX and TX sections */
/ Q# s( G' z" s- \5 Y, sMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
2 ?4 F. {& c" A+ l4 p4 AMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
2 I) x. t/ k: EMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
4 J+ C6 a% b2 z/ t2 f; `5 c** Set the serializers, Currently only one serializer is set as% A* O4 K- y! ]! D" y/ W
** transmitter and one serializer as receiver.* S4 T2 K- s$ n: [0 J2 n8 F
*/
! l! a ^! S iMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
' }- y9 C% U; @McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
7 I; R6 b3 Q% J6 C' Q: {** Configure the McASP pins
" j- ?4 v. }' E* s** Input - Frame Sync, Clock and Serializer Rx3 e% m1 j+ w( @1 ]' W" K" s
** Output - Serializer Tx is connected to the input of the codec
4 p/ C, n; C& J( O*/
* y( |, [5 [( ~- l: I2 a6 f. r( j: W6 GMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
6 M v: D6 C' ~4 G* U' i0 I! gMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
) W0 z- {6 I1 ~' } n" NMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
9 V& G4 Q! U/ H3 G/ k| MCASP_PIN_ACLKX- k% t3 S' \# [* H* a
| MCASP_PIN_AHCLKX
6 ~. N2 A8 f; S1 H q# Q6 k| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
O" g5 G9 p- E! ]2 U) V" HMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR 2 S+ B' K' ~1 |
| MCASP_TX_CLKFAIL 5 g0 h ^9 |3 ]; l; P" q( q
| MCASP_TX_SYNCERROR
2 h& A8 |" P% D. R| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR * w$ J) `0 }3 R$ {0 B
| MCASP_RX_CLKFAIL% @ X# C4 {: X+ `; t* C
| MCASP_RX_SYNCERROR 7 f1 _- R5 s* D. d$ A w' J
| MCASP_RX_OVERRUN);
. I% [8 d( `3 u L, B} static void I2SDataTxRxActivate(void)( y u( O, n1 J8 o7 ]) T
{- x5 o* {8 \; }1 ]' h2 C- w
/* Start the clocks */9 b7 J" [: \) {8 c
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
' o- U7 U6 x( Q& H) PMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
- R$ B4 V+ Q' O6 C4 ?9 dEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,3 ]3 D1 j) N$ R
EDMA3_TRIG_MODE_EVENT);
6 z/ u5 @3 r5 Q1 V$ ?EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, 5 x9 ^0 R* p7 v
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
, e6 Z3 ]6 k' d6 [McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
6 a+ r8 e, i: Z9 \/ _McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
( t7 K1 P- h6 H$ y2 ~8 E2 S2 Vwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */: f$ z4 B3 v( \2 }
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);7 x) o- V1 p% o4 V' Q* K- h! a
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
4 S! B+ r* _* h# s' ~+ h2 b( M7 `} |; }! L, w S W6 x( d }
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. e/ K* K \% @/ }& o7 m
|