嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,) e! i& h* Q: N5 K6 v
input mcasp_ahclkx,
: B$ F1 s9 Y4 a1 Z4 y- `( Uinput mcasp_aclkx,
- }- B/ I6 [% d- O/ ` Q. F! r# uinput axr0,
9 A2 W! a' u+ |) \4 p" }9 Y$ F+ d! D- `8 ]
output mcasp_afsr,
+ Z! g, N: Q# B) noutput mcasp_ahclkr,7 t7 V% V6 w* F
output mcasp_aclkr,
2 A9 z3 H- D8 `! v g- qoutput axr1,6 f I5 P6 u: Q. X+ x* r0 o
assign mcasp_afsr = mcasp_afsx;
9 T7 E& v1 c: s% sassign mcasp_aclkr = mcasp_aclkx;
) t; J6 F- _; y9 `1 massign mcasp_ahclkr = mcasp_ahclkx;
1 i4 v0 {$ ^/ ?% ~, ^1 y. q! }assign axr1 = axr0;
6 @5 }7 ~4 A# _& `5 g6 H9 L
7 B2 `- H2 Z0 e$ b: }5 _在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
; o% _, B9 o$ j/ U! w K0 P
static void McASPI2SConfigure(void)* p7 y1 K# J7 X6 Q
{/ v$ U, u$ Q$ p8 j5 s- x
McASPRxReset(SOC_MCASP_0_CTRL_REGS);4 F; p+ L/ V4 c8 B
McASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */
% A/ y- Y0 u) u4 I, s- _* v0 jMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);* s2 ~- t. u: [0 b& Z) J
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */
1 [( e! C+ ?& Q) k$ E/ rMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,) W6 ?9 n9 [ _7 h
MCASP_RX_MODE_DMA);
) L/ Q3 Y: [% [, D6 r4 B/ e: YMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,5 p7 ~! y- _+ \2 Q7 {! h- w
MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */
5 u* U# Q! L# b, L6 _McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, / ~8 r* O5 q; K
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
: u; X& T& D% B7 G% w. T4 zMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
5 r/ y. E8 y* E: p. f0 w- cMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */
* c& }1 E3 V8 nMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);9 g7 n* T( T7 w8 F7 w4 U$ |8 ]
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
& L& c8 D8 X j2 RMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
. h9 [2 ~' e8 D; z0x00, 0xFF);
/* configure the clock for transmitter */
3 J$ b& Z: a+ R. _' O. g" LMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
0 T* h& S) b3 O. U% M; k. dMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
4 ?3 n! J1 T' m) H3 YMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
3 D J, q i6 @. t9 j; A0x00, 0xFF);7 x) w8 _: `6 l0 ]' _. q
) t" \7 C: k3 H5 f" [0 w9 G/* Enable synchronization of RX and TX sections */ + }8 p( f% @- \* ?3 U1 `
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */
% N1 A( L8 s5 f; a) d( N3 BMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
2 Y( z# i, i( FMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*: b! i7 k% ~$ L) Y" u- U5 [
** Set the serializers, Currently only one serializer is set as/ R0 A1 \. K$ z
** transmitter and one serializer as receiver.3 w! `9 Z% H Z" R0 E2 `, q4 ?
*/
. [, ~9 L9 C+ cMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
- q+ W6 {. c L* PMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*
/ I* O' H3 B# h8 m2 f# Y) ]3 Y** Configure the McASP pins
! x$ n) G9 ]5 x( L# ]8 o** Input - Frame Sync, Clock and Serializer Rx- k, |$ e' Q) P& R1 E M
** Output - Serializer Tx is connected to the input of the codec
& e' p3 H+ F9 G*/, w2 K4 q# _5 J, M+ z$ w
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);& e$ B; A: r- C5 U/ y+ @
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));% s3 i: x3 ~, c g2 n; U( A
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX. @& M% c- a1 C; \
| MCASP_PIN_ACLKX
- w _" u/ A& s3 h& d| MCASP_PIN_AHCLKX: S# L, P/ u5 V* R7 A
| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */
! D$ H# m- y8 r8 W# x/ NMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR / [$ J2 w+ B$ w0 f8 m7 [) f
| MCASP_TX_CLKFAIL
( X+ k8 S! H$ y: G1 H. v| MCASP_TX_SYNCERROR
& r( [" `! W! k9 E6 h- w| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
G/ Q* V9 w$ z0 L2 z$ P2 X| MCASP_RX_CLKFAIL/ ]: s7 F; w D' r1 e" F
| MCASP_RX_SYNCERROR $ n) |4 G" y( E) u/ Y
| MCASP_RX_OVERRUN);
1 O! z H+ q1 W* ^: c* b}
static void I2SDataTxRxActivate(void)
9 z$ Q, [5 ~0 P) ~{
0 j% E3 g$ f2 e% w: ^2 K A1 L/* Start the clocks */
5 F: K" R8 J4 Z! X& f* mMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
* A% ?4 v% ?* K; E" qMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */
) Y: K& r# F! e S3 _, E; LEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
: M& o( m, T3 f+ V& F/ uEDMA3_TRIG_MODE_EVENT);+ x2 ]; B- t1 z) V! }8 P
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
4 S* o4 l& w& }" N0 ^4 ]EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */
: H9 S+ k$ Q2 Z" BMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
7 l( Q8 g$ \7 w2 w( }9 t NMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */
* M* b5 j, @& k( p1 x' F3 D1 U V0 ewhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */
7 g( p3 l6 B7 @2 {& I# b+ f4 _2 ZMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);1 S& `; O4 h. P( I% m
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);% E# I( x# ? ^8 y0 ?
}
+ P. {9 Z9 z2 ~请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
% P% h! T9 `$ h! @- x) H6 S
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |