|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,1 }; V) B- Z" Y( V6 u& n
input mcasp_ahclkx,% w" S" r, t8 ~0 {7 q
input mcasp_aclkx,
: F6 V' X9 a9 Dinput axr0,0 r, K J( f H! F# C9 \9 T
/ U- \. f& g/ ?& u5 ?1 ~output mcasp_afsr,
% W# l* r+ k% h9 V- h- Z0 z6 i' zoutput mcasp_ahclkr,% l: o$ c* x' b1 \) D
output mcasp_aclkr,
; a' E$ U. z8 e7 J( B* Woutput axr1,
% l5 D; Y* b7 L% | assign mcasp_afsr = mcasp_afsx;
7 ]5 Z4 C9 P1 s( A; nassign mcasp_aclkr = mcasp_aclkx;9 f4 t: O. W( R5 g8 }6 t
assign mcasp_ahclkr = mcasp_ahclkx;
, [4 ]! w0 S n3 C' ^assign axr1 = axr0;
: l7 H' m+ w, Y
: D9 n8 `# h: ^2 Y在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
- {9 X& B* m. R+ S0 H8 Istatic void McASPI2SConfigure(void)1 p- r8 u) B* z, ?4 y/ K# M
{
* G' |) W* ~! ?/ e! K5 U7 ]McASPRxReset(SOC_MCASP_0_CTRL_REGS);
8 N# G1 ?1 _& E; W6 }4 WMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
/ K/ b+ |$ ], Q. z+ D# y1 e1 xMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); \' u/ z p, l9 D+ z* _( }; A1 X
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
/ p( O7 q+ ^* ~" I; B+ OMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE," V) H6 q6 V5 ?8 F8 A4 \$ ~/ a
MCASP_RX_MODE_DMA);
2 T Q0 e( h ~9 b9 }/ mMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,, W8 w/ g; \* o! ~
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */ Q, n$ J' |9 U
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
- a, u8 i( D* A8 ?, WMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
) u# [. r) W. t8 ~7 VMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, - @1 w3 q) B" ~9 X/ i! H/ I
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */' O, d# \/ M' I# [5 q- ]
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);6 H% B# b: B' v( v0 t! [6 a
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); E, f4 Z9 b# ?
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
- n- C* f* F! y+ O0 l7 e0x00, 0xFF); /* configure the clock for transmitter */
: N2 t l: W" ?. r* }! dMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);/ u/ U, l$ c% f
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
2 L2 B }% V4 g7 CMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,9 j0 f/ ~" G: j# a' Y& l3 }4 ]8 p
0x00, 0xFF);' j4 C/ j+ b" T8 K
" p4 L0 n6 ]2 r/ Y# e, f/* Enable synchronization of RX and TX sections */ + x m3 `% Z& y) `: r
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
* y* P) X1 w. QMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);* N+ _ W& L* w6 q& g
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*) a$ L2 |8 y$ g$ i* Y2 f
** Set the serializers, Currently only one serializer is set as$ ?3 ^! X: _! L# Y+ p
** transmitter and one serializer as receiver.9 O% o0 v: u& ~- P
*/
/ A6 i- u3 h- [) b9 n, U: KMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
5 `4 B0 ]* D% O: w- t2 c! qMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
2 v( H6 E: N% l+ Q r/ Q** Configure the McASP pins
, h% p' m) a2 U" s** Input - Frame Sync, Clock and Serializer Rx! i2 b, s- ]3 o/ ]0 N* {
** Output - Serializer Tx is connected to the input of the codec
$ x: O) f# I9 B% A3 S$ ]*/
/ ?: Y0 s/ y6 H5 |! oMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);+ D& i# D1 j8 h
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));. {3 R6 Y& G9 O6 e! r, l# A7 Q
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
( ]' o! B5 B- K2 b( o| MCASP_PIN_ACLKX! e+ O9 W a' L) v& a; k1 B+ m" \
| MCASP_PIN_AHCLKX: j) J) Y9 @/ A0 a
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */3 B) P. X: v! u( F
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR ) i# j }" z) p2 \7 u8 c" Z/ P0 j
| MCASP_TX_CLKFAIL " Y a& G+ h9 Y. U+ q. f
| MCASP_TX_SYNCERROR' W& k4 C E Z5 d' i; Q
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR & A1 R0 c9 X. J( \/ v
| MCASP_RX_CLKFAIL: w2 B1 i% s' W# ^& U) c) v7 m% f
| MCASP_RX_SYNCERROR
) Z; }9 y8 m, ?1 w| MCASP_RX_OVERRUN);4 l) n& e/ c6 b! S; \8 A
} static void I2SDataTxRxActivate(void)
6 a; v5 S/ S* a4 w* Q' v{
! N" ~5 [3 o" v' x; c- [) K$ R, W/* Start the clocks */
~) m% m9 x; `, ^. gMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);, ~$ P7 x" E8 o7 @1 P
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
: W9 h0 L* S7 R) S) b! jEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
% u0 G0 w) I w' {7 N" jEDMA3_TRIG_MODE_EVENT);* v# o s4 `/ ~( b+ T1 n4 C
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
: m/ A( L' C+ Y# j) REDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
; p; o1 e6 B$ m/ g7 p& @' YMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
`4 Q- t2 P+ n* L3 Z3 K7 ZMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
% W& P6 ~" j' A2 z9 @3 k! P' N6 N. hwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */; d6 R, {+ V8 N$ E
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
$ F# F/ I& S. T1 x2 K9 r2 s0 W ZMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);
4 {) [# g$ J1 A: |! F} , R/ f) ]6 d8 m& x
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. * p1 r% u+ r* X) X
|