嵌入式开发者社区

标题: MCASP自环配置。 [打印本页]

作者: wapdasta    时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,
( C  N3 P, y9 k1 l- ]4 Q* sinput mcasp_ahclkx,
+ G5 _' G+ {( einput mcasp_aclkx,9 ~9 b" n4 e+ ~& w4 U
input axr0,4 ?( Z: E% R# l8 F
2 w2 u3 u# d# L' G. X
output mcasp_afsr,
: x8 o/ Z/ x: M' m# goutput mcasp_ahclkr,
2 j  a6 t* U  v- voutput mcasp_aclkr,. @+ X" k$ k# L1 k5 c
output axr1,' X, s' ~7 t* K" t' H$ B. y
assign mcasp_afsr = mcasp_afsx;: N+ L( _+ i7 z# i0 u. \
assign mcasp_aclkr = mcasp_aclkx;3 b6 t- y* p  S
assign mcasp_ahclkr = mcasp_ahclkx;3 c3 B7 ]8 D. X# W
assign axr1 = axr0;
4 G! @6 F: H  a0 H' \8 M

1 Z! F2 k2 K( _; n
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。

& Y$ J7 H4 l) ~
static void McASPI2SConfigure(void)
5 o" |: C' S1 z/ ?9 f{" E+ |- a. l$ t( c3 T0 p
McASPRxReset(SOC_MCASP_0_CTRL_REGS);/ ^! l6 U0 c. ~1 h9 K( ?/ o3 B: G
McASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */
6 ^% P2 D. n9 B& _McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);. @) {% A8 s# n% @- i9 h. f8 [
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */" ^5 t( k$ W+ l, p3 N- b# K
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,1 z$ ]/ s: M: ]! @: ^( c7 {
MCASP_RX_MODE_DMA);+ `+ p9 ]( y' R3 U8 A1 z3 H$ ^
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
$ ^. t% I# A' z* @6 G0 Q) _MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */$ J6 R1 k0 x/ Q2 Y
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, 9 w8 y- R2 r7 i7 f7 `
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
7 x# b  K  x" P. ?! W5 a" M0 L' tMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, - }) \5 F3 _9 b0 f" h9 {1 @
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */0 e1 p1 c  y3 U/ h) @: Q: C3 a# h
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);% n6 T) Y0 r) T. Z0 t7 X1 U+ V
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); ' }0 f1 H; t1 ^5 k% p
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
2 A2 L" v4 w' x% U- L1 p* U0x00, 0xFF);
/* configure the clock for transmitter */) [$ y( H$ n6 u" U# E
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);/ C7 @- k! E) ^# q1 K, S) i
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); 8 U9 z+ I4 f: @% ]0 N
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,+ f( c3 R  x" I
0x00, 0xFF);
" J: k) L8 G6 H9 k6 U
& b: a8 f$ {& z6 Y( ^. A6 p/* Enable synchronization of RX and TX sections */ 1 l9 e' e5 c) _9 T8 o
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */
* K1 t, b6 `2 ]3 o* g- F, m' OMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);1 W# Y: m8 x( i0 N
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*
: H4 |& ?  K1 b( i** Set the serializers, Currently only one serializer is set as1 K* o% `1 i" O5 x4 A3 P* M. n
** transmitter and one serializer as receiver.
5 n0 n: T: ~1 c: X+ f9 M*/8 o" [; s6 b& @6 X, v) O8 p
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
$ I! _- Y4 A; m: ]McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*8 _0 h4 g9 m$ Z6 k/ C- N
** Configure the McASP pins 2 t) w1 D4 W! b, I4 q$ V! m
** Input - Frame Sync, Clock and Serializer Rx
. M, o! q# N  D: L3 M; {* o** Output - Serializer Tx is connected to the input of the codec
$ }* |+ A2 k5 J1 R4 p*/
. D4 U- o$ v7 zMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);& u. {* T! e4 A. k  [5 ?6 X
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
, x- ?. R0 J2 d4 QMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX: J8 {# J( r4 i9 L( a
| MCASP_PIN_ACLKX
( A( K' l+ D3 t* c; @0 _| MCASP_PIN_AHCLKX! z. f6 |" `( V! @+ A5 P8 X
| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */
; J' t& L2 n/ p$ G5 B( H/ g. C( yMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
% |" x+ v! e3 l| MCASP_TX_CLKFAIL ) }6 ], j' a$ }. p' P
| MCASP_TX_SYNCERROR
4 r0 g& N* ?4 v2 H9 \| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
( s  x9 q" d/ w" L8 P# a3 G| MCASP_RX_CLKFAIL
; b$ _7 p( `, G; ^| MCASP_RX_SYNCERROR 4 U" p1 n7 P9 m3 j
| MCASP_RX_OVERRUN);: \, S" ?4 v: y
}
static void I2SDataTxRxActivate(void)) [0 r8 a  ]3 {1 F+ K% Q% [2 a& Y
{- j9 @  v( C$ h
/* Start the clocks */. X$ C: ^& ?/ J6 \
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);: ~$ P' d  G! c8 Z( M6 r
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */
! U+ _! U! r( ~" H; O4 w& REDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
, P, W7 ]. g! D. {EDMA3_TRIG_MODE_EVENT);2 Q. q) |0 n" N
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, 0 I# f( h, o) h9 k5 b, v
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */" [1 |4 a& J  @! [, \* S# U
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);9 X, Y' Y) F3 a: U3 `
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */3 O+ P0 K6 V3 T6 H; `
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */
6 C% ]* O8 w1 _( L& u5 OMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);& p# F  H4 A0 y. v% {; F0 K
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
5 p" x! `1 `0 k5 L/ F/ j}

8 n0 R8 w8 o) s1 n6 F2 v+ ~
请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.

$ m. R- r) c% x* i




欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) Powered by Discuz! X3.4