|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
: h! @! L' c3 Einput mcasp_ahclkx,
( c2 H5 h! O* @- u& j3 x! n( H X& linput mcasp_aclkx,
6 D( r( V" s4 Z0 [0 K$ Finput axr0,7 F, z8 S w4 ~* u& H
" V+ s4 ?/ q/ q" U5 _' O; | Poutput mcasp_afsr,
. ]" S& m d( V7 I, q& J) \output mcasp_ahclkr,; ]# D" j+ y2 {& v" M) H8 S
output mcasp_aclkr,
& h( v S& I( Joutput axr1,
8 ]9 ?; i9 C3 o, R" o( z assign mcasp_afsr = mcasp_afsx;) Q- b) v! j# b! d4 k1 `4 ~. X
assign mcasp_aclkr = mcasp_aclkx;8 p* X. n' m' d' d1 T
assign mcasp_ahclkr = mcasp_ahclkx;
! W2 V ^- B. x" z$ v$ _0 F+ |assign axr1 = axr0; " s/ ^( i/ J) m
; j' c! P1 y( }" i% _7 v5 E' ?6 [" P, ~
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 0 g) Q$ w7 Z K& w7 l8 U1 g8 Z
static void McASPI2SConfigure(void)' j% I% I$ V" c1 b9 ]/ ?
{
- B7 o( o( r5 I9 C/ D( B! N" hMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
! X& O% x/ j9 F. I& UMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
$ ~' @5 |& k" G: g6 Z8 c# rMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
3 Q3 I+ h J. L0 D: K* o5 jMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
) L2 A; ^8 s- Z5 v7 K6 oMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE," I8 A- A2 a/ O7 e! a5 Y O9 `
MCASP_RX_MODE_DMA);7 i+ p/ E+ \4 R7 q- z$ ~
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,. [4 ~8 S1 m' ^- d9 s8 M9 _
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
5 w# c8 e, C, o& F( Q% ZMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, 6 K4 ^6 d" |6 Z0 A, K
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);* N4 r% j% Y* k
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
* V7 P: R$ Z+ D! xMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */4 J# h7 N/ ~1 h, D5 x
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
- I5 c$ v* V* W& ?! SMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); 6 M$ W( S% a/ g W9 g7 t
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
; U$ k% s. m$ P4 ]6 R1 Y5 v0x00, 0xFF); /* configure the clock for transmitter */
( ~% u( W3 t% _( M9 S7 f& UMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);9 N- f3 p3 T x; |* E# V
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
) G. O# E1 Q' ?" u& o$ L, rMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
0 L) e( p6 J3 d, p5 m8 x9 w# s2 C0x00, 0xFF);
9 }, Q: q: ]& q5 M) t# c8 c0 j' F5 Q# r$ ?9 l" n1 ~. q! Z
/* Enable synchronization of RX and TX sections */
( O! f1 P6 ?$ }# a8 k4 b, iMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */1 U- Z7 I/ U2 i# A( Q$ T
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);* d- K" N K9 V
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
, q0 i4 V& Z$ S2 H P** Set the serializers, Currently only one serializer is set as
! G1 M6 S, T6 Y: e! j- ^6 V4 h** transmitter and one serializer as receiver.- N% F2 I6 O3 `, K0 `
*/0 w! {" K- j8 ^0 s
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);0 w; s' n* w1 l" s% [" X& Z
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
$ ~9 L- ^0 e" A. Y** Configure the McASP pins 1 t/ ?& `2 X) o4 t! f
** Input - Frame Sync, Clock and Serializer Rx! t' L1 T$ y1 b! ?) ?
** Output - Serializer Tx is connected to the input of the codec
! W7 n% b9 k* \- a! o x9 r/ z3 j9 C*// d0 v- d: P9 V; j( x1 T8 V7 X
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);( B% N# H2 W K; I/ Q0 f- ^
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));5 Q. i A- ^: r+ L; L) \
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX6 b9 o4 r4 B9 y5 M, L; B
| MCASP_PIN_ACLKX# q% Z" O% C- X: H
| MCASP_PIN_AHCLKX1 F. f3 L" O* V2 D$ I& Y7 J. `
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
2 \* A+ S( h& ?' q* dMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR , y$ @% m' T4 k4 n
| MCASP_TX_CLKFAIL
$ z( f/ w5 X6 r- _4 v| MCASP_TX_SYNCERROR# Z6 u. @9 v, ]8 e; {: y o' n
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR - A0 I# R3 U" M) M: G' A
| MCASP_RX_CLKFAIL8 q( w* m+ w) @$ {2 v5 ]: y7 i# j9 T
| MCASP_RX_SYNCERROR
! G' V# T: p# w1 B| MCASP_RX_OVERRUN);
' G* W7 h b4 [, c# G# |' }' g} static void I2SDataTxRxActivate(void)
4 A. D0 Q9 T" C{$ z3 p6 p0 H# q) }
/* Start the clocks */
4 \- `/ S( _3 }* L' tMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);9 h, D m; n/ ?, R
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
$ w2 Q: M6 V0 A: L+ T( ^EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
4 N, |5 V0 b e; o9 ?5 h {4 o& TEDMA3_TRIG_MODE_EVENT);+ `6 s0 x1 H& V# ~ u
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, 2 o; ~: F6 B: r2 ^8 I! u
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */, N" G5 P+ A" \3 S
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);/ I9 I& F$ I8 S# L
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
; W) Y0 b: N" Nwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */) ~7 D$ n! N' D4 w! H+ Q6 b
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
& ^, A0 J% Q" q0 {: V0 L3 ~McASPTxEnable(SOC_MCASP_0_CTRL_REGS);: m( } M" _( W9 ]
} $ \5 P: L/ a7 x% q, u( ^' Q4 q
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. ' c l8 J! j4 W4 k5 n
|