|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,7 q0 R1 S; d( @+ \
input mcasp_ahclkx,
( w* R' X7 |. h+ O: m8 a2 G& cinput mcasp_aclkx,' @" t, W, F6 k' u
input axr0,+ ~ w/ C- E! a- x( p# y: ]* e5 x
; h+ W2 W3 b0 F* l' b# O; {
output mcasp_afsr,
$ C' }9 _- ^4 F5 N) Joutput mcasp_ahclkr,9 f& `# p# _+ D3 n+ W% G- {; @
output mcasp_aclkr,0 f5 i5 c/ Q; E2 Y( w
output axr1,9 h4 u' Y+ R( r6 m! V; |4 ` D* W
assign mcasp_afsr = mcasp_afsx;" @# t6 \: Y4 h; x
assign mcasp_aclkr = mcasp_aclkx;
- _* u* J* ~) q8 ?$ Y5 w! |assign mcasp_ahclkr = mcasp_ahclkx;2 |; m [4 V, v+ A
assign axr1 = axr0;
/ u) K1 {: z9 x- Y e: G0 D+ Z# J
) T5 \( b+ u& Z在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
" E7 F. i) |) J, r [' Y P9 qstatic void McASPI2SConfigure(void)/ _6 U3 D [+ z. R% W
{
6 A/ c/ s" n% k9 }# NMcASPRxReset(SOC_MCASP_0_CTRL_REGS);8 L' _+ _' ?" T! g4 x; X* T4 M3 m
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
U8 q; M1 o# `0 yMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
; j G$ F8 r5 v4 X% T! k8 E( pMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
3 l9 }5 q0 M5 P+ p# HMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
. u$ k' A! |1 dMCASP_RX_MODE_DMA);
1 \ G% H. G; H. JMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
; f) J6 ^4 o, o0 l; kMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */7 P5 x; O& M; i
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
7 R9 W8 F7 @) t, oMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);; [- k# e. o/ j" Y" V
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
_. `7 l C+ PMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */3 k) a' H) u. q) A0 [! P, d
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);9 m5 p5 ]0 p- `
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); 0 [8 j! W6 R' @2 `$ [
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,4 [6 B A' J0 e( q5 h: [
0x00, 0xFF); /* configure the clock for transmitter */# \! H# `: x e8 V
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
( Z: U7 L5 P5 Z; z- L- f/ RMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); v. B' c/ V6 G/ t: {& m
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,- R/ t2 Y3 Z- Z) ]
0x00, 0xFF);
& P$ d8 C$ X6 ^# e* r3 ?
+ ]0 |) `3 \% g& @. ^% z/* Enable synchronization of RX and TX sections */
) j8 C% h5 h, j; c' W. _McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
. ?- k6 x6 l4 o; |4 I5 k' p9 F, GMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
. c* @/ z1 c) G7 d. pMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*! Y4 e+ m6 l* j
** Set the serializers, Currently only one serializer is set as( D/ Y' m6 o6 ^6 L* }% X8 g
** transmitter and one serializer as receiver.- s$ c( z; {0 Z: L
*/4 C! o1 p& j- X) M) Y$ b
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);! v) H# a7 Z/ g" i- h+ Y+ i
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
* {. }$ g/ [( M9 d** Configure the McASP pins + K2 C8 N3 f- x2 O( w
** Input - Frame Sync, Clock and Serializer Rx
6 L) z- H7 M/ P# w# B( j** Output - Serializer Tx is connected to the input of the codec 0 [$ w A9 |- Q
*/1 Q5 n c' d/ |9 {4 L
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);: [! [) V }4 k6 Q8 ~: t
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));! z& Y' P r8 ^! V5 ^3 Z1 @
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
r* X$ d; ]1 |- {2 B| MCASP_PIN_ACLKX
* r+ j- @' F1 n| MCASP_PIN_AHCLKX
7 ?, P7 K+ A6 d; l- G8 j- X| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */8 y7 b% v. \9 @- |
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
# ?$ U! A# }% l* R0 ^* [: `5 a# r| MCASP_TX_CLKFAIL
8 g0 l; L3 l# x| MCASP_TX_SYNCERROR+ X2 `' d. j1 z. f9 Y# Q
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR 6 k- ]4 \ R r$ D% Q1 I, c8 d ?
| MCASP_RX_CLKFAIL
* _! y% p; K" ^9 U| MCASP_RX_SYNCERROR ! C: s7 ^. O- j- k3 L! C( {0 S
| MCASP_RX_OVERRUN);6 C$ h, m% S. v3 M4 O
} static void I2SDataTxRxActivate(void)! |: Z% i2 S3 {# ^
{
& o9 ^5 Z* |2 l) z/* Start the clocks */3 `" e" ^/ |! p, \! H. ^
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
4 D2 m' T* x$ U8 ?" KMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */( H+ F* q. L- d8 o1 O4 e3 z
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
+ K7 Q3 |) R, J$ ZEDMA3_TRIG_MODE_EVENT);
7 O# O4 s) c" Y5 q9 iEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, ( g0 _% s/ e8 c! R( c0 U3 c; h
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
/ x7 A1 p% G7 |. T D% [- ZMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
( J& ], X) K5 dMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
) K, V4 Z( W5 t8 Ewhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */3 l* r$ t& U$ Z% e6 R/ @1 C
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);8 K3 H G; b8 K, X
McASPTxEnable(SOC_MCASP_0_CTRL_REGS); m, i( s. F, W* u2 F, ^9 Y
} $ F4 ~9 t0 S7 s# L5 W6 `. h
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
5 w. W" y! W+ r7 ^. y( e8 g' ` |