嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,
/ p; d2 C: A, ]$ H1 K9 pinput mcasp_ahclkx,0 [0 N7 j* L5 P* K
input mcasp_aclkx,2 B$ v$ x7 Z; T
input axr0,
' s+ h: j' |+ _0 m8 k- H' h+ G
output mcasp_afsr,! a! A, k+ N' l* t
output mcasp_ahclkr,
1 }, C% R# k' houtput mcasp_aclkr,
s9 r5 ~: {( P3 ^. \% v# m5 E! |% ?output axr1,
7 M {, L/ z& w" j! h
assign mcasp_afsr = mcasp_afsx;
6 J; f) ^6 n; G. L" C2 k$ }9 Xassign mcasp_aclkr = mcasp_aclkx;5 ~* `2 U+ k! }
assign mcasp_ahclkr = mcasp_ahclkx;
9 P4 X' W1 f$ h. h; B; d# hassign axr1 = axr0;
2 M+ u) n1 p: q& E, p; t' F: a8 h* C1 u7 f$ F6 R [
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
" c' @4 |2 v7 F/ }% Nstatic void McASPI2SConfigure(void)* ^4 P3 D6 F" M
{8 ?1 N, b/ S, G* e9 o8 S" }$ I
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
( F9 W, p& O6 R7 s% ^/ Z F2 _McASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */3 J; L" r$ e2 s: k5 S, K* r, X
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);" a) Y% [/ M. f3 q. |7 h
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */) F+ H4 m8 H$ J/ y8 d
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,: a) M/ n W% \0 L" O$ m6 w9 ]
MCASP_RX_MODE_DMA);
- D7 p4 a6 o8 t* d& F" {6 H7 Z1 r7 ^ HMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
2 h+ e g. I( s ^0 u& z3 VMCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */8 ~1 |3 x+ D$ g d6 L* H
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, & U- j7 G& E: G+ R: {/ S2 I
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
1 Q: N! {8 `) c' yMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
& ~0 B8 u# B0 I7 \MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */4 q8 u( T; T' e' M# ?4 ]% w
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);# X* d8 r M* n$ E3 z
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
# M- W+ I6 K' oMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
) n& \4 z. D" h' h1 c7 m; p0x00, 0xFF);
/* configure the clock for transmitter */
1 ?8 l+ t! h$ RMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
/ n& O7 n$ U4 a% P: r: NMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
' c. p. C/ ]" _McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
0 r) r# K6 V U9 g( p: Y0x00, 0xFF);
' M9 x8 {$ b' f! V: U ~% ^$ X1 g) j& C1 E/ t
/* Enable synchronization of RX and TX sections */
9 Q0 O% Z# R& m$ m) QMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */
% Y- M' c7 F8 n2 Y, X% FMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
& A1 ^1 @2 [. |1 F) ~6 j/ Q; pMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*
; |& d2 O0 d* C% ~1 C1 O8 n% ^- K** Set the serializers, Currently only one serializer is set as; D2 Q* _) ?, C0 A! w
** transmitter and one serializer as receiver.
/ }& G* q1 ^$ M9 Y$ U*/
5 h u! b3 V6 s! OMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
' y) [9 z( l8 Q! yMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*2 f' S# x# _* J* s- } i
** Configure the McASP pins
( @2 N+ f q1 z** Input - Frame Sync, Clock and Serializer Rx* h4 a/ Y# Q. M, g1 v
** Output - Serializer Tx is connected to the input of the codec , h# M/ \6 s; C. a' ^. ~# }/ V8 g
*/" d) E& a6 W1 z1 q, q* u
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);! {; p2 v. L+ D
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));! e3 {2 ]7 \3 c) ?* | `
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX! g' ~2 x; O8 z3 ?& \! e
| MCASP_PIN_ACLKX) \. S9 B% ^* y' i" ^
| MCASP_PIN_AHCLKX
& v0 d$ K* Q( h" g( P: l& P| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */
! t: `) X+ d# Z5 H9 l! DMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR 9 M/ G% A1 |4 i4 U' x
| MCASP_TX_CLKFAIL ; s6 z3 [: p1 C8 F" w' z m. F( D
| MCASP_TX_SYNCERROR
8 A: E$ l D, L! K _: n| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
. `) f. l& m% i9 P, E) P6 m| MCASP_RX_CLKFAIL' O- W6 W6 P& O& G3 }+ |
| MCASP_RX_SYNCERROR 8 O K/ m! N) P& q7 z* @' g. a4 ]
| MCASP_RX_OVERRUN);
, ]/ @0 t# W0 l& d+ |& w# p}
static void I2SDataTxRxActivate(void)
# F# z$ A u1 k" ]! B{
T; |9 | T; J- j/ H/* Start the clocks */
& f/ ?/ \2 @/ Q7 Y: Q' ZMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);$ |" f4 a- b6 y( {$ S
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */, a: I" d# k5 H. V
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,7 `$ f& l1 O, ~
EDMA3_TRIG_MODE_EVENT);' Y5 {9 A! k. D3 z. W; P* H0 ^7 X
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, " f# X' [+ {2 o: X
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */" l& l# ~/ u5 {9 F X O. ^
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
' B# B) n: L1 f ?2 x7 c: S2 m( vMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */# p. D7 Z/ V6 U" |: V' ]: m9 d
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */* M' j4 i* ]5 V3 V9 Q7 \
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);7 U2 d0 V8 p" B2 M0 Z
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);# t* ^( Z9 n8 p- d3 I" O' B
}
+ ]: E6 ?- }9 r请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
: W1 G. W) o7 F# W: H
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |