|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
' q% [! L* A$ R6 R) X7 z% Ginput mcasp_ahclkx,
' o; |% @. C& X: Oinput mcasp_aclkx,4 d# Y, X3 S& l( N6 W9 H3 O* \
input axr0,
: d4 I! ?/ p& ]) k- l. R! ^' `- G: |1 e' H2 | m* ?
output mcasp_afsr,) g/ B6 ?5 n/ Y7 Z4 S
output mcasp_ahclkr,' Z: l! s! _4 w( f# A
output mcasp_aclkr,/ l2 @! N0 O) ^* l5 @& b# I
output axr1,
, \6 Y+ y# a& [$ g8 V assign mcasp_afsr = mcasp_afsx;
% M% y+ N, L: tassign mcasp_aclkr = mcasp_aclkx;
9 S3 \) U& ~/ v9 T+ Q% massign mcasp_ahclkr = mcasp_ahclkx;
: } ^( y6 d3 x# |( J! J( G0 Kassign axr1 = axr0;
5 X$ K% S+ B, ] r# O
: x- E# l7 C* A( A在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 0 x2 s3 l# W& c5 ~+ i
static void McASPI2SConfigure(void) _2 }2 V4 `5 ]5 b( T' E3 Z- w
{# P( K4 ~" c/ I, z& b% y' C f1 M
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
! y* I& C+ F% ^8 C, A4 fMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
# x" y; l9 v8 J0 | Q( c. m3 {" G$ UMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);- f% `8 Q4 D0 ]7 H w6 ^8 d! \
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
( ?1 v. `0 N+ ]1 y1 x' _McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
2 r; A& e9 ?$ a: O- O5 eMCASP_RX_MODE_DMA);" B* H' ?$ y5 M/ V5 q
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,0 {2 W6 N) t) Q; R3 D# a+ n
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */* E! n5 o' C6 A( A) [3 L+ a
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, 4 e) y# l3 ]$ O% a: X
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
0 ?, T) {0 n6 C- `' `% Z3 y/ g9 _McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
+ g5 p' i6 m+ c# S* g( bMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
, z, u7 T% j' W9 w' T& GMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);$ t) k5 `# c8 @, m3 D
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
' x& x5 T. ~# B7 h& fMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
/ s9 i& N' U$ Z+ G. O( B- g* S0x00, 0xFF); /* configure the clock for transmitter */6 s b: f# Z M2 k2 s; F( Y
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);6 U& a+ @6 T" G. V( }2 c- Y2 [
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
+ u1 \) x- a2 K+ ~3 ?* |McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
3 ? ?! T, g3 k) t/ ?' y- x0x00, 0xFF);
: V" H3 M$ S8 `# p8 O' g( J
Z" G0 ]2 A9 t! N, H/* Enable synchronization of RX and TX sections */ 8 e3 f) C% Z% E% I, e
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
) s* k2 f. K( fMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
8 J K6 v e0 u- ^McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
- `" v' Q% O8 D$ h9 r5 c' T; t** Set the serializers, Currently only one serializer is set as% V* I2 l( W0 X( Q5 J
** transmitter and one serializer as receiver. t" X5 h, Z v$ B/ b4 ^, }$ I
*/
) f! M7 _ Q1 I, u3 pMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
) N6 ^; L# j9 E* w+ RMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
6 W1 t8 x( g% \- S( S9 t% Z S1 J** Configure the McASP pins & @5 ^0 I0 I( @# {9 I/ e
** Input - Frame Sync, Clock and Serializer Rx" ]; G# s$ F; T7 y* R2 g, d
** Output - Serializer Tx is connected to the input of the codec
: r8 I8 g$ q& O) h! x& z1 G1 E*/; n* Y/ j" f$ O& B
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);6 U3 R* N8 z& V
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
) U3 H& v8 S5 p$ KMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
4 d, o+ T0 u9 ~' |7 ]0 n4 ?| MCASP_PIN_ACLKX4 w) Z9 \% Z4 i2 x! _5 Q
| MCASP_PIN_AHCLKX; A* Z' f8 }2 X; Q& s
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */- b5 J% ]( U2 i
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
2 |2 Z" \: R' g7 K) f| MCASP_TX_CLKFAIL 2 j4 e; u; Y/ N% n U
| MCASP_TX_SYNCERROR
. d+ F4 l2 f( {9 a0 o( M# w| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
8 D5 W, v. H4 q1 H9 s) g, n4 h| MCASP_RX_CLKFAIL: p" y* q% D( k N/ j/ u1 h: T
| MCASP_RX_SYNCERROR
# ?; X" }' p# e. d; l| MCASP_RX_OVERRUN);& P- m5 K* v( n+ r
} static void I2SDataTxRxActivate(void)
& I4 i7 X: q' D{- O. q' q0 Y; s; C& l" R0 |( l
/* Start the clocks */
" Z. X5 L9 j: v- |( f0 _( q5 ^. XMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
8 f2 V( Q& ]( G, GMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
) {5 q2 K1 h3 P% [' tEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,% k, `7 s h; o I! k
EDMA3_TRIG_MODE_EVENT);
, I8 p2 l/ A+ H& dEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
! t! I; J, q+ q( y U" BEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */5 Y$ X* b; h" V0 l8 n. w' x/ ]" K
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);2 N2 s3 {4 d0 b6 s7 g
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
: u4 K6 V5 F5 twhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */- f* o) `, @' Q. R+ ?& W3 U
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
( X' d: B9 `2 f+ D: K2 o; z% yMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);+ f% I) @) ~! j9 I3 O- i
}
J; h$ ?+ e* M! I$ g9 M$ a请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
: N9 ~0 w# c1 Q9 j$ J9 t |