嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,% _" l( o# W# S. g: V9 T7 H" ~
input mcasp_ahclkx,
! S7 G- ]9 M T2 ^% \input mcasp_aclkx,5 g" l3 g; X2 B7 ~8 V5 [7 z( a
input axr0,
& }) T) R2 F* c! f1 x; C+ r
: z9 [$ X0 s% J9 B+ }8 n3 z0 ?output mcasp_afsr,+ c' c4 I) ~, e/ ~' ^ p
output mcasp_ahclkr,
+ N2 ]6 H& W* v0 s& D. C8 q9 k8 coutput mcasp_aclkr,- f; D! q n( f% g R, e
output axr1,4 o$ {' U3 D. m1 o
assign mcasp_afsr = mcasp_afsx;# U9 ]: j& I0 A
assign mcasp_aclkr = mcasp_aclkx;. s8 I7 e" E6 W' L$ I
assign mcasp_ahclkr = mcasp_ahclkx;! q. L$ J$ S! d% |/ ?; }
assign axr1 = axr0;
% W9 w2 V2 }/ s& M
2 Q! x" G: [! u5 B3 N8 ?# c
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
: ^; b" C* K* s& r! u/ A. wstatic void McASPI2SConfigure(void). ]; \' F* l* k2 q+ O
{& r; p& O8 u) D& P, q- q& ~
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
. D! `8 `, u( B% N% }6 nMcASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */
: y2 @) O: B$ R# M; ]/ A$ @McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);9 b! L5 A1 t/ r2 d- M& M
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */0 T& Z- \4 |$ s' l' J! g, g" o
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
9 @" m1 n" v! L/ t6 m4 i4 DMCASP_RX_MODE_DMA);
8 b. i- \# C1 q* I" X$ BMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
) ]/ X# c. M( sMCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */
: v2 v# e2 ~0 a6 _# KMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
" E0 L; H' u% [7 jMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);% @1 p# T! m1 D$ i) b
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, 5 Z/ y2 b2 \" w+ {+ C
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */ j# O+ v( p- \. N: h3 g
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0); v0 x8 Y3 O! E7 u+ m, s3 C1 F' V8 I
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); 9 a, N( k, E% |% E" t8 Z5 C
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
& R" m+ l1 Y* h8 _6 I0x00, 0xFF);
/* configure the clock for transmitter */2 e0 M1 R+ W# m
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);! C @. |" }5 y* @9 u8 i/ j
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); . i2 C5 L& J0 t6 C
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,7 |# Z5 w- u4 C6 Q, B
0x00, 0xFF);* D7 Q" y' S# S7 e+ U A' W- i
0 D9 S7 |& p2 E) c+ A0 W; p; C' C/* Enable synchronization of RX and TX sections */
) L, S: @# R, p. C6 VMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */$ S& V. K* W5 i; ]3 _
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
4 o3 Z0 Q/ H7 B- h2 i5 Y4 S, UMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*( b5 v4 t Z/ V8 j: y) ?
** Set the serializers, Currently only one serializer is set as( t1 i. V! v% r: n( f
** transmitter and one serializer as receiver.
$ K9 P* D- {" ?' F1 d. U*/
. v' ]% ~; b1 Y% q+ uMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);: \! E. @ I7 k" H
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*
2 T r" } R w0 t+ b9 T** Configure the McASP pins 9 i+ I1 S' U% I3 `# `1 |7 x
** Input - Frame Sync, Clock and Serializer Rx1 t% B& p* b P) v
** Output - Serializer Tx is connected to the input of the codec 5 }- l5 b* I1 {- b- J
*/+ i, e8 ^( Q& e
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);) Q+ e% W& Z: x8 [8 G. p) ?
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));; H7 m( N. }4 Z# ]6 ?2 Z( U
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
$ v' K+ y- Z, O4 }| MCASP_PIN_ACLKX
4 A, W* B/ p; q| MCASP_PIN_AHCLKX6 b4 [ @8 n! C9 ~+ d/ V9 t
| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */3 m/ Z5 w# _0 z: K& Z
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR 3 c" D9 t% Y8 K( U6 v
| MCASP_TX_CLKFAIL
7 X# f* z, _8 H| MCASP_TX_SYNCERROR
+ Y% r" Z6 h/ z9 P5 O| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
( ]5 j# A5 V y; r% o g; y5 ~- q4 \| MCASP_RX_CLKFAIL
x, d; j! L t, q* ]/ Y, a| MCASP_RX_SYNCERROR
' @4 B: m2 j* n% Z: V% I. Z; {' a| MCASP_RX_OVERRUN);
- [; u! F' A: B# ^) d5 ^}
static void I2SDataTxRxActivate(void)4 E1 W, l* h2 n; J+ b% U( t9 ?
{
3 P+ e' D1 P U( L) R/* Start the clocks */$ i, X- u4 H6 u: r4 Z
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);% j: ^7 Y8 d: a) B/ W A$ Y/ m1 V9 M
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */# m# E8 U! S) ^( d
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
+ Q* H& v6 W! F% m) j, wEDMA3_TRIG_MODE_EVENT);4 B. ]3 q0 ~! p3 j
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
4 ?: |5 X1 P3 a2 `EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */6 K5 f7 s" s" y9 ]
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);( i. A: {8 x# b7 J% }+ v1 _* A
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */
9 u8 K) u- Q8 }8 u( n }& owhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */ I2 ^; B3 I- i8 |. H* M
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
3 Z0 l! ?: y9 }6 VMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);: {' u8 j4 ~8 z' ]6 ^. F
}
4 D1 ~; m% R, ]6 J; a3 ?% g
请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
7 l6 w2 S* A: W" t+ r" f
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |