|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,- n1 c$ r: a; _& V! s
input mcasp_ahclkx,
, p* M1 U$ I3 I+ R% ]input mcasp_aclkx,; g9 J3 s* G( {! C8 I6 K1 {
input axr0,% P* Y" @ z7 z# ^; O8 X
: L1 G' f7 y% q: A7 ^8 v! M! Eoutput mcasp_afsr,
1 G% d1 y% \) s- n! Eoutput mcasp_ahclkr,+ ?6 B' R9 H+ i0 M( v4 m5 l
output mcasp_aclkr,
) ?: _" b8 I: a: k( V) Youtput axr1,
5 D5 |* [! s/ D B' w assign mcasp_afsr = mcasp_afsx;/ b! x- I" {/ ?8 H% Q; ~2 @; y5 s* r
assign mcasp_aclkr = mcasp_aclkx;- x Y% U" n E# \
assign mcasp_ahclkr = mcasp_ahclkx;$ ~2 m" c! g4 v' ]
assign axr1 = axr0; # o2 o/ P* K$ [ f/ H' f
% q) L( ~" C6 x5 d! Z) A* {, N# m! F+ N* ]在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
$ k$ C( `$ \( u4 }static void McASPI2SConfigure(void)
1 E+ X; d7 h& R; E# D$ r1 ~{! C) U l* s: ]/ e2 L
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
; v7 A# ` F* f# AMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */3 d. A" }9 |' y1 M
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);& B. e0 p5 E ?- j
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */3 E/ ~ H7 O# N! y1 ^3 n. w8 ^
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
8 T2 a: C; w% A5 KMCASP_RX_MODE_DMA);. m, g4 K( I. g5 f" q: N {
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,$ @% h2 v1 _# K$ t; Q& \
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */% p) B% {$ v% E; ~; _
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, ; b/ Q0 h/ a; p K9 f
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
/ n2 j5 l5 ~( @) fMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
6 D* }0 w3 N: Y% ~' h* S" vMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
# K! ^$ s/ Z5 l$ n$ ZMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
/ K j5 x6 l2 t" G$ Y) l3 W X( `! eMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); - @) r! s' F7 u5 d8 p, L
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,; C- ?1 Z- u% Z1 V. O) n: h! R
0x00, 0xFF); /* configure the clock for transmitter */
/ S/ K% Y4 }* B9 S) u: SMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
, r) U* y% ~- p6 [McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); 9 |/ a2 s! S0 U) \
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
8 K$ e1 A* ^& D# c1 f0x00, 0xFF);& i- \. i0 T9 u6 I
8 f4 {6 H# k6 y& ~/* Enable synchronization of RX and TX sections */ , z N9 A+ d; w3 X! k# ]( b
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */- S1 [, g! ^3 ]1 X/ e" L
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);$ e5 D& D, j& c4 d" ?
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
0 w; `. K( _9 z( J' O** Set the serializers, Currently only one serializer is set as Q% @ h% x% T* |/ i6 Y
** transmitter and one serializer as receiver.
6 O9 X7 m, p$ B*/2 {" [, A8 h6 ], y
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);8 N/ t3 h3 S5 i# Y& p# a! G8 |
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
0 d; V4 z% K5 e& A4 S** Configure the McASP pins
/ Y8 a }# o/ v** Input - Frame Sync, Clock and Serializer Rx4 k; \4 m: T \! r7 w- ~6 f
** Output - Serializer Tx is connected to the input of the codec $ |) s, }, e" H) w
*/
" V" R8 D, R* S: R( sMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
G2 Y d8 d9 q8 J( O5 S( A! m) pMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
0 Q0 Z5 j6 d$ {McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
$ }2 N! |6 U0 U& V7 V| MCASP_PIN_ACLKX8 i% ^/ l- g5 ~( A* U
| MCASP_PIN_AHCLKX6 T% y& t k+ I J/ C, E5 L/ @
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
3 Q- H. d% n8 M( y9 p; l+ mMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR , f u$ P( Q: a+ D8 D: p
| MCASP_TX_CLKFAIL
/ ?& Y- D- E- @6 P. C6 @| MCASP_TX_SYNCERROR, U& U5 ^( s% n4 R
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
" k6 F# s/ H5 G0 s1 C6 {$ x, u| MCASP_RX_CLKFAIL
6 y( g6 k0 V; \0 A6 l' m/ `/ \| MCASP_RX_SYNCERROR , M3 }4 j9 M/ @7 ^' P& F0 C
| MCASP_RX_OVERRUN);2 A8 L) [9 z f( H/ |1 A* J
} static void I2SDataTxRxActivate(void)
% X5 H& Z* b) M8 Q9 }/ O6 e{' Q% F1 F/ O; e# i2 p3 y8 J( N' e
/* Start the clocks */
" O; g/ X+ c4 xMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);- [- C1 V( N+ `2 P5 P
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
7 h% j- M% i7 xEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
; n2 \! Y7 I8 s1 yEDMA3_TRIG_MODE_EVENT);0 [/ z6 l, m2 N
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, - v2 \4 z9 v8 g* c
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */0 \$ R$ x9 R8 r7 P C! e, H
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
& s6 W F6 F. o' }9 XMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
: [8 f* i- n+ e1 |while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
& H; r, [$ X9 j# T) f( w, u8 }McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
; T9 K( D* q; t5 u2 {) ^McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
, t- ~6 P0 A: O7 D) a/ q! m}
6 ~$ X8 K% A/ C; l; v" r请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. 9 j+ F8 L7 ~6 ?1 i$ `" O3 s
|