|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,' @# [% ^6 o) X- _ \1 N7 _/ p
input mcasp_ahclkx,0 U3 |4 ]# v# h6 \3 g6 ^$ O9 M
input mcasp_aclkx,/ |) T" J' s J" B/ A/ n5 x
input axr0,7 ^4 F1 j% l, j5 t( D/ S
" D3 @/ q& A' F) N6 aoutput mcasp_afsr,
. v& {# ~) S$ D$ O: Xoutput mcasp_ahclkr,
- ~3 I8 A1 s' b0 E4 }; youtput mcasp_aclkr,$ W* a- r! d. C9 {
output axr1,
, z1 _5 ?# k6 q. d; V6 b4 z assign mcasp_afsr = mcasp_afsx;+ S2 B2 j; Q/ a; r, F
assign mcasp_aclkr = mcasp_aclkx; w# @8 O/ S0 d
assign mcasp_ahclkr = mcasp_ahclkx;
1 z( F2 _% W* d/ L k' lassign axr1 = axr0; - g5 {- d% y# ~5 ]' d
; ]5 o E7 b ^2 R, D$ d6 c& g在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 1 \4 K$ A$ F4 F9 ~0 I" V- U
static void McASPI2SConfigure(void)
- R& i; B Q9 q1 o% k1 ]{
) ^+ h; ?1 x: |0 d6 a2 h: W) J6 r/ r/ \McASPRxReset(SOC_MCASP_0_CTRL_REGS);: |! ^& s$ d" t; K A
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
& O8 E. A% m/ ~' v/ D7 H% q# L% ^McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);4 L) \$ u2 |1 w# N4 J g! Y9 a
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
0 b3 X, M+ M& r0 bMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
* G! z0 ^% O2 w. D% F: BMCASP_RX_MODE_DMA); O3 x4 f8 q/ m( c' A! ?
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,7 t0 ~8 v8 c1 n4 d
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
7 Z8 V3 ?* u4 y4 r! P9 mMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
T, x6 j! u+ V. C! cMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);* i7 f* [4 I: p- P0 j; \; d+ e7 L( b
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
. a, g% w* I5 n7 H- c3 n1 v; UMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
0 p7 p0 B5 y# I& h9 D4 f% ?' Z$ vMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
' G6 x2 o+ y" H5 d* S3 {McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); 5 _( G2 x/ b s7 ], Z: L c0 ~7 b( z7 r
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,% ]0 \$ G O7 r; J( a
0x00, 0xFF); /* configure the clock for transmitter */
4 ], W- d5 Y, I3 ^! ?McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
9 \. O3 P& b1 d2 P8 ~McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
, K9 q- s( ~' d3 NMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
# j) B3 ~7 b9 o$ p$ {9 ^0x00, 0xFF);
& ^2 t4 j A2 ^; u1 o! S4 ]4 ~
$ ^8 j9 S i v; h9 }# I) ^) g# m/ k/* Enable synchronization of RX and TX sections */
) c* U& m) u9 NMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
1 G, A- ~% A2 j/ |" f' ]McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);1 g. f0 |) K' M4 S
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*7 h5 t S+ T3 M r' {
** Set the serializers, Currently only one serializer is set as+ }/ q. I: Y: y0 O2 y
** transmitter and one serializer as receiver.4 R! X y' B/ {5 n
*/- w2 U. k3 |" {8 X5 Q4 F
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);, V" [: `( x! p$ M' q% ^5 {( F
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
6 y) e7 Y0 j4 N, |3 I** Configure the McASP pins
6 F4 x" H' {, g5 [3 V** Input - Frame Sync, Clock and Serializer Rx
& e& |2 n! \5 k3 k** Output - Serializer Tx is connected to the input of the codec
- j! Z+ n) c0 y+ U! H4 L*/
, ]/ D8 r! L! R: I( b G2 DMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
" ]4 B. r x" f) C5 j) uMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
. b; c; p# G( QMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX4 E3 A/ ]" X7 L
| MCASP_PIN_ACLKX- {2 t! L$ D5 a# r7 J
| MCASP_PIN_AHCLKX
+ \ d: l3 u% ?( t) U* t E$ I| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
+ y! e5 L9 ~; T) B- X1 J4 LMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
0 r6 H6 Q6 V6 t2 @| MCASP_TX_CLKFAIL % e" o+ w8 ?' D8 q0 i' r0 o! r; ^
| MCASP_TX_SYNCERROR
: ^; z8 m& z5 r9 O8 D8 D6 v1 g| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
! ^5 P5 f6 y P/ ^- {| MCASP_RX_CLKFAIL1 S% s6 ~( `$ U) r+ Q
| MCASP_RX_SYNCERROR
4 S2 A% _5 x: P2 u+ m! k| MCASP_RX_OVERRUN);! I, D' a( i4 T, \( ~. p4 }- ^
} static void I2SDataTxRxActivate(void)& U5 e# Z7 y F* H
{1 v% S0 J- ]: L4 t& m7 C
/* Start the clocks */
, b, Z6 H$ `6 Q1 hMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
8 [& u9 j/ G4 |+ j: D6 ]' `McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
; m- C$ H0 `2 ~( SEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
# F, j0 I* u9 ^0 V/ A" bEDMA3_TRIG_MODE_EVENT);6 X! t8 l, j& A1 r" x- _
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, & A, M' M0 U6 }2 h/ \2 K( X* Y
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
- H2 m* n/ U8 Z% r# {McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
2 n+ [7 j9 R/ Y6 t! O* FMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
4 }3 ~) N! A7 ?# Ewhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
) j) D+ z. e, I8 {: x: o$ O' yMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);- u0 N% Q- f& L$ P
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
( M% j4 E- `9 H} 6 S, \3 s6 m5 T0 E' n9 F; f; i
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. + }; C, p- W' ~' c& K
|