|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
: P* {& @% B3 T# o7 N' X0 \input mcasp_ahclkx,
2 S, W5 G' I* s/ H4 j. pinput mcasp_aclkx,
- [. G1 P; v- s9 Ninput axr0,% Y4 i+ q/ k. _/ u" @2 R w7 {5 M& [
* X/ e9 D6 J/ q! \3 }
output mcasp_afsr,( W) b2 K: C0 P/ V( }
output mcasp_ahclkr,, @; y$ P9 ] u' W* o8 J4 [: g' L1 c
output mcasp_aclkr,3 `, b6 m( O7 ^+ v3 o
output axr1,# ]0 f2 r7 {% v# S4 D1 A4 [) P
assign mcasp_afsr = mcasp_afsx; z/ n8 _7 |6 B* {1 Z8 R& ^
assign mcasp_aclkr = mcasp_aclkx;
% w8 ?4 V9 \ f: rassign mcasp_ahclkr = mcasp_ahclkx;
: `" G1 c) ?2 I: N# j) T" C% kassign axr1 = axr0;
; U0 N" `+ V3 d: X4 r1 K/ x4 U3 X, V* |, {* a
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 4 \- }4 x, S/ Z. b) L
static void McASPI2SConfigure(void)0 U% k3 E- O8 D9 l$ N
{
5 ~: T# r2 r5 r0 [/ S" d, |McASPRxReset(SOC_MCASP_0_CTRL_REGS);
. p" d) y9 X9 B( _: A4 W; w: GMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */- f1 k. i5 A0 n
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/ v3 H3 W4 D5 u" }' |4 l2 p5 qMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */$ A7 u8 I1 M& N+ n3 Y! S
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,. l( X- m9 t% F4 L, u( ~
MCASP_RX_MODE_DMA);
$ p/ Y6 {: N9 g$ ]: }9 k5 T- A3 J8 HMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
4 J1 q A2 w. ^5 U5 Y9 j7 ?MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
* B4 ]( n( R7 T1 o3 lMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
8 n3 r) ^) P' t: j5 f2 oMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
; r y+ K8 G/ B8 z0 jMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, }0 @/ U/ u. D- l0 g S2 [
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
! O' F/ c/ K$ p5 b! \McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);, p G3 T3 ]9 G$ V: d; ^. V
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); 5 f4 v8 J% q" L0 j- D/ f V
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
) J# y9 R$ n& R+ q [: d0x00, 0xFF); /* configure the clock for transmitter */' \* X4 D, [2 n
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);$ ]/ J# n7 X* ]9 \
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); . \; L6 ^- I5 j
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
" B! W; a5 u; y' h0x00, 0xFF);
* w" i/ J7 O u8 P
@' Y& r% z0 m+ f' w' R/* Enable synchronization of RX and TX sections */ ! P4 g+ n& }9 \6 L
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
' R- H$ ~. O3 I% }" ]9 FMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);5 [( ]7 T; ~) y( L# b
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*! @+ y. @$ C8 z
** Set the serializers, Currently only one serializer is set as5 k0 T% I" c; B# E
** transmitter and one serializer as receiver.$ q0 t* K# p [
*/% e$ a4 j5 w7 S$ z* \
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);' h1 v4 d9 U8 Z5 @/ j9 g" y5 s
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
# N+ P5 V0 y- M- [; _** Configure the McASP pins
0 M$ o$ }' M. R( V# t** Input - Frame Sync, Clock and Serializer Rx
6 y, z& o, I5 G3 C/ B6 T5 h** Output - Serializer Tx is connected to the input of the codec
; s8 C- l3 C3 F; O7 K*/
0 n+ w6 J: y0 ~, b% d4 GMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);' p4 ?: ~: O0 b& r) r
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));+ R& J( o/ I( P- M7 E( j
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
7 p, U2 u( E9 K+ O8 Y| MCASP_PIN_ACLKX
. `$ G. t& e3 f4 D) i| MCASP_PIN_AHCLKX
) Z( S1 ?5 p6 m# L1 C$ z| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */' f* }5 y4 ^: f3 U4 L" k* S! L$ Y
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
; ] N$ g1 x- l% C, `1 }| MCASP_TX_CLKFAIL + B/ o' |4 N' d% [- }% m
| MCASP_TX_SYNCERROR8 W- U6 W/ q2 ?
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR 5 a8 ?! e4 H0 e& T" @" j/ Q
| MCASP_RX_CLKFAIL m8 _/ q9 q E) ^6 }; k
| MCASP_RX_SYNCERROR
" F1 T( w: x' W# d: o* [: M| MCASP_RX_OVERRUN);+ ~8 g) k( f: W7 g2 A
} static void I2SDataTxRxActivate(void)! O6 W2 J/ d* O& y1 l+ R
{* J* S- i& n* _/ [- h5 @3 H
/* Start the clocks */. g- w$ C' @& L$ K
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
- |; W" ?9 v% P( x# g/ l$ ~5 \McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
6 i. a& r( V/ P& x/ S: I+ W/ Z( yEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,/ r# @* m8 G p. o' P
EDMA3_TRIG_MODE_EVENT);
' q( f6 \- S3 G- O2 b+ p/ ?6 mEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, 7 t) e* \$ O5 n4 L0 @, C
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */$ N! }/ h9 x8 b. ]
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
4 Z' U/ H/ Z5 t0 r( [McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */7 Z, e! }0 {6 C) K" A+ }; [
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */; R! Y: j6 z7 }" |! ]* k1 M' {
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
5 P* U) Y2 W0 C7 f7 H9 kMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);
. }# v2 x! G5 ?: h3 l! S# F: h4 v} 7 I( U C# u$ W1 P* [( l
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
5 ~4 m3 ~+ g3 b, H |