嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,- O7 d- p% E; x) { Z
input mcasp_ahclkx,
0 ?0 C+ n1 Z+ k6 Y& ?& {9 G) S+ minput mcasp_aclkx,
: o W% ]9 g2 |4 M P, K: E% ninput axr0,
' w0 }! y1 y/ f J; C+ d- S6 T
8 r& V6 { A7 f$ w" Routput mcasp_afsr,
7 ?+ x' f0 q3 H; R. Boutput mcasp_ahclkr,% p4 w/ m" [/ ~/ F' s
output mcasp_aclkr,
0 a1 T1 s2 x5 w7 D( U$ e8 z8 foutput axr1,
; o' e4 c, H- f9 o9 X$ l1 w
assign mcasp_afsr = mcasp_afsx;
8 f/ D# A6 b$ Y( H! e4 y& Uassign mcasp_aclkr = mcasp_aclkx;
" a* |) B9 ~5 i* L! s; sassign mcasp_ahclkr = mcasp_ahclkx;1 | I: ~. U9 B
assign axr1 = axr0;
7 E9 G! G0 G8 J) o* ?: K5 \' b* b% c3 R3 Z$ [$ U
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
4 u2 m1 N, N" c' ?% ]2 D. \static void McASPI2SConfigure(void)
& n. W! Q. M5 A& o% ~{8 G0 t" L4 U4 J4 v S
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
' b8 B" l8 t& [. S1 OMcASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */2 @, ?) `. P4 |1 T- N0 i
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);0 w4 S7 C/ j; ~
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */9 O8 K; t- N: T; v
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
$ E% ^. p/ r6 r/ f/ @MCASP_RX_MODE_DMA);; N' _) c* y0 F
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,4 E! h' b" y5 P4 c" C1 }4 e! d
MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */4 S- X$ L/ f7 ]% h' _: }5 m
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, ! m3 N2 z+ F; y* }
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);# ]' L2 `+ ^ A+ K+ \2 `2 Y2 O
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, 0 E4 v7 H' U* m- R; b* ~3 x9 y0 X8 S& r
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */
% z. K4 O9 U- c5 S) i" ~McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
& v; h/ K3 \& N: U B0 IMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); 8 g0 C6 b. I# C: }( D$ v
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
4 {7 c l9 o& p) B8 {8 `- a+ ]0x00, 0xFF);
/* configure the clock for transmitter */
, Z, ]0 C# p& qMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);- z& M# i# h2 P; h8 K; @
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
% M1 o8 [% I5 S1 GMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,/ R2 C+ p/ O' `- \. [3 R6 Z4 ^. S: N4 J
0x00, 0xFF);
2 r( q7 _! ], |/ z3 S5 d5 n7 |; W) g" O2 p7 I! O
/* Enable synchronization of RX and TX sections */ 4 z/ `& C" [" T
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */
% o' b$ ^9 Q& m: E( Z) \2 D6 S' lMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);2 q' `6 G7 d3 z/ W2 j. V7 i! O, s; P
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*6 ?& R# J; t& O+ M6 x
** Set the serializers, Currently only one serializer is set as* N% V0 ~5 M6 F. f
** transmitter and one serializer as receiver., C( r6 E0 x4 G4 _& d
*/; m3 G6 C8 [3 \& E/ W( }) d0 g7 S8 g
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);0 B+ \- D+ q {6 k3 Y7 z
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*
! U# n2 t% ^' m1 ?& G** Configure the McASP pins % E1 x( N2 m* i1 L8 D0 D
** Input - Frame Sync, Clock and Serializer Rx. F: R1 u0 ]& l. S4 p# ]! X
** Output - Serializer Tx is connected to the input of the codec & S. l0 Q4 g r& s, x6 U
*/
|1 E# k5 n$ G+ XMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
5 w) F% T1 F+ G/ o- Z2 _McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));! u5 p! m- y5 R" y; T( b$ e
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX3 u/ Z# I: Q5 E1 k6 B
| MCASP_PIN_ACLKX9 O+ W$ w- L/ U. _6 R0 q
| MCASP_PIN_AHCLKX
$ |! B6 ]8 X: n, W1 W* u* E# l) K| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */, Q% \5 C# t: D2 T3 V
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
5 [' O0 E+ }' J o2 g: ]' @( d| MCASP_TX_CLKFAIL
0 h c& A e0 v% I| MCASP_TX_SYNCERROR; F! m4 x/ o0 x2 A& s8 i Y$ m# i
| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR ' p0 V) |) |# C' O3 C
| MCASP_RX_CLKFAIL0 Q+ ?3 g. l; w! p+ u
| MCASP_RX_SYNCERROR ( v/ O- Z/ V( ]
| MCASP_RX_OVERRUN);
/ M7 m: G6 b4 K( ^, {}
static void I2SDataTxRxActivate(void)
. g' n; k3 U' K9 }9 B: l3 u# F6 T{( l( k4 Q; k+ t6 x% t+ k
/* Start the clocks */
1 o8 F: Q' O6 y; F& o6 c* Q# i. |/ @McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);5 m( R) h! i- i; W
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */
6 {. X9 _1 g% c' Y3 h0 VEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,- Q6 \+ r" t/ F) y$ r' y
EDMA3_TRIG_MODE_EVENT);# s# M- ~& J$ f8 Y" D* N1 R# {
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
) u/ q# @6 l% C' \" \- u; fEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */7 P5 [9 k( h0 m! n: Z' q5 B
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
3 a$ e. t' _8 H9 A: N, IMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */( p" T: ^9 H" Y. J) b
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */
% U' L z5 U1 dMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);
$ S1 {/ f9 K1 K3 p7 tMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);
; m% Y5 E4 M2 [/ L}
+ l5 r8 H) w: T O* S
请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
" z ]% b$ ~9 m3 m/ H3 O9 k+ T: ]
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |