|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
' t' G2 o. \1 v1 k4 p0 dinput mcasp_ahclkx,* w( k* t$ O. @4 ~" I$ b: _( O6 t
input mcasp_aclkx,6 G [$ D* k. d1 i
input axr0,
+ J0 l1 I6 u2 u; |, f7 s+ m
) o7 C: J' I2 g% Koutput mcasp_afsr,
5 j9 r3 p* f' W r- ioutput mcasp_ahclkr,1 Z- o* F6 e0 z8 {/ L% P
output mcasp_aclkr,* e9 m/ w" W& K( Z6 U
output axr1,: K0 v; n2 s [" m# a* g
assign mcasp_afsr = mcasp_afsx;
9 W$ ^% m; J# s6 C: g# a! lassign mcasp_aclkr = mcasp_aclkx; W- m6 W% e2 Z* o' w5 n" J+ }( t
assign mcasp_ahclkr = mcasp_ahclkx;
1 D+ Q; U& c/ C% o% Y7 jassign axr1 = axr0; , S: g+ o# W' Z% O
% p. t. R# [2 u: Q7 x O" a
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 # r- D6 C% K$ h3 V' ]
static void McASPI2SConfigure(void) U% N# \3 N+ U; z2 b$ M& j* L
{/ s9 F* N, o* q3 ]/ h
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
9 Z/ }+ J# ^( A" q/ AMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
" k- a1 E8 E0 _3 nMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);' z; J' x+ f* w8 D- b9 C# o
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */7 C& _; {. Y2 d+ z2 Y" M( ? R) T
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
' n3 p2 f/ w1 [: w- e; iMCASP_RX_MODE_DMA);
& H1 J# y {2 T, e7 uMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,% R5 ]0 a% m3 Y
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */8 t4 m- @3 O7 s* y: L
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
! m; `' n4 L& n9 R$ A; AMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
+ z r) z/ t) x9 v& k2 JMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
6 E m3 N6 g# A4 s6 q3 }$ s1 MMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */) t0 w- k0 a* }: f( l! e
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);6 z0 u& O6 k6 }: y
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); 9 h* q2 T0 ~- \. s& s7 u8 }4 c# ?
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
& R# A3 L2 n5 l0 S- K* m" d0 Z0x00, 0xFF); /* configure the clock for transmitter */, g- h' w' A H" ^3 m
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
% Q! S* e q' M5 v, G+ H7 k0 xMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
/ f. J6 q4 c. k. \McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
+ |; j0 Y/ ?' f5 }6 ?" X: i0x00, 0xFF);
O2 m; `$ I5 M
# X8 Q' t- N6 l) U9 Y }8 x" S: g/ y/* Enable synchronization of RX and TX sections */ 7 i! ~. o$ }7 W* R9 ^
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */. x2 ]6 k, T N. A
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
' k9 U1 U$ w) p! Q) G; iMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
! S9 s- r$ H7 Y1 K7 e" U** Set the serializers, Currently only one serializer is set as
/ f$ k9 I* n- A/ {** transmitter and one serializer as receiver.! C' I _# X" u, Q
*/
8 v- u: e- {, V! {( k/ hMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX); U4 u( j& E: N, k: F5 c1 N* j6 j# F
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*. f$ ~3 N" ?1 p j) c0 ~0 n
** Configure the McASP pins
0 T B6 b5 V; b. D9 v** Input - Frame Sync, Clock and Serializer Rx0 b+ K: L/ Z9 J3 }* L/ j
** Output - Serializer Tx is connected to the input of the codec . e4 n: p) P4 _0 m% F% J7 V
*/
& \( p" L0 O; wMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);6 d. C1 H2 ?' ~" Z
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));; p0 Y: A& W! i6 s1 a3 |/ [
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX8 z" [: _- Y$ s+ O) `. q- Z
| MCASP_PIN_ACLKX! b$ i# e1 c3 _2 h! k$ g6 I
| MCASP_PIN_AHCLKX) {/ Q7 W! g! F2 W q
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */* {" @; M7 ?2 H- n9 x
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR & X) ]; r' W, n: e* E
| MCASP_TX_CLKFAIL ; _/ @- o$ ~9 \) I8 l, n% q
| MCASP_TX_SYNCERROR
+ q U5 u$ }1 x' Y2 _| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
9 {8 A& @/ i c3 x| MCASP_RX_CLKFAIL& t1 z+ q- I, s( g3 R$ p
| MCASP_RX_SYNCERROR ( C2 H0 m+ U0 E$ ^
| MCASP_RX_OVERRUN);0 F! e' ]3 b; @
} static void I2SDataTxRxActivate(void)
3 B/ k0 v! l) Z0 _' Q+ `9 E{
; e4 ?/ K. Q3 V/* Start the clocks */
( P; ~+ v a' ?- i: _9 A8 v" BMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);- V3 M9 Z0 y, e3 [$ g( \: h% `0 q
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
) v+ L3 w% B% a7 JEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,5 E. X1 d$ w- B: {6 o$ r, f8 ]
EDMA3_TRIG_MODE_EVENT);
" \* C# b6 }( N) |4 a; y# Y. A+ xEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, * y7 d* W( H n
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */! p6 B0 d7 _1 H. E/ ^* E) {( F6 {
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);1 s9 G- B* \; |/ [$ p, a
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */9 S3 T `' Q9 \( I: J
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
% J/ R* i8 Z. [# J: ~" q4 D" [McASPRxEnable(SOC_MCASP_0_CTRL_REGS);0 q' \9 O- q2 U
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);; b5 K( z# u! g5 v" k- }
} 9 X, B; q0 w+ [$ s8 h
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. # k2 x9 ~; H% R- t, k! x% C1 w
|