嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,
6 O( o6 h& v8 @input mcasp_ahclkx,' I1 n4 X* X: F6 H- g# W
input mcasp_aclkx,8 }- {( Y$ V: P$ F. k# H
input axr0,- Y1 d( r% `8 c6 ^
2 A! w% m1 u, i4 O( D4 @
output mcasp_afsr,
! b9 T+ l% C& t& Woutput mcasp_ahclkr,. d/ p6 q$ c$ p; R
output mcasp_aclkr,
7 n1 W2 T' {7 o3 a5 Ooutput axr1,
: q/ L0 w C$ z( R
assign mcasp_afsr = mcasp_afsx; d! Z$ z4 l. m
assign mcasp_aclkr = mcasp_aclkx;
k) ~9 \$ @$ \7 m. i L0 massign mcasp_ahclkr = mcasp_ahclkx;, S: z8 j% U4 `+ P! d% w3 ~
assign axr1 = axr0;
/ w' ~2 g7 {: _ Y: @3 ~* h
/ ]% y- n& S8 a" e. x在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
0 ^: D) L7 j1 n7 |5 }3 G
static void McASPI2SConfigure(void). e5 q2 A5 u$ A) l
{
4 g% B2 |6 x. Q* eMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
& \# R3 Y2 ^8 T9 {9 `3 gMcASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */- `( f) A* A" ^8 v( V' g/ Z
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);$ c r) i7 ? D
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */
/ r: l( D; x. d7 KMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
7 [9 I5 G/ V4 [* b& k' t7 GMCASP_RX_MODE_DMA);$ n8 f" N' C d/ ?2 @4 U
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
: W4 T' I# c% S5 C! ^) mMCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */
/ q2 S5 Y( q# ZMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
% l% t1 L& T4 s$ C, w* w! UMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
) c- p/ L) y4 K% |2 SMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
0 y% _0 w% E3 \8 E0 E; S; lMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */, Q: r; a. V% h& g* N( e' g: H
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);! t7 P2 q& a" a% }
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
* i$ @6 Q( S: y$ t5 z! _6 y/ @( lMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,0 H1 s# a/ q7 B% `/ Y% I
0x00, 0xFF);
/* configure the clock for transmitter */
4 q! r k" @8 Q1 _+ `McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
) X" Z8 }2 }* h2 O& @McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
& l# |! } n3 L4 w/ Z! c. TMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
8 o0 Y& Z( t) K- Y4 |- y0x00, 0xFF);! b- v+ s H0 C, H; f! O
7 ?3 }$ {1 F5 \( u/ T/* Enable synchronization of RX and TX sections */ 9 h( c( N' [$ F+ i
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */. W: e) ?) q* ^: B2 ?
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
7 S" e- F4 i3 ?1 X( W' zMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*
# d1 @. u5 S( z* B3 U** Set the serializers, Currently only one serializer is set as Z, _# b" s1 @0 b
** transmitter and one serializer as receiver.
4 }( q* w1 e- P& Z0 P, y*/
; ~: p( P- g% b/ G1 Y, EMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
+ P+ e% [+ k ZMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*8 H+ \: X7 a4 ^
** Configure the McASP pins ( {$ ~( q' o4 K. O2 ~) S" D
** Input - Frame Sync, Clock and Serializer Rx
3 ~% L8 M) L% _7 o, z0 s** Output - Serializer Tx is connected to the input of the codec
' i) x% K2 K* ^% a) X8 t4 u*/
( k& J' n7 L' p6 A0 I5 z6 @McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);1 x7 ^7 q# H; g* Z+ F5 Z
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));4 L3 T! R- q/ f0 o- W; w
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX& W* e- m, o5 ^# ?) E: {3 _( o
| MCASP_PIN_ACLKX
; ?/ V+ f2 O1 |+ G% ^# m8 D9 C| MCASP_PIN_AHCLKX
/ c$ {: B# `3 k& }9 x| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */
9 s! X/ `# b7 Y8 O0 o/ A. `1 qMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR 8 v G! ?0 a% p. V0 {4 _& _/ r' w, L
| MCASP_TX_CLKFAIL " Q, `9 w8 o( e8 r' Q7 V
| MCASP_TX_SYNCERROR3 Q( u7 w' t8 U8 u- C3 ~2 I
| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
. P2 x: N- |$ [( e# O: Y0 }1 t. i- ^| MCASP_RX_CLKFAIL
& r2 f+ G; i* } x0 Y3 ~| MCASP_RX_SYNCERROR ; n$ d* c r( N/ A+ N" y
| MCASP_RX_OVERRUN);$ y1 n% _4 v+ \# Z0 f
}
static void I2SDataTxRxActivate(void)! c5 Y# g5 x! X' k6 y$ |
{: f7 m' {. a/ A9 z
/* Start the clocks */ q9 v% R" i1 D
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
W8 [9 n. o% F! j7 P- XMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */
& l2 U% Q8 l* w) qEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,8 r0 U0 M) r) @. I5 {
EDMA3_TRIG_MODE_EVENT);
9 Q( l8 q8 d! Z, z" O& uEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, 1 E, `7 ^7 R1 W- e% u: a
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */
! ^ w0 W! H! IMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
' \* Q$ @& `/ d+ c6 t: n; fMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */
! W7 M% Q% U+ A" N6 E7 B- }while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */
* l( }: s# i; BMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);. |0 k9 i; |! z( N
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
; e. |0 \/ t' p' M5 ]. {7 f}
' W( ~% V) P6 _% ]9 \& t0 ]$ D
请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
# K1 |6 h( h* j; P$ ]
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |