|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
5 p" s) E1 C% f1 R6 I! D+ v8 T( Pinput mcasp_ahclkx,
3 M0 ~8 F: ^1 a9 `/ V$ Tinput mcasp_aclkx,
2 c. h: t# k- j1 p2 p% _, W! Dinput axr0,. H- K" b! _1 x2 @
6 S* a5 U& ` Z. |" F) ~
output mcasp_afsr,4 D; l$ h: [8 }" T( F
output mcasp_ahclkr,
5 z/ H/ r9 P+ v0 r2 r! O, xoutput mcasp_aclkr,0 C9 N* x. Z/ h
output axr1,4 ~( ?" Z8 @6 h% f
assign mcasp_afsr = mcasp_afsx;# G% z# Q; m+ Q* f5 s
assign mcasp_aclkr = mcasp_aclkx;8 M4 q/ i' `, ]1 U' d
assign mcasp_ahclkr = mcasp_ahclkx;
+ c% F& ^/ T" ]8 e, o, _assign axr1 = axr0; / C. `3 o3 B: C- E
8 k; A1 A% z* Y- ^: L在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
) j" I" h3 R4 Y2 q& J, Ostatic void McASPI2SConfigure(void)
' R; F6 }$ B- l& o{, k0 I- ]! W- e; P0 `
McASPRxReset(SOC_MCASP_0_CTRL_REGS);! i) E- @! N1 k: |4 B3 m' M' b
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
/ C. u; n# T# s: Q8 j$ |" NMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);+ n) `. t4 v0 y6 X: I$ C& C# @0 e! g- _
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */3 [! i! R# F( g8 x' v4 c
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,6 H- o# O, b, |& M2 N2 J+ E
MCASP_RX_MODE_DMA);" ?. P; v( `1 l
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,4 ^( f. o/ H/ i, Y
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */! P; R) r. U% i- f$ a. W6 e3 Q
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
: e8 D: a: J& j+ L3 \MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
3 }. @' _2 `) e( G6 DMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, 9 X. |6 d8 J1 @7 M* P. w
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
2 b6 R; p$ L4 u! \McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);, j% g7 ~2 {8 |5 j
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); % c& c: y, V6 x% ^- C5 D
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
/ K- g, y% R8 A/ B& g0x00, 0xFF); /* configure the clock for transmitter */ |. u" J; M$ p+ ^
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);5 T4 W. `* y7 p: L- S
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); 3 a) u$ m" K& A+ u8 c B1 x
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
& V, L; r6 S# N0 e1 S8 z& j0x00, 0xFF);
. D+ R5 \# t3 y \
1 b) V4 e- o. M( o" _/* Enable synchronization of RX and TX sections */
) o2 a! A+ c( ?! oMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */7 [5 o" P1 D# r' q D
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);2 m3 K' {1 R6 J( q( v5 ~1 t% j; T, M
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*8 F8 V3 V2 U0 T- c8 D2 f
** Set the serializers, Currently only one serializer is set as
5 g" e8 X0 f& Y- P- S, d** transmitter and one serializer as receiver.
+ `' ~" Y4 P5 X/ B9 v*/
+ [2 I |0 z+ vMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
; s- b8 f: }9 U1 ~McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
/ y5 g% {7 x( @" Z: m% _# Y% w x** Configure the McASP pins $ m1 o8 w) ~& l' j5 ]
** Input - Frame Sync, Clock and Serializer Rx0 o( }1 a' O+ K7 _* V3 J3 e4 H- T
** Output - Serializer Tx is connected to the input of the codec 2 h$ i2 J" A4 `. \0 H: Q1 z! h8 |$ Z
*/' C6 _) O% ~6 I1 K+ X# }) c
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);% X' c L0 J0 C) L" `4 y
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
9 \* |* t I2 e4 _McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
0 F5 Q! W1 y8 x6 C: O% i0 s9 m| MCASP_PIN_ACLKX/ L# j3 D$ ?$ |" t0 @
| MCASP_PIN_AHCLKX
/ C1 R/ ^. U) ^' T8 v l: e| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */! i& ]& _$ l' I( g( j
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
) T$ P3 C! e B+ A% Q| MCASP_TX_CLKFAIL
# V1 Q ~1 b& i# f) H| MCASP_TX_SYNCERROR1 j2 G( U1 R4 ]9 c7 i" s4 t
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR . e0 o3 _5 g5 J7 V" N4 p$ r
| MCASP_RX_CLKFAIL. ~+ o; p) z" s6 a" E- F. h
| MCASP_RX_SYNCERROR 9 Q' e$ B# @4 _5 V
| MCASP_RX_OVERRUN);/ ]. u$ p3 U, N8 q' P5 N
} static void I2SDataTxRxActivate(void)4 q3 G' q1 A1 r- y; q0 v
{
~# u/ U4 _' w7 n/* Start the clocks */3 s1 W {: ]; o' C% ^
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);# H1 f* {6 {$ c5 ]5 j* v
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */) S/ g3 R$ f- N, F: c5 q7 X) }
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
% M3 [% h' X9 ]2 y0 [1 U+ `* pEDMA3_TRIG_MODE_EVENT);9 Y! t1 F- f \ C% ?, T2 H" n+ `5 ~2 `
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, , ^, S& L: a3 u7 G( J) W* x
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
6 s4 @0 _; R4 P2 R# F- H& O$ nMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
4 w. M5 W& a7 N6 ]/ I+ BMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
" L' s( a" N! x# z4 E9 H* ]while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
- \- g- e J6 wMcASPRxEnable(SOC_MCASP_0_CTRL_REGS); I9 W$ i; w" Y" m9 p2 G
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);) ]' O# N+ u J8 b6 M
} # R" A _+ z% Q$ ]* B9 Q0 r
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. ' P0 X& b4 b6 Z& f8 }( y/ S
|