|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
5 V. ?; Q' p% ^' o- sinput mcasp_ahclkx,& f+ X" j$ b3 A: u& E/ j
input mcasp_aclkx,1 P5 L5 J9 N) L5 Y- A/ ]# m
input axr0,+ D" e4 C6 h& x C. q! ]
1 A) }% c Z7 ^6 g; g5 H2 voutput mcasp_afsr,
. Q6 V) e4 }$ K' _# @3 D7 i7 qoutput mcasp_ahclkr,7 y' w4 L+ F$ H# K3 q
output mcasp_aclkr,
, W$ U; c) B# F# s E7 aoutput axr1,/ e5 x# @# F' @, a
assign mcasp_afsr = mcasp_afsx;: B, g# \4 T9 f* b: m
assign mcasp_aclkr = mcasp_aclkx;
6 j7 E" \5 n) R, j& `: `assign mcasp_ahclkr = mcasp_ahclkx;% V5 M3 I! v% ]& @3 s
assign axr1 = axr0;
7 |& w( o' s/ {. m {! T' k0 Y% G- g% ?
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
. a5 }3 z5 L% z2 n, ?# ]) A. gstatic void McASPI2SConfigure(void)
" v' g4 I/ u5 c9 e! ~2 ~{
# }7 v' b$ w5 AMcASPRxReset(SOC_MCASP_0_CTRL_REGS);8 n& u/ i+ t; j9 c3 |( o
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */( x% Q4 b; R3 a' Y2 f
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);0 h5 q8 I8 ?! h+ f7 y
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
; x" W5 n: k+ D: nMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,6 V3 E: M% {( T) c
MCASP_RX_MODE_DMA);
* k3 H r' Q. \$ hMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
* S6 f6 M$ ]7 j, |0 e0 LMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
8 V- u2 y3 u: B$ [0 UMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, 3 s. m7 A3 E: d2 H
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);8 V3 s) L" n( k' e" }! t) ^
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, 8 e/ F8 y1 N- ?( ^& J, A+ i6 n
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
) Q' j' H$ c# z6 A2 x% e6 lMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
# j8 M8 a/ q; o$ S: C% gMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
; P; ?" l1 V; \$ ^McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
3 Q$ u6 h% V2 D) b2 C! b* A0x00, 0xFF); /* configure the clock for transmitter */
- D" c# A" n* dMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);; p$ h6 @5 [6 z i7 R) B
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); ( H! h% }8 A) Y$ v2 R8 P
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
, `5 \8 U3 }# `& P0x00, 0xFF);. f% V+ i) e7 x1 i
) x, a3 `! e0 D1 L2 F3 v6 {$ J
/* Enable synchronization of RX and TX sections */ : E! ?; t6 D @' o, c! ~* |& f3 F
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
0 e8 h O7 Q' k! p# _McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);" Q0 h# h+ n/ p! ^. y1 Q* e
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /** K' t4 X$ B4 B1 j) ~
** Set the serializers, Currently only one serializer is set as
2 u8 l* q4 Z. v$ T** transmitter and one serializer as receiver. d( t1 _. y* ^
*/
7 }- _ \0 k: A) {6 G- WMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);6 O' s! F1 T0 `: Y- W B# c
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
) x- h1 @& q# ^" ?+ l4 |** Configure the McASP pins + f! y6 U/ h F- e9 c
** Input - Frame Sync, Clock and Serializer Rx- M4 T- T f$ n' c8 N; p: u8 x1 L" h, q
** Output - Serializer Tx is connected to the input of the codec
A3 I( n6 H. `5 V* ?*/0 }6 q6 h [: F# Z9 P
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
1 b7 r8 S" ?% F. P% KMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));1 M _& G3 A n; Y; D% `2 v
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
( A' J: o2 k! c| MCASP_PIN_ACLKX
6 {& i! E D7 \ N6 d/ k| MCASP_PIN_AHCLKX
) V! x3 C2 X: ^3 f3 a5 s( ^1 || MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
" D- p, j; p( g0 d4 HMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR 7 h5 c% r! }. l4 _% l
| MCASP_TX_CLKFAIL
; U8 |" y$ q D2 Z| MCASP_TX_SYNCERROR; j+ P0 K+ j! L; x
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR - a7 D# h" h$ U7 x, Z' D' C' O* F
| MCASP_RX_CLKFAIL6 x. G5 d/ N7 ^- T
| MCASP_RX_SYNCERROR 5 @- X5 C- u* V8 ?+ ] p5 n+ `
| MCASP_RX_OVERRUN);
t q& o4 S8 Q2 u/ d# l} static void I2SDataTxRxActivate(void)
# O) u7 v* Q. x' M{
" b2 s P' t! j1 y+ u/* Start the clocks */9 f0 E6 I M9 Y- d' r
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);9 _) q: P# {' h" f& H2 s
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */; q: r0 q" ?' c0 k5 v" W
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,% i) z& L U6 K( I7 ^7 @5 ]( J
EDMA3_TRIG_MODE_EVENT);* K# R8 h1 O1 k) x: j
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, 0 f4 f! @# F( y7 S& G- ]
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */1 ]( N* a4 t2 I" |% ?( ~
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
7 ]+ e$ u: L, X9 |& q5 J. |McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */0 H2 b. f& L# Y0 y* H$ F3 U$ r
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */0 q% l$ T6 ~7 b7 i9 r
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
$ |- P( ]& W) S0 c+ u) ~. VMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);4 O, Q2 u/ @6 k1 g
} 3 p. r8 G9 c5 J& y2 |9 I
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. % n0 b4 |) Q( B8 [, n5 L
|