|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
7 f1 l! S) ^& y9 N2 M' U u6 Qinput mcasp_ahclkx,
9 @: T& @9 `7 }& `input mcasp_aclkx,
/ i: O9 L" R8 M/ J3 f5 D" Ninput axr0,
$ P e, |# |2 k) _3 e i1 H
8 \- X) J9 N, }$ ^" o p" g6 Aoutput mcasp_afsr,
, C1 M1 P6 Q0 ?, W; W& y& P( [7 x routput mcasp_ahclkr,' Y4 s" Z/ G1 G- w
output mcasp_aclkr,! `- A7 x7 Y# W) }/ u5 _
output axr1,
2 k/ S6 u0 p2 E& I! S0 q* i assign mcasp_afsr = mcasp_afsx;- t% I! K. C5 T& L. C; x: f
assign mcasp_aclkr = mcasp_aclkx;
) ^: H7 g' H# q8 cassign mcasp_ahclkr = mcasp_ahclkx;
" }7 d/ v# I( ^$ w- ]. wassign axr1 = axr0; : H! b( O0 _! u. Z& H- ~
, q: ]# N5 Z3 ?* K
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 + k# C. `7 e8 A% e$ b& _6 `
static void McASPI2SConfigure(void)% d$ m" w/ P! ^$ K o6 W1 Z& x# [. t' t( K
{
8 }$ _4 d3 B" |McASPRxReset(SOC_MCASP_0_CTRL_REGS);
: E( W* [. S- ^7 ]$ u4 [McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */$ ^2 p6 n4 y( E
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);1 `1 f) k8 C3 f* S- d% P' u* e# b z
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */# |) c8 X& e8 F* d! k q
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
+ F# E" G5 x% H7 x: dMCASP_RX_MODE_DMA);
% R# w% m& [! @/ ~( f2 zMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,# l1 C1 D8 x/ a7 \% l: \
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
* ]: ^5 X( G! nMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
$ F- E5 c4 _& _2 Z+ zMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
E% X) ]6 e2 m1 N/ p5 NMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
: V' [3 o! O" r tMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
# G! h S s2 C- gMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);' ]8 O6 b6 x( Q9 w0 { h# L& l
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
, Q4 S4 i/ u1 }# |4 g9 r1 nMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,+ X5 v2 t; s. A
0x00, 0xFF); /* configure the clock for transmitter */
5 p: }5 U6 ?& { P8 Z& bMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);& I3 |+ z/ Q' ]8 G* r/ Z
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
0 H* b& L4 N" F: hMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
5 ^! j& M+ {4 I% l$ B0x00, 0xFF);! P2 b3 L7 e0 F; |# ^+ Y0 G1 O- R
5 b3 G6 Z& u( k4 ~" O/* Enable synchronization of RX and TX sections */
1 d) Z; B* _$ m+ ?; `! p cMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */: f. v% Q6 h; u& c4 ?1 y
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);7 s: Q/ F. z& G3 x7 h+ v+ Z! P
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*8 O5 K; a4 \; i; A6 ^& } a
** Set the serializers, Currently only one serializer is set as
% s7 ~6 l& v3 p$ u/ H1 m7 p** transmitter and one serializer as receiver.2 H( L! r) F- h' O: ` Y
*/- T% D0 z) B/ f
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);# J0 Z* V; j D* a0 S
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
/ _( ~! r, Z9 K* k** Configure the McASP pins 3 ^/ P' X8 Y) g/ v: l& ]) L
** Input - Frame Sync, Clock and Serializer Rx- S) g# f# M# B# Z; ~" c8 D
** Output - Serializer Tx is connected to the input of the codec 8 k+ z" {: z6 q; O. _
*/8 s$ |/ t& Q* ^9 Y& ]
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
' C2 z% n/ B5 u, o n' EMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));: j3 G! O/ f6 c8 t; x
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
% ^; U# Z: s9 u1 y$ p1 S| MCASP_PIN_ACLKX
9 t$ G" O7 ?/ ^ Y| MCASP_PIN_AHCLKX5 R) ?) P$ B' R0 e* y' S
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
, u, n( \5 j" p5 y* lMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR ) r. Q2 m! n% }+ o
| MCASP_TX_CLKFAIL 8 A/ i! {$ ]3 ]( w5 m
| MCASP_TX_SYNCERROR) g: L7 G: V& ^0 V# J* t( d1 u
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
- c6 s) { S' c8 K9 ?* T| MCASP_RX_CLKFAIL
0 a) w: N B# N" P3 o. ^! I| MCASP_RX_SYNCERROR
) ]3 Z+ ~8 u. e1 t0 S, N2 W, z| MCASP_RX_OVERRUN);7 p8 y. q( ]# o2 l$ s( D
} static void I2SDataTxRxActivate(void)
8 Q, h: G: t# c8 k. y{0 h3 h: O# J% U) w
/* Start the clocks */+ Y3 A" p4 z8 y4 Q& ?: Y/ N# }
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
: B# B% x1 _: F2 r4 EMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
; f, y7 |- ~3 g8 F& nEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
- R6 r9 g( x6 `+ E# C& x- {EDMA3_TRIG_MODE_EVENT);- \# N" I8 _ E
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, 3 E' P; I) m% z, {
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
5 K. l6 `# e3 Z3 v7 V e; rMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);4 \0 u5 O9 U* E0 G2 i! H- }1 x
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */' _; _& j5 C' H% A& E
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */7 K+ ?, b+ x; Z
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);' y. P P( g8 E+ }( r4 |
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);8 A" ]* e( w; q7 g
}
. Z. i H/ S( b+ r) u请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
" a- p }: a* a1 @ |