嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,0 i- V; [; W; H& w# d v: I7 Z( B' q
input mcasp_ahclkx,4 S; }( x1 M: \/ @" N; x: {
input mcasp_aclkx,# E& ^+ o4 M; ]: ?) W
input axr0,
" J. \# }9 [) ?' g4 R; @
4 K) f8 B) t9 `output mcasp_afsr,
( y; M' Y' E; ?# ]2 goutput mcasp_ahclkr,
; ]/ W3 w& r2 q' b$ Loutput mcasp_aclkr,: m; j% p( n. N) o: s/ m4 x
output axr1,+ X8 Q0 I3 _* L5 L
assign mcasp_afsr = mcasp_afsx;- ]9 {( d C9 A, X9 M1 x' _6 m1 ~( }
assign mcasp_aclkr = mcasp_aclkx;4 o. D& p+ I3 d4 R
assign mcasp_ahclkr = mcasp_ahclkx;* m* k1 x2 V2 b4 Z1 p( x& @
assign axr1 = axr0;
3 @7 g9 R$ t- t+ f' V- B; _% z) s" S' k( K1 p
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
: G0 c* U2 B* I0 ?% o1 W; c
static void McASPI2SConfigure(void)
+ e* y5 t8 {0 r{. z/ I% k5 r& |+ d
McASPRxReset(SOC_MCASP_0_CTRL_REGS);' C- a. S: g" `4 [
McASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */
) S% `. u$ H. z9 {4 d. ^McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
4 E& g1 j" G1 fMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */, C% w& F0 A5 r4 }( k# q
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
3 q) ?( P% l7 G. C, I0 _1 ZMCASP_RX_MODE_DMA);
2 U( E9 o3 ]& F: s& P* [/ NMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,; w- v# O' o& K* O
MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */
+ y7 B) m! m+ T. k" ]McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, * u, x4 ~+ T6 Q
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
: d/ L$ o& f$ _5 A6 b% I/ ]McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
4 [7 u! r% i9 \/ rMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */
7 N7 G6 ^/ v$ i% L1 w, VMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
! j+ e- Q% a7 g9 G! CMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
4 L! }: t$ Q! X6 \) vMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
N4 A2 N$ v0 i; D0x00, 0xFF);
/* configure the clock for transmitter */
, Q) \% H: E- qMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);8 n3 A2 m% K6 q( Y! b
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
1 D( m& G% w' ^McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
( T: K6 X( d% t# t' I0x00, 0xFF);& w' H2 `- U" F s! i0 v( `* c
0 [ N( h; g2 y, W4 r( O8 ^/* Enable synchronization of RX and TX sections */
. m, d% w7 ]: ^McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */' g. E2 D+ y3 `- z1 R2 I9 }2 c
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);* }( A5 Q; R3 e' Y& d
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*0 B( U5 R/ F! J" X8 G ^7 K8 t
** Set the serializers, Currently only one serializer is set as
v: D: n Z4 h2 [, I' d( _** transmitter and one serializer as receiver.8 V" O' F4 U/ u# W$ G5 p' v" j+ W( I
*/
2 t- E t/ }0 ^! oMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
* }! \9 p+ Z; E; R4 w6 RMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*
: J/ ]; j" M$ W** Configure the McASP pins
5 g3 o+ P" y8 [" D- T** Input - Frame Sync, Clock and Serializer Rx
! p, O# u7 d: p$ @, ^** Output - Serializer Tx is connected to the input of the codec 6 r% i% e! x# r8 C5 J: A- g
*/
9 i3 T$ H' a0 s! RMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);3 @3 N6 \9 p% `5 L
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
, i% I+ n& f0 _" `5 K* s+ \McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX" E) B; f" n; D) k. \2 r0 {8 O1 \
| MCASP_PIN_ACLKX
. N9 h. n" v9 S1 s- p| MCASP_PIN_AHCLKX
0 Y1 G7 ~: r9 p a6 k0 x7 q. C1 V| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */
& K; l R. E# Z% `McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR 0 v+ g* V7 E% K* S
| MCASP_TX_CLKFAIL
( r. [' O; r8 b! z6 N| MCASP_TX_SYNCERROR
) o6 P1 ^0 A) X' v+ ~1 }& Q) \| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
& {& U" b# E- C G/ |8 p8 f7 `/ e| MCASP_RX_CLKFAIL/ @5 k! {! N! ]$ O/ M1 T Z
| MCASP_RX_SYNCERROR & @+ t) L: |; w7 U
| MCASP_RX_OVERRUN);
% e% ^9 p+ \) [3 T}
static void I2SDataTxRxActivate(void)
. U8 h% t: {+ L5 g: O* p{
0 ~5 l" u' N1 O2 l/* Start the clocks */
7 u. |' E/ s1 e& fMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);% E/ s( Y' C- z, V7 K
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */
$ F& {0 ~' w& v4 M j$ _% aEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,+ O8 S2 e+ |( y& D N; {5 {
EDMA3_TRIG_MODE_EVENT);7 k* {& W( F% s- W! l6 g6 _
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, 7 g% X9 Y3 }% v: U
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */
* h+ {5 I' e5 O; F) nMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
- @+ Q9 |. M% A( I) H3 rMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */
, j; e n5 k' u9 nwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */
$ y3 U1 n$ O; O6 k' g3 w3 AMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);$ ]1 Y+ U }4 P
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
" g7 l7 l, u+ i* s6 B. g}
' @* i& z' Q& @5 [( T5 Y8 u
请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
( D$ ?0 }- O2 i% z* o2 Q# B9 o
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |