嵌入式开发者社区

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

作者: wapdasta    时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,
% r7 h, G$ S" E$ P! R4 }input mcasp_ahclkx,
$ o4 y, @& J9 H* k5 Q6 E& Kinput mcasp_aclkx,+ d; _- Y- B  v+ Z7 ?
input axr0," k! Y- m. ~& [

) U0 @; q: H: N4 X: E2 u+ aoutput mcasp_afsr,6 `3 c* m. C% E  b/ Q( @0 }* _5 v
output mcasp_ahclkr,
9 t/ q$ Z; u! X; t- [- A( t& Houtput mcasp_aclkr,+ H& @. z2 X7 D0 Z& W# u
output axr1,
6 \5 p9 ~* D/ n, O
assign mcasp_afsr = mcasp_afsx;2 W0 a  k9 _. E+ g0 H" k8 J1 z
assign mcasp_aclkr = mcasp_aclkx;9 n0 @* p- P1 b* M+ T. W
assign mcasp_ahclkr = mcasp_ahclkx;3 T9 b( \# W/ P. l/ B+ ^
assign axr1 = axr0;
  ]! j2 f" D8 V( O$ y
( m, v; z* i+ o! {
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
" \- J/ B* Z& S7 s
static void McASPI2SConfigure(void), p/ R$ d+ r+ e& Y( F9 k! `1 E+ d
{
  \* Q- j# K4 @! C8 ^+ ]McASPRxReset(SOC_MCASP_0_CTRL_REGS);
; R8 G% o6 n/ P: x% Q2 GMcASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */5 P7 Z8 F6 x5 z) n' r- q
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
3 g" B! H* l& H+ k9 d, Z0 NMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */
/ i8 _+ i/ f" ~- i' |7 t! n  k& PMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,7 q1 P# _! i+ Q
MCASP_RX_MODE_DMA);$ V; i/ z3 h& B* v2 w( l
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
7 a( i5 e) a& r1 f' I" y' AMCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */" H: {: @: R2 M+ H4 L1 m8 i( s7 e
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
# l( m8 s/ B6 Y' l! ZMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);% u! r! J/ l  ]3 D# t
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
+ S- V& R5 p) u& B, I3 L% z, D  nMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */
6 s! |9 j/ q0 ~' B, W/ JMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
0 k) E8 z2 r+ E- n/ B4 o3 }McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
" n" w9 }& W. BMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,; h5 o3 _3 O; v3 W4 R' I
0x00, 0xFF);
/* configure the clock for transmitter */
! {; L( x+ E- w( B6 q* f3 S0 jMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
4 c  D1 [  X$ O* ?% f% l8 S$ [, q+ ~' @McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); 5 A# Z3 g) x8 w4 M3 f- R8 _# Z
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,* e: ?! p- y* s1 }/ C; U! e* \
0x00, 0xFF);
: V6 I8 P6 f: b7 a! r1 n' l7 ^
! u2 P& v+ g5 }  I2 [/* Enable synchronization of RX and TX sections */ 9 K8 w2 I3 ~2 [6 d. W! O# }
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */
( Y) U5 F8 v% D3 V# y3 U6 aMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);# j( e! X" Y' ?) U) N$ @5 s
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*
4 T2 _* f- t6 y5 V, d- F** Set the serializers, Currently only one serializer is set as
, _& g! S7 q8 F2 |3 F9 I0 U  Z2 A** transmitter and one serializer as receiver.1 N" N( t0 K3 S# [* \8 h8 h* O
*/
0 g' Z7 n' z2 f6 o9 K- i% \; _0 n% MMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
8 K0 X5 \0 r" N& B) i; cMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*( }! ^3 Q5 ^- r7 W, g7 n
** Configure the McASP pins
! M$ H3 M) u7 H$ Z# A1 K0 F8 h** Input - Frame Sync, Clock and Serializer Rx
5 o1 `; `( x6 X; s/ L** Output - Serializer Tx is connected to the input of the codec
4 D6 i+ \& Z0 M*/
" q2 N9 s! d* Q9 ^0 \; |8 x& _! X3 iMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);  \6 x8 C& q2 d& v( q$ X( k
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
3 h+ ]* a# }0 b; `! WMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
& Q6 p) n" v, b5 i* T| MCASP_PIN_ACLKX6 W( N) |- o: L$ B' }0 s
| MCASP_PIN_AHCLKX
7 ~- L2 ^: e; B| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */
+ Q4 ^  O' F9 F+ D8 gMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
$ m9 s& f. _4 {| MCASP_TX_CLKFAIL
% j6 ]4 {5 t8 o  ]$ U| MCASP_TX_SYNCERROR$ E7 l' ]* p, I; X& M: v
| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR ! k! d; _1 F# \! ]
| MCASP_RX_CLKFAIL1 @8 L* E6 ?- X) F& T5 o- U  G4 O
| MCASP_RX_SYNCERROR
$ u& ]( {. ?" ?4 f: E' W0 G" [; n| MCASP_RX_OVERRUN);
, N& E3 O  G; b2 h}
static void I2SDataTxRxActivate(void)0 a- _. o1 a# m
{, A) E$ G7 {: i8 l) x" }! J
/* Start the clocks */
9 a0 j& \0 r  v9 i+ zMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
# J- ]9 F- H/ L1 ?5 Y( v6 }McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */9 J) B& X; {9 Z1 x/ s- k
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,0 t3 ]% T% M5 U
EDMA3_TRIG_MODE_EVENT);4 ^/ l# Q; d" P
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
9 y7 ]3 B4 W9 ]4 H2 aEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */
8 c2 ~! _( g6 _* BMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
% d5 O, I4 e" d+ p# V9 iMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */( F' t) t( q/ G) n. r0 d* [' p( _
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */" M5 ~  p: ^, ~1 m
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);* F# \$ ?, |8 a/ p2 r! J' ^. [9 ]
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
; p* V! s* U+ Y3 @}

5 {: F0 b2 g: j! l3 v) I) N- i
请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
4 A1 R+ R# j& l: l( u2 {





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