嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,
* S& W, {) J& G( C4 z3 q, Y% Z! Minput mcasp_ahclkx,
$ J0 j5 N% n m7 E0 L. I" w8 Zinput mcasp_aclkx,- m' f6 x! c$ u7 I- K7 y$ y+ D' t
input axr0,: {: _' `7 U, V/ D k5 [$ j1 m
8 k$ w& ]; W; e9 ^ B
output mcasp_afsr,8 U4 C8 U8 n- m1 p8 }* c
output mcasp_ahclkr,
, U R: V: l: p* ]0 d. Foutput mcasp_aclkr,5 _$ a( }( Q" O/ \) p# l8 Q2 Q5 E
output axr1,2 g* G+ u. k3 x5 Z/ N/ }0 e
assign mcasp_afsr = mcasp_afsx;& Z4 Q0 U0 Q& T
assign mcasp_aclkr = mcasp_aclkx;* v3 A+ l- _5 {% q2 X [% K
assign mcasp_ahclkr = mcasp_ahclkx;' L" `: M5 [" B7 s
assign axr1 = axr0;
& N# p2 I* Y3 V8 ~9 U$ F: M- S0 c/ I! c% O* K L
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
$ u7 Q3 m& |( r4 C' F3 y0 T1 U; qstatic void McASPI2SConfigure(void)
+ `: I( L9 {! ]: j; l2 u{; l' x) O0 {7 D1 ?5 y: b/ ^0 w
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
+ y& u; t9 m# C# L, h! R: q* VMcASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */% X6 y% J) g5 p5 D
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);9 @9 R2 z, a$ r, j
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */4 [- d4 \- S# L7 Q8 y$ y3 r$ I
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE," @- S/ H: J$ Y7 F
MCASP_RX_MODE_DMA);# Q2 c- Z- T/ f2 \7 C5 S
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
! S3 p E% s: I* E. v: R1 GMCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */
2 n. t# }- [( _ [* B, ]7 bMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
& |+ t2 H. c$ C7 U8 E tMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);5 Q$ y: ]0 ?6 U5 }$ q' n/ J
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, : b7 t8 ~8 g/ ^9 u3 N
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */) h R I# R) e- \ V5 P% ]
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
! d) \$ j: s2 Z" ?3 CMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
! _& b2 F X" f# B& gMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,9 U* D# k7 U& p1 R% z! o7 A
0x00, 0xFF);
/* configure the clock for transmitter */
9 ^* H3 X! c" g {9 V" UMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);' s9 I2 K" B5 H, T$ s) m
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); ! H1 p: d8 H# k* ~+ T
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
+ y$ w7 K. z Z5 z9 @; Z0x00, 0xFF);
% L/ v( `8 ?$ V8 z V
2 ]$ F2 S c- Y/* Enable synchronization of RX and TX sections */
; O$ j2 c/ M L! c! y* K. \McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */! ]& F( A) u: |. d1 J! n; Y, t
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
, y1 E; }' n+ h( H: W* a8 H- ^McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*
5 b$ [! c6 {9 g* U9 T7 e' U** Set the serializers, Currently only one serializer is set as
1 O$ x- R4 I7 H; U** transmitter and one serializer as receiver.# o4 Z! P( c& T8 V' v' y
*// ?" x9 }( ~! _% R
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
4 x# y5 K% }' d, \5 i0 s" o1 nMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*
7 Y# a; N. E% r3 f$ L** Configure the McASP pins + E& n' a/ p/ G+ y, k. A+ a
** Input - Frame Sync, Clock and Serializer Rx
' T7 @: c7 E4 O" Y** Output - Serializer Tx is connected to the input of the codec
9 @( T* i+ ?1 J3 W4 ?*/% x& l; G/ N: T$ I
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
; U! \5 T) z: ?- v9 O% M6 ZMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
, u1 W: v E2 m6 lMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX% G0 l- I9 f8 [' c9 ?
| MCASP_PIN_ACLKX
( q+ ]+ b3 M) W| MCASP_PIN_AHCLKX- s/ P5 I S; }5 m2 I
| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */
2 U3 w$ }- C* I ^0 xMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR & X* T! j; H3 e- @1 e
| MCASP_TX_CLKFAIL
; m. Q) y9 [1 c' a( U! U| MCASP_TX_SYNCERROR. ?: T9 F! O% |1 Y% h! K5 L7 o
| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
' e/ l) [5 q+ ?/ _+ {4 ~| MCASP_RX_CLKFAIL
( b/ B$ l" q' D( W p- r/ g| MCASP_RX_SYNCERROR
' O# ?5 e9 z. f( J% I5 X) S| MCASP_RX_OVERRUN);
; j5 O2 e( S- p: R4 f}
static void I2SDataTxRxActivate(void)* F0 _" r: n8 }2 w* `- a
{% a9 W7 ?# k" ~7 H; S9 j& N0 q
/* Start the clocks */4 e- |' N, t7 j
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
% ]) n8 w% d$ o" ~: aMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */
8 P5 c4 [9 w4 O# zEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX, u; o3 k6 _! T) K
EDMA3_TRIG_MODE_EVENT);
9 S- H% E& f& e% s( L' [EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, $ B! K# @: @& C+ u- D' N& ^/ U
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */& k4 F, J5 `1 t$ b! b
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
3 e' \: `! |$ K; J I# @McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */
* {# u6 l2 l8 r9 |# twhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */
. E4 q5 r# l) L2 a' Z4 ]8 yMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);" h6 P1 P; P W$ D& F' T: g
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
5 c j. W: L0 v2 W6 y/ Z/ d+ i: j}
# _- T# x4 H8 {& P请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
3 q/ l5 q% \" u% I% d
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |