嵌入式开发者社区

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

作者: wapdasta    时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,$ i8 @! }2 e: a" r) R
input mcasp_ahclkx,
- D1 `( B4 e* y, H+ q# Tinput mcasp_aclkx,' m8 y6 r0 d* @+ M1 K
input axr0,# T# w- d% v4 x# A% M: r3 S
+ |& [$ `7 J  ~- t3 t8 L- q& m
output mcasp_afsr,8 z4 q' x6 p. j' O# Y0 P
output mcasp_ahclkr,
1 [7 n# \! z9 c/ O1 g3 Aoutput mcasp_aclkr,& d8 M5 E) L7 Q! @) e2 [
output axr1,
3 ^5 w1 _% O) @" V2 w
assign mcasp_afsr = mcasp_afsx;
- a) U. h# V1 gassign mcasp_aclkr = mcasp_aclkx;
% m+ m3 G  m/ g  ?/ P. h8 x3 g# passign mcasp_ahclkr = mcasp_ahclkx;
* t- L) j, Z1 q/ |7 eassign axr1 = axr0;

" ~9 r+ u4 {  Z( y1 R8 V$ N6 _9 W  b& P4 u: a
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
$ U4 y* `2 B1 D/ T
static void McASPI2SConfigure(void)
7 k  H+ ^1 P5 g4 f9 `{
& j% b7 k8 _1 J) I, mMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
" X5 ?' k- ?& h8 V" DMcASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */  W3 U) m2 Q4 l3 ?+ @: k) Y/ _2 T$ h
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
& u6 x' ]& i9 l' AMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */
0 T5 r+ q, ?0 b/ X$ YMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,6 s" U. }4 {7 L3 x" a: a; ^. U; l
MCASP_RX_MODE_DMA);$ |9 a3 H- }# d5 p% D! [8 z  W
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,9 p% w& W& b( L5 \+ G& R7 `' Y
MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */
. j( O. k$ S, H2 d5 ?! V" qMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, 9 [8 r5 B+ w2 C, H( T; n. W
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
: g  J& w5 p  d. h) s' KMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, : U. D: U% v3 U& C2 l
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */
( I8 y* ]) u) Q8 J+ e4 qMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);& D8 ~8 A5 I; B: b; E
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); " j, c4 @: e) x, B/ g3 A
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,8 a  J: h/ o  E+ {
0x00, 0xFF);
/* configure the clock for transmitter */
, B% q! `8 R4 m8 EMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);0 `5 c; @% Z- L# R& l0 F4 |
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
1 ]( c; H5 c+ t* ?+ zMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
$ M" N. S5 T* }/ G  O0x00, 0xFF);0 G2 C; S( M; A
% @& s, c6 i. E  c7 I  P/ c( `& @
/* Enable synchronization of RX and TX sections */ , ^3 O$ [/ Y; H% f3 J" u" e* }
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */
/ q9 L: T$ p# R8 l" f) M' nMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
, d8 W0 ~- y* jMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*
0 i, \! W# ?  }4 X/ o& E& n** Set the serializers, Currently only one serializer is set as
; ]# r, S8 M' I** transmitter and one serializer as receiver.! r. T7 F3 k8 j6 b- q* p1 @2 k
*/; Q1 l+ s  Z0 S" W: B* J
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
7 \% s7 C& m7 HMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*% ^5 J8 c  J6 u' l( h4 ]
** Configure the McASP pins 6 Z( Q4 G. L. `5 j" Q7 a
** Input - Frame Sync, Clock and Serializer Rx$ |, r/ w, n4 ~6 E9 v
** Output - Serializer Tx is connected to the input of the codec
; Q1 ~$ ~0 k0 A/ j; V*/& D" t/ E1 o; V- C5 T% o+ a
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);  u/ [* B2 J# V+ g5 [+ m; G
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
$ w2 x7 T, n% i9 j7 s) c* L9 ^5 {5 jMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX. _' Q2 W$ x- c% L/ l& O# i+ r5 p
| MCASP_PIN_ACLKX* n8 }9 u2 Z* x( L( |3 j5 w
| MCASP_PIN_AHCLKX& D$ C, u% Z3 W% h1 _
| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */( L3 q) R8 v) Z9 `! s# S
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
% ~7 F! J9 I6 A  B2 x| MCASP_TX_CLKFAIL * \( n: D4 g6 U: j( A; e
| MCASP_TX_SYNCERROR
% g: c. V# p; S/ E8 w* m+ N% _6 T| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR   g8 F2 o# g: P: Q
| MCASP_RX_CLKFAIL1 ]) A( E; b& I
| MCASP_RX_SYNCERROR # V3 I$ w; I+ n
| MCASP_RX_OVERRUN);2 P1 H) Y) s$ O2 F5 T, r
}
static void I2SDataTxRxActivate(void)- ~% J, Q2 @# I7 E* K" ]
{
4 h& R3 I5 {* g' J/* Start the clocks */6 N, L$ N5 I. D0 ~7 P
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);' R. \/ C, n9 S7 h# d" [- F
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */
% \- F* {: M& m; }* oEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
" r1 H! B: [0 z2 C& m7 zEDMA3_TRIG_MODE_EVENT);7 R, Y4 E% A7 e# D; [' m3 `5 Z$ {
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, ( p3 e7 q. z$ l8 l% f4 y
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers *// T+ f( |) ?: N! [+ i0 Z* v3 N
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);. @, T- P3 ~5 Q5 w! D5 T
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */. {+ b# g5 _2 Q: P: R; ~9 o
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */
: O; r5 u& @) u3 ^! B" \* \1 fMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);9 z3 p6 a+ Z. U( u' b% W
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);; o# \" p: c3 S5 j3 W9 M2 i! @  H
}

7 Y; R: q  E/ N7 @/ c0 T0 q
请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
$ }  e7 m( P6 U5 P0 j, {  `





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