嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,
6 o& D, A$ d$ f0 h* I% iinput mcasp_ahclkx,
$ j; ?8 ~. K( o( E+ y& R) V9 F uinput mcasp_aclkx,7 e; s# l$ V4 {
input axr0,
0 G9 l3 i7 X9 N, w7 }
) Q& o# v5 Z0 A6 zoutput mcasp_afsr,( \* r7 `4 L2 B' F d) Y I$ o. Z
output mcasp_ahclkr,+ P5 K% `4 N9 ^
output mcasp_aclkr,
% w4 d9 ~- F, o7 z. d- m7 Y3 R" Poutput axr1,
4 g- x0 E, r" _
assign mcasp_afsr = mcasp_afsx;
' s: t% K9 p6 T$ x2 ^. q! [assign mcasp_aclkr = mcasp_aclkx;/ }& _$ u# m/ ?; S- V3 R
assign mcasp_ahclkr = mcasp_ahclkx;. K3 p& |7 c- a `: I
assign axr1 = axr0;
* \& c% T6 u% u7 B' P! c
* L! r3 G) {# \& A# L在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
5 a/ R, R7 S5 C6 Dstatic void McASPI2SConfigure(void)# A% l) T6 e- `* H" @8 t, \
{
+ V3 j3 A- x* F0 u* Y8 M vMcASPRxReset(SOC_MCASP_0_CTRL_REGS);+ }" u. P5 K: P; c2 E' u
McASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */
) E9 h2 Q, A$ K zMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
- i8 Q( @ `2 t: Q D% O8 aMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */
" V, K. M8 c- `% R) }McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
: B) v0 m* J' L7 TMCASP_RX_MODE_DMA);
! W* ]& w& {. I7 r f+ NMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,, D1 l! [8 Y8 F7 ^$ J4 C' M! Z1 s
MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */
! d ~0 n8 O# S [; c0 NMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
3 u5 W& Y/ x4 NMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
7 o3 ]& h- [ s; I8 VMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
+ e, @1 I! \" G8 m5 Y; P6 xMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */% ]$ }- j$ H# Z( Q9 a+ W
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
$ C8 T) O+ F* p/ A8 M* i& H hMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
9 A' U$ \7 q* ^4 c8 c' Y! m3 f1 YMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,( }' f( y3 m- Y7 q7 W* R
0x00, 0xFF);
/* configure the clock for transmitter */
1 ~$ C6 ~" |! C# A" U2 gMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);* K/ W7 @0 l9 Q2 F
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); $ n) S$ f* X8 E
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,! l* C( c4 J1 N5 Y; q' @
0x00, 0xFF);& V; v% D% v, j0 p$ O' k9 \1 w
' ^5 H Q& T& {2 A9 W0 g. b# X2 W0 ?/* Enable synchronization of RX and TX sections */ . T6 G; h# J/ M: }, x
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */2 V/ Y$ }9 S9 |* |
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);' f$ N8 d# r! ?; @3 D
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*
! H, C# T6 `. I3 p; ]** Set the serializers, Currently only one serializer is set as0 S4 t8 g0 k5 @/ W" \% \
** transmitter and one serializer as receiver.
2 i4 a: z3 i( @* q! X*/* Q7 L, c% [$ u: ~' }
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);# K- J5 `, W8 ?' p+ M
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*4 E; L# W) c7 u7 t% i+ k1 x& L3 B8 I4 O
** Configure the McASP pins
$ M8 v& Y6 C& I) t7 D$ }. J/ O** Input - Frame Sync, Clock and Serializer Rx( ~ w" t2 D2 ]. W/ u9 {
** Output - Serializer Tx is connected to the input of the codec
3 ]6 ^0 _/ p6 q: E8 A2 |*/
5 J) ^% R: }* JMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);' m$ o+ Q' ^& K; C& m
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
6 F) W4 _" a6 j& T3 ~McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
% N2 }- P9 ?) R9 Q- g+ O| MCASP_PIN_ACLKX K6 f. z# M0 }- |0 I6 [2 }. U, t2 l
| MCASP_PIN_AHCLKX* Q5 C; `9 v, l, n
| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */
- u8 A; t, K( U. t8 B2 X- QMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR + E& n, ?; [- A
| MCASP_TX_CLKFAIL
% q+ ?4 \ T# u| MCASP_TX_SYNCERROR$ W2 I- o9 n9 I6 u
| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR ! U# m8 R+ _+ U
| MCASP_RX_CLKFAIL2 v: N3 d/ w+ u2 c( q
| MCASP_RX_SYNCERROR % C4 y0 ?. Q: W$ u v5 h2 \& d
| MCASP_RX_OVERRUN);
. c$ R6 _3 Q2 `) M3 l+ J! p* k}
static void I2SDataTxRxActivate(void)
6 x! ^ D% m* @2 f& d{
! N) t3 X$ e# \( y/ j$ y/* Start the clocks */, |! ` w: L! U2 c
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);* f. C: N! ?" @/ o; O: M8 F/ S
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */
$ v8 U9 r l$ C" ]$ \EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,# n# P' Z" T9 v4 U5 g" ~3 A
EDMA3_TRIG_MODE_EVENT);( S3 n9 d. d2 C( u: q% H0 B
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
% V* q% R5 }- KEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */# m' e% b# u Y; r) q$ y
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);; ]2 R2 `% Z+ x. P3 x6 W+ v
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */( i8 B7 ?: }$ i
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */) y6 b( m1 }) z2 I
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);# A( [( Z- A3 K2 ~0 Z
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
3 q! e4 r* `+ d0 u4 j5 H; Z' z}
, j1 g, @' `# Y2 X! B- n! y9 u9 J请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
$ Q9 ^0 P0 Z) g, q, y
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |