|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,0 l6 H) P+ B! e9 D3 {2 {: O
input mcasp_ahclkx,5 W4 w, g+ ]* @% X+ ~) @2 y
input mcasp_aclkx,/ C, R6 M6 b# n5 `) A
input axr0,
9 z* F8 c' W% J3 q% W- r( n. e
1 A0 K3 K6 H; Uoutput mcasp_afsr,4 C3 O% R) I; E6 X) _' m- e. ]; U
output mcasp_ahclkr,
" `7 _* r. b, z' I! G# }! coutput mcasp_aclkr," u: `/ o. f' \8 S: d+ o4 z
output axr1,
: O' B* S0 I) \5 c! ? assign mcasp_afsr = mcasp_afsx;
1 ^: S: A9 i2 s( x8 Hassign mcasp_aclkr = mcasp_aclkx;
! c( F, y( E0 R9 B% Kassign mcasp_ahclkr = mcasp_ahclkx;
; T* _ V) V# a9 p' Massign axr1 = axr0;
. Z6 p( H5 R. [1 k+ r& n% F& G% `" R0 N6 T# ^4 j
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 + o/ R8 |- B9 N. {7 K# C+ n3 R N3 j
static void McASPI2SConfigure(void)
0 k* x, S) z$ M! q$ d3 Y% m{& V* W( t/ f9 _
McASPRxReset(SOC_MCASP_0_CTRL_REGS);- c ]( l7 R0 @1 s: C! W
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */5 c& O c: x' q
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
, L* X2 Z0 B o0 N* sMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
7 j5 F) b: K0 l6 TMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
5 ^- G' Q. P+ c1 c0 r2 FMCASP_RX_MODE_DMA);; r+ M0 E; k5 z/ T
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
3 L5 A8 \0 E/ H6 O$ o+ kMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */# Z1 h. k7 S/ m% S7 v
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, 7 e6 O$ D' g1 D7 N' ^7 N
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
/ w' v) V& S# ?* BMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, 1 `. P1 q- j2 N7 S8 I, A# y
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */0 l& m. G/ F. x) i: e+ A
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);1 F5 R# M# e" ~2 p/ Y
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); 9 J9 O- k+ K7 Z
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
6 g* G9 ]6 d$ H( H; P0x00, 0xFF); /* configure the clock for transmitter */
% V, M1 j- g& m8 I- ~5 o0 vMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
- |' [3 p$ h; _0 v; |& BMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
( j d& _2 o. j. i% h& r% I* n+ \McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,1 S$ Y8 C& n. h( G6 d+ M
0x00, 0xFF);) j0 r$ |# b9 X) r. k# j3 T) X+ e
8 r8 T: d! X, t8 d6 T* M/ y0 P
/* Enable synchronization of RX and TX sections */
) k) q/ f& n3 }, l& |8 EMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */5 [& w4 Y, ?' a$ J- w
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
' f |/ j5 q' o+ R% YMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*. J6 f8 g* K% j: b. e
** Set the serializers, Currently only one serializer is set as2 K' r, W' c! p: Y+ Z3 |3 q
** transmitter and one serializer as receiver.
$ Y" [# X! I5 _! p6 j*/
8 H- ?$ f' y' [% P/ p: |McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);0 ~ M/ V8 U- T4 A1 C" J
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
6 o) P9 m9 t: C% F, H! N: Z# \, R** Configure the McASP pins ) }: U7 |$ M- N/ G* N& S2 _5 F
** Input - Frame Sync, Clock and Serializer Rx
" r8 ?- J" H) q% J** Output - Serializer Tx is connected to the input of the codec
J+ T/ Q' b) F" z. K*/
! s! F. }% y4 q1 |+ Q- C7 ~4 V2 vMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);( c" C0 V; \5 y2 w9 A4 {+ Y( V" y
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));8 H4 b$ v6 g% x2 ]5 B
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
& ]& g3 R3 Y2 V" d| MCASP_PIN_ACLKX
1 u8 K* A3 {( b/ `% E1 _* L| MCASP_PIN_AHCLKX
. s) {: ~/ C6 Q6 y# B) M% @. K| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */* P7 D; `0 l+ h! Q
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR 0 n" u Z7 Z3 k8 N8 S. z3 h
| MCASP_TX_CLKFAIL * X) j, c8 {+ f5 b. O
| MCASP_TX_SYNCERROR
$ X* A3 Q" h1 D+ w| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
}, H* t* ^5 `' n6 K! [| MCASP_RX_CLKFAIL/ C3 j) R" E, u7 y
| MCASP_RX_SYNCERROR - e. a9 T+ Z$ w ^8 t
| MCASP_RX_OVERRUN);" i: X# J7 c+ }$ k/ n o ]
} static void I2SDataTxRxActivate(void)
) q( A# \9 {5 ^2 H{
$ K% X8 ], {% A- y+ e' r/* Start the clocks */, g3 }; N- ~$ F* |
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
' t; N. ?+ H0 m. ]3 V3 NMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */7 g) \& Q& g( X' [& G
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,- g/ D+ k9 Q: M7 t6 w
EDMA3_TRIG_MODE_EVENT);
' m! A) u! @ ^) X- KEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
: |' U7 K3 t& JEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */: j6 s# B3 g" c2 m& v$ i
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);7 z7 J* ]& C& e- L! p9 s) V
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */8 D; n4 J( l! r
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
* T1 s/ w8 ^: X$ A/ ], eMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);
# u5 |+ E1 r) v( Y) AMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);" c; b) @- n4 k. |& j9 B8 x
}
( K Z# s0 J+ w. ~8 k6 M( L L* T请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
/ K) v( o1 U7 r, S |