|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,* \ \1 k4 a; g
input mcasp_ahclkx," j; M0 C1 l3 p5 q8 n' o6 @
input mcasp_aclkx,0 n6 @2 i3 F( `9 {
input axr0,0 }% l: W4 X' d
+ [: v2 C' [% X, E. s$ Toutput mcasp_afsr,
5 m4 I8 Q! r b: F1 p2 ?' doutput mcasp_ahclkr,
7 C' [9 X, n5 `9 ?4 c0 S+ ^/ ooutput mcasp_aclkr,& _" N# C9 v* [
output axr1,
$ C; @" D) t* i& o& ` \' R assign mcasp_afsr = mcasp_afsx;' B* ~, f$ s9 K4 ? c$ C- W
assign mcasp_aclkr = mcasp_aclkx;) }. ?: G$ }' q$ k/ Q! d7 c; C
assign mcasp_ahclkr = mcasp_ahclkx;, m$ H' d$ U% `9 i; k
assign axr1 = axr0;
( h0 p2 T; S/ m$ q6 V4 Z. D: d4 a
6 z, }+ E$ W- O$ \" W在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
7 P1 w7 p$ ^( f0 ?# @) H; ystatic void McASPI2SConfigure(void)$ b. { Z$ h3 f
{
$ q( h- V% Q9 q% jMcASPRxReset(SOC_MCASP_0_CTRL_REGS);$ v$ c4 B8 i) b" {
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */- \5 d2 [/ {# z- s W
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);! v3 ^ @& D/ c5 a1 X6 J/ u6 I# C" Q
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
/ t9 m) |4 S* l4 ]0 o3 {2 o) QMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,. Z+ d; v9 e% ^7 z1 F# e7 E* Y
MCASP_RX_MODE_DMA);
( X5 z g! I7 kMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,5 [' j/ m$ i3 x
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
, o7 y7 I4 Y5 \1 _McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
: ?' c9 M4 h. }MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);$ }4 Z! a$ E7 ^! y
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
$ h5 m* G9 v) ~MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */5 y, i- q, T- Q+ ^# W
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);4 E% `5 ?6 |) j3 o) N
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); & A' G* f+ A& O: r
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
0 z3 l( z3 ]" c; i0x00, 0xFF); /* configure the clock for transmitter */8 v: @ b: ~1 }" m( F9 x
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);! A1 f6 \& v. T
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); " Y8 n, B ?1 r5 @5 O
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
* n2 ]: }% V9 s( D3 J- v0x00, 0xFF);
5 @9 q4 g* f' e+ S ~ |/ c% Z: I. H. L3 f$ h; m- x( j- E
/* Enable synchronization of RX and TX sections */ : G! n. n/ p$ y
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
; i, S: e- E. f4 {$ u' NMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);. ^" s2 B& B5 y/ v; L( M
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
. [- y. Y9 e. x* Z$ V n3 `** Set the serializers, Currently only one serializer is set as
' c3 c8 D; z7 G: V: L2 h$ I) F: Y** transmitter and one serializer as receiver.
. V8 z3 k' `6 z6 S*/: H- t2 {$ k r
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);' Z( W" A& r, W
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
# V9 O3 L- C1 l2 s/ W. i, u7 p0 d** Configure the McASP pins
/ [7 j0 ~0 x; `7 P. [8 N! N% W/ f% D** Input - Frame Sync, Clock and Serializer Rx
\, `# P2 C6 U5 J! }3 G** Output - Serializer Tx is connected to the input of the codec
) @1 i c- ^ |*/
. q- C# F5 r, [: cMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);: d" `2 B$ P) h/ H+ s: q$ m
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));) V- c- Z' _) G# ~! [
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
* h: l* x9 S7 a8 I$ j, F, a| MCASP_PIN_ACLKX+ L- `* k8 D/ T+ s8 x
| MCASP_PIN_AHCLKX* R8 ?6 o5 u" u- P; ^
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
3 i+ o0 |- f: b, S7 g5 x& l: wMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR 0 j3 k8 y* H5 L
| MCASP_TX_CLKFAIL
) |0 q0 k. w* U" r| MCASP_TX_SYNCERROR3 r: o" y: x' x* O
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
+ m( i' F; H& b: Y| MCASP_RX_CLKFAIL- j+ }" \5 X" Z o
| MCASP_RX_SYNCERROR % b( j% S3 s8 f9 O: D) Y5 N
| MCASP_RX_OVERRUN);
. \4 W/ `7 m" d" \* f- S% Y4 m} static void I2SDataTxRxActivate(void)
3 ]9 ]2 V/ Q/ g- a) z& c" @{# X8 d0 s) t4 M( s( @" ]1 W
/* Start the clocks */* ?: F+ o0 n/ U8 i7 v; ~2 D1 s2 R
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
+ r1 A$ W6 ]; C! z. C+ [3 QMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */1 k" x* H: |0 p- U a
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,4 w1 X& {: @" } q
EDMA3_TRIG_MODE_EVENT);" c+ ?& b5 E$ W% x
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, ! S6 h6 F, |# t0 M
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */) S3 e; f$ D/ R& \1 S& n/ z# A! i& w
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);; u% s% ^- I& @
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
6 Y1 v% M+ P7 S: Awhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */6 {+ Q( `: \8 G( Y6 `7 Z, X2 n
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);1 m* m! B6 n3 f2 `" ?& ?$ m" `
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);4 S% \# E$ _4 z# A! F
} & C" z+ e, ]+ @# x0 R1 @9 Q9 o
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
/ ]5 ^0 W7 [) A& d/ Q1 \4 G |