嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,
9 Q m+ e+ J6 j! einput mcasp_ahclkx,
, D5 q9 m# w. m" n, a, A. j7 ~input mcasp_aclkx,+ Y8 `& P4 U( b' }; [! A3 Q1 \
input axr0,
/ I* C" \( ]9 M- x0 v4 j B6 V) j* Y m8 D, [+ V$ t$ A6 \+ S
output mcasp_afsr,
" t" ]. A, w4 doutput mcasp_ahclkr,$ g: `) v b {
output mcasp_aclkr,
5 E& u9 E3 U# V moutput axr1," s: H# C, D' v' Z5 R% f
assign mcasp_afsr = mcasp_afsx;5 l( [' ]. N9 S8 U
assign mcasp_aclkr = mcasp_aclkx;1 q1 ?4 w: R" \$ v
assign mcasp_ahclkr = mcasp_ahclkx;' Z# @5 J9 ]$ j _! i. ^3 x0 U
assign axr1 = axr0;
1 ], v* @4 Y4 Z" z( h
8 D" E N: i7 G- F3 C5 w
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
+ Z( i* ~( K2 u. `. y
static void McASPI2SConfigure(void)& A1 T" P |9 U3 N' |
{% A/ I4 Y, \% p6 O
McASPRxReset(SOC_MCASP_0_CTRL_REGS);1 U+ B N; ?$ H' f
McASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */$ [1 {! s6 I5 n2 p4 r; B6 }/ @
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
3 l+ Q8 M# l3 A+ HMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */' Y4 e, T9 c* o& D+ K- I
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,; @% N/ t% P* \, m0 }' ?
MCASP_RX_MODE_DMA);
$ {* T3 s4 h4 c6 `& [' E4 _McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,, ?2 @$ g5 X- e1 {; [. m
MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */
8 m1 [0 B, y, M7 aMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, 6 {8 Y6 a7 }; u; ^+ Y: c; ]
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);* d' f" n$ l# S6 c$ r3 a; D
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, 8 c+ s+ T2 Y% u6 I( M g3 y
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */
' w; [( R$ l& h% wMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
% w/ T/ i$ M, L! @! HMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); & K) b" y* w+ L& A
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
& n& [7 F% K5 N, l% U0x00, 0xFF);
/* configure the clock for transmitter */
) E8 v ?( s, L0 }+ v& r2 jMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);+ j* \4 i" b/ J
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
( ~* b4 K3 B; N7 H s* [8 gMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,& h* C& k0 x% q, T' V
0x00, 0xFF);
+ O! z/ x( o0 ~ h' G& G3 C4 _6 H. r9 M1 p6 l4 x- Z3 |1 R
/* Enable synchronization of RX and TX sections */
b/ L/ q- @$ t. D4 _( lMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */7 a+ ]' s% N$ p5 G8 J" K' W V
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
" H' u2 T& c/ |6 ZMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*9 D' s( a( M4 z+ b' Y2 m
** Set the serializers, Currently only one serializer is set as
. i2 l3 m; i' A** transmitter and one serializer as receiver.
, G! s! u5 w, L*/% P* ]# ]) f' N2 L1 H* P
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
" b5 T. z( c7 L, ~McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*
8 V# N0 _+ `( n7 u) t1 ]! R/ U** Configure the McASP pins
$ F T! i( a* n. x3 h7 M** Input - Frame Sync, Clock and Serializer Rx
- S6 G8 Q6 @; R% D** Output - Serializer Tx is connected to the input of the codec 0 b8 Y, @/ e: s D
*/" M7 ]0 ^5 C+ P/ S
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);: a! ]' g2 ?2 P& Q- b
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));# q- Z+ G& w& q7 L& x7 h
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX! e R; c1 k( C# x0 M8 E
| MCASP_PIN_ACLKX$ M. W8 r0 f U
| MCASP_PIN_AHCLKX" C# Z. P3 c5 I9 b, c9 T3 O* K
| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */
0 B! a* P! H' c* F6 ]; |( HMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
! |- ^' s6 D! Y K! @( a q8 E| MCASP_TX_CLKFAIL + f/ c1 g8 k: ?: H( h/ r8 ]
| MCASP_TX_SYNCERROR
3 Q2 g, M* \6 W5 g6 l& I( || MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR ) C9 \ k( |% z- v
| MCASP_RX_CLKFAIL
$ W, A) p; R$ p* h- R, P# P" b- X s| MCASP_RX_SYNCERROR " L! E: O* p$ e T
| MCASP_RX_OVERRUN);2 Q' l a" R: ~7 ?$ u% K: P+ W
}
static void I2SDataTxRxActivate(void)
1 r( ?/ V4 T0 E( m" Z* \{
0 x; ^( g% ^: }; ?( v1 @) u/* Start the clocks */
5 p/ g( c$ Q* m1 u5 KMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
# m$ Z' A2 H+ r) I1 MMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */
. I+ J/ y2 q6 L. g8 O% M8 D( REDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
' ^$ c" ~* n1 Y/ e: oEDMA3_TRIG_MODE_EVENT);
0 p7 L) r' A, r) Z" q5 gEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
* x# {, T! x4 v. e- WEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */. ~1 P% s# @+ ~4 s; W
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
M0 E) P- D. z8 M& q4 BMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */
% B4 I+ [/ j1 g: j( q* o$ Y P) B$ o. Ewhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */* |% P. Q! ?, u9 a- }% l
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
2 V8 h# X( E6 q+ x' [4 }McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
9 l( ]+ E8 l8 E# Y* [- s( k! W* n}
/ O/ u2 P; F3 S5 u/ f( s: u请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
% U5 P2 h8 h: v1 |8 |4 Y2 V
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |