嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,
, P* u% N* l* K. G, Q8 u& g% b/ ^input mcasp_ahclkx,/ Z6 N/ Z I# e1 Y! L+ T& W. O9 o
input mcasp_aclkx,
* v9 s' ?8 x& v, R, E$ H" linput axr0,/ v4 K2 n/ a7 |. w
2 K8 ~# w, Z% A# ]2 U4 Z: m, J. Houtput mcasp_afsr,
4 P! I) W/ g% X+ { _output mcasp_ahclkr,+ ?$ T8 v* U: N; ]9 I& @$ y* V
output mcasp_aclkr,
' B/ G5 {) C( }, e. ?output axr1,
9 Z1 }3 V: _& [& t2 S) x$ x; k( F
assign mcasp_afsr = mcasp_afsx;+ }' I- b3 m* y5 K( e }, ]+ ]4 _ J
assign mcasp_aclkr = mcasp_aclkx;
; I4 b4 V$ z! n% f9 H) ^% lassign mcasp_ahclkr = mcasp_ahclkx;
. l3 J# ]1 Q/ {0 ]/ O* C$ Passign axr1 = axr0;
% X& H0 g( ^! y* s; _
" ~3 a8 E6 o+ V3 q8 f! p
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
% R( Y/ w) q6 l
static void McASPI2SConfigure(void)& o5 \/ D2 h. X: J; R# D* t9 i1 C
{' @. }% z9 O4 |# |0 ~2 d
McASPRxReset(SOC_MCASP_0_CTRL_REGS);+ @1 b7 m/ y4 w6 }; S
McASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */( `8 B9 s6 q; y8 X5 N
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/ m; j1 _" ?4 q& b: N/ k0 ]: _McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */
6 l9 k# I8 R6 g4 |6 K1 w9 MMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
$ p3 A$ k1 x. K+ v+ I6 n7 I0 {. ~: eMCASP_RX_MODE_DMA);
1 p& U! M1 u( X: k/ U: S+ _6 QMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,& n7 d& K) ~3 `1 Q/ o0 c
MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */
% _. V8 f$ D& [; PMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, - F7 p. G1 L& f, I" i( L
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);' M- Y, D7 T$ G% O r3 y
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
* A8 S6 k$ Y3 e% V; E- c1 c) OMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */+ _& f# e9 ~# o/ |
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);; {: s& w& c1 j
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); & z5 ]! ^+ E _# r) X# ?
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,! z% C5 C3 ~1 Q y+ g. Y. Q* e
0x00, 0xFF);
/* configure the clock for transmitter */ o" _% C, M$ e* ^
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
8 x X8 z1 @( }# O8 AMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
9 {3 j; Q) }' j8 sMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
0 P: s9 A h! c3 k7 l# n8 b8 J; a0x00, 0xFF);! f6 X9 p9 V+ d1 M' E: d2 U& m
) d; Y# K0 Y- q6 q' G
/* Enable synchronization of RX and TX sections */
M W# z6 h5 B) o. hMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */: p) G8 {$ F- A& Y# x1 i0 Z
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
0 _9 X x) ~; i/ G* h7 Q* d% B. UMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*
! W" @3 w& A; H& Z I; Y( O** Set the serializers, Currently only one serializer is set as/ r+ J5 g' H! r* X5 D
** transmitter and one serializer as receiver.
. K7 w8 K* H( k% \9 J5 {*/
) u' ?0 h1 ~- D$ fMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
( h4 {( C; c. x( H! UMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*
# ]6 u! g6 O, D r5 ^( d) I- P** Configure the McASP pins # X2 d- m6 Q5 w- j
** Input - Frame Sync, Clock and Serializer Rx
* @4 T9 [" t4 ^" F- Q** Output - Serializer Tx is connected to the input of the codec
8 d! j, G, I7 V*/" L1 p9 L3 a' ~$ G/ ], `
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);; u6 z6 }- T$ M' D3 e( D4 j% K
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));$ q% `9 V7 ^8 K; }3 U
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
5 Z; p1 _" G' m| MCASP_PIN_ACLKX2 J6 u8 U9 G j" j! ?
| MCASP_PIN_AHCLKX
8 R" w4 [4 D4 R9 K' H# ~; T# ^| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */
: o" y, h) n d* d/ TMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
0 e( o0 S6 J* W1 {* c4 s& [| MCASP_TX_CLKFAIL
0 V/ ~# g% u0 z| MCASP_TX_SYNCERROR, B$ e6 q( z7 Z+ B: r; X& T9 H
| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR 1 |8 Q8 O- b# A* i2 Q. }! E% y
| MCASP_RX_CLKFAIL; G; v9 R1 V/ l5 t6 P
| MCASP_RX_SYNCERROR g$ ]9 N8 z* `2 H$ ]
| MCASP_RX_OVERRUN);* _! ?6 ~% s4 ?$ \
}
static void I2SDataTxRxActivate(void)( F5 u/ d6 L" ]) {6 d
{/ D: A+ A; \* H6 G$ [
/* Start the clocks */
1 H, v% a2 W+ m: q9 VMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);/ K3 J/ G& F) {4 Q p, e
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */9 ^- w9 D! X) V; C, `
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,* l, H8 S- w' X: [: H* O
EDMA3_TRIG_MODE_EVENT);/ m# N5 O" h" `. i; m/ e
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
0 z' O( ]6 _6 o8 l8 MEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */
. a. ^! P. g. S% E+ d# sMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
# c- N( {: x* g& d7 tMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */
' M% C8 |- [& Z V- k8 V, O6 swhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */
$ d; }- i ]! u' J4 Y% u: zMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);
8 ^; o3 x, G( K* g" f5 r1 ?McASPTxEnable(SOC_MCASP_0_CTRL_REGS);2 v( U% c/ v) E! A' H
}
8 K9 r8 A- U) o0 |' ~& t6 }" B请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
- {% f2 p8 j7 b3 i7 q) q9 ^" Q1 |
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |