|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
0 i& j7 Q! d' T! Hinput mcasp_ahclkx,
" Y2 d9 H* T/ }3 R% xinput mcasp_aclkx,
, Q7 P- `! O: D3 s+ ^) pinput axr0,
: t( j4 g' M" B+ a! i: s7 P
% _& u& H. `( p" B- houtput mcasp_afsr,
) ]( b# F% B9 X; g- aoutput mcasp_ahclkr,: H, j2 ^/ o& V2 n# n3 L0 U7 C
output mcasp_aclkr,. F: I9 t& U# o. }# [1 e& g, ?+ _. V
output axr1,
e; q2 Z' S" Z" L4 b3 o assign mcasp_afsr = mcasp_afsx;' Q3 }2 J2 U( m* v( n' g
assign mcasp_aclkr = mcasp_aclkx;
- I% h4 _2 y! Uassign mcasp_ahclkr = mcasp_ahclkx;
$ Q8 Y9 m$ {; _) Q9 t; M. jassign axr1 = axr0;
; u, t0 x+ N& |# d& {
$ {9 z+ H. D3 D4 C) L) x在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
- s' s9 j- l! a9 `1 a' P8 ~- Vstatic void McASPI2SConfigure(void): Q' J) Y5 J# Y, e
{
/ ~& _5 J# t6 K5 |McASPRxReset(SOC_MCASP_0_CTRL_REGS);9 }3 Y+ V+ L: _2 i1 t7 j
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
2 W& E- o; v8 _& s7 u; }1 rMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);! f; M% o0 J0 r4 k9 J0 [) q5 C
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
5 x# ^* r* G+ ^% z, r RMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE," l& w5 @' I1 Q1 E6 J
MCASP_RX_MODE_DMA);* j o `: `: Y; Q
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
2 Y5 F1 _1 X& @+ i" ]# VMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */) w* t2 U7 Z% @& |$ @+ l
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, 2 K, ]0 X0 J: P- n$ q9 c* X
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
1 I& |" F, P8 Q* i) Y: P" {+ aMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
( ^$ `! P J1 X2 Z7 EMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */: g- j. M b% M4 Z }: _
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
( g# {# b4 A( p0 f) b0 pMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); + h: T! q5 A5 q8 B; o/ i5 `; Z' [
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,6 N( Y3 a: Q, S0 c* Z1 h" ?0 z1 K
0x00, 0xFF); /* configure the clock for transmitter */' ^+ g+ Z! |. D" E
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);7 s O! `1 W M! i
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
7 _0 C# U6 C6 Z) e) O! qMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,5 H/ r7 g) z# R1 L! D$ Y& W
0x00, 0xFF);
* M Z* y' j) r, U @( r9 P
" z' [! a( H: w2 S& [/* Enable synchronization of RX and TX sections */ 7 T0 y! Q5 k3 J7 y/ W! u
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
( R- c! K5 t" q& L' C% f6 c) S, _& QMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
, v9 e- B) s& ]9 lMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*. [ N+ ~1 j$ V
** Set the serializers, Currently only one serializer is set as
$ T6 k, ]( K1 h5 o F2 m9 Q** transmitter and one serializer as receiver.
9 Y* X+ v+ ~- L, X0 [*/: {9 z0 W' w+ I' `. |$ o" U5 D. E5 }
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
2 W& ~. [4 u" }McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*8 a Q' C- s- F- _9 U
** Configure the McASP pins : ?! U5 n6 F; @2 m8 t# W: Y( i3 k
** Input - Frame Sync, Clock and Serializer Rx
$ |, u2 H4 W. U# A" H** Output - Serializer Tx is connected to the input of the codec 0 h& M: F" Z4 s8 @9 Q
*/
% _4 [- [& d" V, D3 _5 bMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);9 w' N* K$ T9 ^: u V3 \2 p7 p
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));5 q7 N- f6 E0 O6 l& Y5 `
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
1 x/ \3 Q0 R8 ^4 x+ A, U, Z( || MCASP_PIN_ACLKX7 N) K9 Z# g0 _* e$ h( J8 Z
| MCASP_PIN_AHCLKX
! O# m( g' T/ G9 w" T/ o5 \* f) G| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
% ]2 j% ^3 s( U$ s1 V$ @McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
! T* Y; J! r3 D8 b* x| MCASP_TX_CLKFAIL + ^' P2 ~6 Y$ M k
| MCASP_TX_SYNCERROR) r5 ]: B9 q3 f8 x- i/ @$ f
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR " v, M( C4 \0 u7 x' E- a" R7 e
| MCASP_RX_CLKFAIL
# c' f1 h0 n& M7 A# q| MCASP_RX_SYNCERROR z9 e/ ?( g1 q2 h
| MCASP_RX_OVERRUN);
/ i/ v/ A& A2 w6 ?4 O} static void I2SDataTxRxActivate(void); a- B* R# X9 \* B T3 w
{, Q5 G% ?- z1 s7 T
/* Start the clocks */
3 Q7 G! L+ ` U1 H6 M- j# W' YMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
: R6 W# U; H5 O& X4 I" _McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */2 {, N. d s8 `' s9 E3 U, |! W
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,: d% S/ P, P i' x$ t
EDMA3_TRIG_MODE_EVENT);
( `: L9 c* @, K( REDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, ; Z5 g* }5 L4 S+ F" C* w, x
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers *// _/ d5 ^/ e c& C8 n9 R
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);9 U3 b `( E }1 ~: W# R
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */ ?5 H' v! k0 Y( j8 F
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */. w% Q, O8 B6 R$ [
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
2 e$ Q7 N8 H5 ^8 \& q0 P LMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);
( d4 s8 U- f1 u8 J8 C} ! _& c$ d6 s: {
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
/ w$ n/ L/ d& P5 i! a4 @' S |