|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,, z8 [/ T3 B( o' E. C
input mcasp_ahclkx,; l3 B* u$ K% m0 v* i
input mcasp_aclkx,
5 }4 D) u6 d8 Y, o, a( B+ O) u( }input axr0,
5 f6 y0 u5 z) p# o. J
( x3 K8 R! d. i4 O9 z4 e' moutput mcasp_afsr,( _0 b. x) Y( G% q" E
output mcasp_ahclkr,; e+ z% e4 |7 f% d! }. u. I
output mcasp_aclkr,
; {; F) H1 @: E: n+ ?2 U; _' [output axr1,
+ ]' u; U- R t5 b assign mcasp_afsr = mcasp_afsx;
# M1 |$ b1 v( K2 n& v" j$ \! m/ Cassign mcasp_aclkr = mcasp_aclkx;
7 p i3 U/ H1 _ Q+ x' g: k2 tassign mcasp_ahclkr = mcasp_ahclkx;
1 W' `$ |- P' j E. }- i6 i" Kassign axr1 = axr0;
0 S5 e) P8 U. i0 M& g; @, b* x. v6 V
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
$ u) v/ o8 P' T( U {3 R8 Mstatic void McASPI2SConfigure(void)% p+ p: L. J5 _' E& R5 Q
{
' ^# N$ m+ b' c/ b3 F& O! B# dMcASPRxReset(SOC_MCASP_0_CTRL_REGS); Z G- J) ]. C8 _. ^
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
Z1 H) |* O* w! A8 j- aMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);9 i8 H8 b( d; h' \+ {8 v* \/ K
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */! R$ s9 o- y' l" `+ f
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,' L+ s7 t3 b9 d* \8 V
MCASP_RX_MODE_DMA);
5 t3 H% r$ c @3 Z9 G7 IMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
/ s' [$ y8 C* c: n$ z& g# O2 OMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
2 H( N6 @5 ^0 MMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
w" `. L! ^( r4 X$ k+ IMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);- M! ?& [( }1 t
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
: N- P( F" v3 |* uMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */3 \: ~* V( r" S1 W1 \) I0 }
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);8 c& B( q+ T9 V0 F- \- L
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); ; ~$ t0 P; j# p2 F; t( N
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
- f3 E' L3 c, D* O9 i: z& y4 m0x00, 0xFF); /* configure the clock for transmitter */
# y/ I8 t% A {- P7 P- ~; J+ kMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);# ^7 {4 H5 Q2 ~+ ^# D& }" o
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); / N4 g% d& ]- p
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
( }3 p4 y5 `2 r P' e6 E0x00, 0xFF);4 `; f2 M* f) O* l) j- b
; D3 a8 s1 R4 @6 `; N0 N- o) S/* Enable synchronization of RX and TX sections */ `% O0 Z% A; {+ z) Q2 p
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */2 l" n; X5 |: k
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);6 E" E3 ?+ H6 s- Y/ K9 R, K- {* W
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*7 {& O+ [0 g3 ?( B: b5 o
** Set the serializers, Currently only one serializer is set as
* q, ?0 f, U6 @1 L' u( m& j7 o** transmitter and one serializer as receiver.
1 L3 k3 m( I% Q: }' G*/
# `* G' i+ k! j GMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
3 w' S0 A/ g3 e; D; k6 hMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
) v' R% S- r9 e) n** Configure the McASP pins # K7 P7 ]3 I; n* p3 j
** Input - Frame Sync, Clock and Serializer Rx
* `9 g, {" `& }! P8 @9 K** Output - Serializer Tx is connected to the input of the codec
1 x6 w0 F- |. l% U# X2 d*/
* u7 A" b# m- C1 O2 uMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
: v: _) {4 T# ]" j A* D) [McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
% |* n# G+ m# q* fMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
# \5 L( | {6 i |) s# A2 S, \0 W2 d| MCASP_PIN_ACLKX
! f+ x; g% A' }. ?7 V| MCASP_PIN_AHCLKX
~8 }7 i% N5 J& s* W! {1 S+ t y| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */: B2 j0 d0 K4 h! |# @
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
^; ~8 U, h" A$ q8 k| MCASP_TX_CLKFAIL : ~. {9 @; l* a& @# s, t; w
| MCASP_TX_SYNCERROR
5 e3 |, k, y6 _' ~) s| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR , k2 m" U: Z( u( p' l+ p9 a
| MCASP_RX_CLKFAIL
7 s0 ^) w5 ?( ?, Q" x& G| MCASP_RX_SYNCERROR
' A ]7 G: L, {3 v6 _| MCASP_RX_OVERRUN);' L* _$ c$ ~- C N+ V0 }
} static void I2SDataTxRxActivate(void)
& U# P# C1 h, P, |+ `0 E! o5 ~{8 j/ D$ G2 `/ W$ u, u8 J4 M+ W* g
/* Start the clocks */
- I s; G# I+ e! mMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
+ G! w1 f+ ^" K: c r6 J5 sMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */- x% h, a+ B9 P2 h: e
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,2 K! [5 g* z/ s. ?/ ~
EDMA3_TRIG_MODE_EVENT);
1 t. J; f- r7 D" S$ A- v6 y1 d3 DEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
6 [1 X/ X2 c+ OEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
7 |: H2 v1 s0 P" CMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);/ t U3 J: X1 x9 C# J* N
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
i. u/ x3 p: f Awhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
% H3 b+ p3 d; l5 SMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);
7 y* v/ ~* Z% S$ y+ J0 oMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);1 s X5 Z( o* [$ P* B4 j) L4 w1 R0 I
}
7 U1 _" e2 U8 T$ |) q请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. * s" b8 U0 r% x2 C% G9 p
|