嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,
$ p N) z! V8 b9 b# F2 iinput mcasp_ahclkx,! M8 m, D* h ~
input mcasp_aclkx,
$ ^# V- m6 L i* T8 Yinput axr0,* G8 z s9 R+ u' B3 j" ~) H& e
3 ~/ m9 G/ N2 n" Ooutput mcasp_afsr,; A; ]( k3 u' g$ X6 L" O" ]
output mcasp_ahclkr,0 q% `4 D3 T7 N2 Y
output mcasp_aclkr,
" N7 N4 W- ]( aoutput axr1,
" h" ~/ K; }6 N; _& S* t/ i$ F
assign mcasp_afsr = mcasp_afsx;
9 f! i: h V$ U9 U+ Cassign mcasp_aclkr = mcasp_aclkx;
$ R8 K* @9 N% t( t" k) D iassign mcasp_ahclkr = mcasp_ahclkx;
' W+ u, l V8 |1 z) Gassign axr1 = axr0;
" E" K! s2 g- C$ l* z- @- d
. s1 J! e( B) `( J I) c$ K$ n x5 S
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
+ H* C8 n# R9 \& P8 Y# Q
static void McASPI2SConfigure(void)
- Z$ o. P$ g$ c{7 D' V0 B! y' t' j* k" }0 }0 E! `9 @1 x
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
& {9 V0 y7 K4 eMcASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */: K* C: r( g3 E4 B# l6 C
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
2 y% H/ B' v; a' V. WMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */# ]* O, l% u" Y: ?: }+ ]2 R( x
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
+ e. ~- Y- P: m& |" g% B# iMCASP_RX_MODE_DMA);, _% I# T; L2 f
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,0 q: ?5 n2 m7 x' u8 X
MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */
2 t6 p4 O4 v+ `7 {McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
5 O+ L" Y1 O" x* yMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE); i3 a6 Q, ^4 a
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, $ y8 O( o( x* g
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */* [; K; ~" S( p5 o$ h
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
0 A$ Z/ W# g% j" V3 |' nMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); 2 Y7 E* u) [" w( i0 d5 x2 |
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,* i3 U" J6 A! ?4 p9 n* u8 C
0x00, 0xFF);
/* configure the clock for transmitter */
' x0 n+ i$ g' R3 G% X A' n) U @. CMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
) |% \% s9 X2 @' l* Q1 T) DMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
4 c6 H/ f$ h: k8 a6 nMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
, c( r* x: g# o0x00, 0xFF);9 J+ k. ~( I; @$ v
1 j( d% D+ q' h+ _2 [5 C
/* Enable synchronization of RX and TX sections */ k% c. q4 G% z9 z7 I- _: p
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */
( n4 e" V. m4 ~9 HMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
( u" s( h" ~. E, s. Y# P1 p+ WMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*. Q/ m# }. j1 I% s
** Set the serializers, Currently only one serializer is set as! J7 H" m4 T! s, l; L
** transmitter and one serializer as receiver.8 U4 q3 l! E1 R! X
*/
* x7 }! F5 J5 F# h5 I0 DMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);" h6 K+ K2 f/ ^8 W' ]
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*
! p: ?( t7 X2 p/ R. ?( p** Configure the McASP pins
; C! G& y9 }! u% e7 q** Input - Frame Sync, Clock and Serializer Rx
0 Z$ |0 j! D5 X+ f2 {** Output - Serializer Tx is connected to the input of the codec
+ H3 s" R7 R1 u( V*/
, Z! y' ]' _% \$ I ZMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);3 x9 |5 {* Q7 S' `$ T
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
& w; X4 S ]: Q$ pMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX1 f4 n$ |- @# A6 d3 u! O9 f) s
| MCASP_PIN_ACLKX% |/ t0 X3 P* D" k
| MCASP_PIN_AHCLKX, \( w& y/ R0 l p8 @+ T1 I7 z; a
| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */
2 W- p) O$ `, s, JMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR " ?" ?+ I( l" o
| MCASP_TX_CLKFAIL
" h3 u! s/ }+ ] {. r$ T9 S! `| MCASP_TX_SYNCERROR& M! G2 |' s4 G" T
| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR . h! r1 Q5 R; s, _# G
| MCASP_RX_CLKFAIL
8 }: Z; X" r3 U' y| MCASP_RX_SYNCERROR
( e6 c7 `# k& Z5 c9 S7 k8 _| MCASP_RX_OVERRUN);
9 S, P" l3 w5 {. |2 J, Q8 j/ P}
static void I2SDataTxRxActivate(void)
7 M" F3 r! Z8 S! o{
& V) ^1 b1 |: T* d: y/* Start the clocks */
; I4 c( F& U- p* NMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
2 C9 w7 ^' c8 x8 w- L/ l' ^( sMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */
* Z1 ^0 o. M n& ]7 R6 rEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
, c4 Y9 [2 M7 o4 }; C" Y$ nEDMA3_TRIG_MODE_EVENT);
+ `! N5 I( R5 r# w$ T4 N" f: OEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, ! d" I, L1 C( z$ O" ^
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */
1 x: C( `% X& s4 V( AMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
2 o( x. f4 _4 T: D% I7 hMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */. X4 m7 k. F# _
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */
: ]7 x+ p' _2 C) U, \0 o9 f5 {McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
# T, }% a, a3 N$ _McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
6 y' d7 G) D% f}
: a$ e9 L, _3 L# R3 M: p
请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
) a/ Q1 m* w, S$ n3 y
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |