嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,. T4 N% S( H: x9 `
input mcasp_ahclkx,
k, b# G- S! v, w% F/ J3 Yinput mcasp_aclkx,, Y( Y) g9 H2 K
input axr0,
: V! ^0 \; L: H, N
% X% n2 F0 j! h6 V/ u8 S9 r7 E3 Xoutput mcasp_afsr,$ e+ }* P0 ?8 }& h u& I
output mcasp_ahclkr,
+ V: N5 H7 y; M2 j# e2 D# goutput mcasp_aclkr,
# }4 Z% a# U7 @$ b/ E4 V) [output axr1,
. q7 y3 z+ K \# K+ q
assign mcasp_afsr = mcasp_afsx;" S3 V* ]; s, m# a
assign mcasp_aclkr = mcasp_aclkx;- T0 @( C& ?. }" g! Z: H
assign mcasp_ahclkr = mcasp_ahclkx;
6 A& r- T1 s* y5 t' Fassign axr1 = axr0;
1 ~) ?' u0 y2 ` ]: Z" P1 R
2 F9 {: L3 q/ X) Q) R( b' ^在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
% n# K! V. Q" C# tstatic void McASPI2SConfigure(void)% Z0 j! m8 @( A2 o
{
# c* e( v2 k+ C/ S1 F rMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
: @4 [( y$ T' \0 C, o2 k$ S/ rMcASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */
- G3 M) v5 d# Y2 `2 m4 _; W0 V9 l" jMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
% b, q" N+ i. R: X: Q' p: bMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */
8 v3 S0 _: K p6 w- EMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,4 L! d$ z) g2 @' {+ U( t9 Q
MCASP_RX_MODE_DMA);
5 G( b6 `8 p6 R' ?McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
7 r. n; w- \- h/ t) YMCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */
! {& o4 m1 Z' r. oMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, ! a" x& s e t2 D5 i. `( N E
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);4 g% Y, a4 N0 Z1 J# f) {
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, + o5 K4 {2 W7 I" \3 a0 x7 x
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */$ o' @6 w/ H; f' f% P7 f, K
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
# X: r8 N% j0 d9 l: F" oMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); 3 L" e! I; h* o% h
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,5 Q* \4 L" D/ g- _ F5 W9 S
0x00, 0xFF);
/* configure the clock for transmitter */( G m6 I( x( W8 N; ~0 v0 K
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);' G" d5 I9 N1 w) q
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
- n- e. q; C; C4 k& f* x- a6 qMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
6 i, r! c- Z4 n$ z; t0x00, 0xFF); K) ^/ x9 x( ]/ L" \) H& k
/ ^! e( ~& F; L: }8 [$ J
/* Enable synchronization of RX and TX sections */
0 F0 f* f2 M$ Z+ ^3 z- jMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */
/ H2 z2 R: |1 K" w9 K& BMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);/ v2 x( B/ k5 A
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*, K9 i/ u7 N2 v
** Set the serializers, Currently only one serializer is set as
- h- ~6 d# E( n" A( o** transmitter and one serializer as receiver.
- l9 S/ B4 F6 F( {2 z# f( \*/( s8 \. ?. e4 g8 o' ~8 i+ t6 @
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);) ^$ u5 ~7 }0 q7 G3 W0 b2 Q
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*8 u7 t: G) |9 W: `; Z
** Configure the McASP pins
( P o8 s3 G$ d$ @5 [** Input - Frame Sync, Clock and Serializer Rx
7 s1 z6 r+ |% C! |** Output - Serializer Tx is connected to the input of the codec $ u& k! h+ r: }* [8 O
*/
8 v# B; c/ V0 \! QMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
; N7 w: ~7 S6 @2 c# MMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));+ g: b7 Q4 x) Y# {! i* ~: C
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
& t6 d! H: o4 \& K| MCASP_PIN_ACLKX
% m; U! ~8 T1 t. Z1 f# D% b| MCASP_PIN_AHCLKX( F, D1 X3 o N2 H, m; _
| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */
: _$ E! c7 g G6 r9 mMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
7 r- O# D$ `; c% @$ f| MCASP_TX_CLKFAIL 4 j m, j1 e" O1 x1 e9 z1 J$ v
| MCASP_TX_SYNCERROR
, ~' d: ]# a5 q3 E| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
2 W9 Q V! p$ m! A% ]4 \" r| MCASP_RX_CLKFAIL
3 o: w% d3 W+ k4 _9 x4 p| MCASP_RX_SYNCERROR ! |' B, U$ B& ?1 c8 q* v
| MCASP_RX_OVERRUN);6 P+ `* A: p7 L, I* j
}
static void I2SDataTxRxActivate(void)" n+ B1 `6 T# c/ ~( Q7 e
{
$ y8 q2 |. m9 H( k7 I9 Z4 Y* ~/* Start the clocks */' C1 m, ?- b4 j9 C
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);0 z: J* G9 z6 Q4 e3 y
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */
; v. \% {: e4 f0 J; G+ \3 B$ E7 wEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
8 I y* W5 a$ U) b' H+ XEDMA3_TRIG_MODE_EVENT);
9 d- T% O, e7 M0 ^7 ?* R- z. QEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, ' P9 b$ E' w- L3 x1 ~) s' Y
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */0 p* W3 n" L- Z4 Q6 \3 u' H2 r
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
5 D$ T9 X1 T4 eMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */2 h+ J4 k- q( \, v1 w6 |
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */
3 f' g, q3 o p- z! P( J1 GMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);
A7 }5 m' U! Z% b' w- fMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);
( S [9 X" u4 q}
$ p, f5 y( f) B* F4 Y% o: `5 A% g, ?4 y* X
请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
/ C7 e1 }+ B6 U6 Q; \! R
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |