嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,3 z6 k( y; g+ y( a" m, J: W
input mcasp_ahclkx,
; v7 T' N* w" { Qinput mcasp_aclkx,6 F R" F% q; k, L
input axr0,
) m. o' H5 y( j* P5 Z S2 \% Q" \# L& L4 M
output mcasp_afsr,
4 D3 I e( f6 v" {" L6 s: ooutput mcasp_ahclkr,
' O0 k7 M2 n+ t4 p1 Toutput mcasp_aclkr,9 N* [, w! c: t3 J; e9 ?5 q6 s& L
output axr1,5 Y" Q2 E; [" i1 Y, o
assign mcasp_afsr = mcasp_afsx;
, @7 Z- r5 t7 e7 A4 G5 D& y+ sassign mcasp_aclkr = mcasp_aclkx;9 r, b6 S6 y! N5 L4 f
assign mcasp_ahclkr = mcasp_ahclkx;
; y# m B) `: Xassign axr1 = axr0;
c2 j; D: d) D7 M, @) n2 ^) n
5 U. E7 u! n0 U+ W
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
7 Q( e7 D, {2 I9 D, g1 _static void McASPI2SConfigure(void)
( Q) ]0 g2 U1 M0 X- V7 H5 s8 Z. A. }{ m# R8 Z( y9 x/ V4 j' e
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
- ?" o% Y6 F) O4 T# @McASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */
\3 i2 f9 k. sMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);: T3 y- \9 p1 V% H* o! u
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */$ P9 A) \# F" N4 g/ X- f
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
7 a* H5 y, T1 \. Q; K4 P. IMCASP_RX_MODE_DMA);1 G2 Y* W+ p M) G
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
# U# a' l/ v2 S: y2 r, K) H& WMCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */
3 T& Z) s+ u Y# mMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, 9 Q$ k% c8 t, Z" |# D. j
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
; w; f, Z p3 k# G! G5 i+ Z P/ oMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
8 m8 r: t0 M- v+ M: w6 ~& JMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */
: \& c/ z5 S7 c) w. G- L5 ?! fMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);5 P# @+ ?1 _* O$ F) [1 e# \
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); , ~ g- o2 s! d0 N1 {3 F
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,: k% Y9 E8 P* U, L1 H0 `4 S' u
0x00, 0xFF);
/* configure the clock for transmitter */
- f$ y$ |7 d. [) j C/ N/ Q( CMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);' t1 S3 Z: ?) P. }- V
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); 5 O# [) C% L9 |8 H- h* Y" l. c
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
. ]& x4 D) [/ O2 ?0 l6 K0x00, 0xFF);
! y1 C, h R, O u: t+ K& m0 G. c0 s3 a( S" Q
/* Enable synchronization of RX and TX sections */
( Z: x- m9 W! k+ bMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */
7 T3 u, W$ s5 Z3 ?McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);" S# A3 `' N2 T1 a# T# [$ R# }
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*
* x1 a! z6 w% N& x$ U** Set the serializers, Currently only one serializer is set as
0 b5 d, w+ [+ Q% s( f** transmitter and one serializer as receiver.
5 k: `2 `3 \% P4 t*/
0 ^2 m6 U1 \& W s# G: @) U) y6 n* TMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
5 s$ n9 [/ e* y+ W5 f9 c! VMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*2 U l/ N5 |- r1 h4 ? [( b& X
** Configure the McASP pins
3 i/ Y( ?" b. Y7 c8 o** Input - Frame Sync, Clock and Serializer Rx9 ]6 e0 `+ p7 x* T. R$ H, s! {
** Output - Serializer Tx is connected to the input of the codec / V" ]( J' ~1 e0 P; b
*/' C4 m0 i4 O( d) s0 F% q; c+ v1 W
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);$ W9 ?( Y3 }0 d
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
4 K2 f. h9 F( Y! z0 `0 r# l! q. o0 NMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
3 |" D7 m: P5 y! j4 X7 G: b| MCASP_PIN_ACLKX3 k9 t$ \% H+ i4 r
| MCASP_PIN_AHCLKX
; \* E( q) B7 G3 l- c8 B| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */( n2 Q+ s" H! a2 J
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR + ?8 \* h9 Q U+ c
| MCASP_TX_CLKFAIL ; S; B% z4 w5 F# P$ V8 m1 P0 P
| MCASP_TX_SYNCERROR
9 g7 \& C! R3 Y) w. g1 a| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR 6 j' o" d0 Q1 J, C5 S& R Y% @1 b
| MCASP_RX_CLKFAIL
/ ?& x1 @( Z2 l1 S) @| MCASP_RX_SYNCERROR 1 @2 V1 W7 N- n) @
| MCASP_RX_OVERRUN);7 p# a/ u7 _. P* X* [$ X1 K
}
static void I2SDataTxRxActivate(void)1 C2 S: O9 ^, W
{$ V, p6 K% t; Q/ o2 S
/* Start the clocks */
. @3 d( ? E/ CMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
" |4 O0 B f9 Q0 VMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */; X$ D1 z4 T- F. f
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
0 S; \1 i1 r0 {8 y* nEDMA3_TRIG_MODE_EVENT);! K4 i2 i2 G0 f2 | u6 F
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
5 ^8 O, T' S; HEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */
/ e! \5 a* l- _- P7 X6 WMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
4 I5 ~, y" D6 H' D/ i$ i+ tMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */: h! L. v4 Z) e
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */9 ~- u5 t. M8 l i' W8 Q ]
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);# t$ W9 W! N- n/ `+ _! V4 V
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);( i/ b5 A3 n3 w
}
# ?! c @! N6 y% Q) a* [7 p5 g- o请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
6 f; U! r5 @+ O
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |