嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,
4 ?+ F! Y! ~8 v/ T" hinput mcasp_ahclkx,
3 k% l! ~7 \: ~' `input mcasp_aclkx,
, N$ a! C% P& _input axr0,7 c" q. {* J# H& `, V
* e' ^9 u, {6 A/ Doutput mcasp_afsr,/ c# ]& P. K! M( o: s
output mcasp_ahclkr,
3 q0 W7 o- P9 n0 o7 }output mcasp_aclkr,
5 R4 T! ]% K' C5 g4 X4 W4 }$ \output axr1,
0 S; ~6 }; k6 v- H5 I
assign mcasp_afsr = mcasp_afsx;6 b) f+ j" f; k' |) c( E
assign mcasp_aclkr = mcasp_aclkx;
) i5 `8 D0 G# p7 n* r; yassign mcasp_ahclkr = mcasp_ahclkx;! ^ V: ]( f. s$ M* }1 u
assign axr1 = axr0;
; L3 D6 `" f& G9 V/ N" T. H: J1 H0 A
) A5 @* |5 E* c在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
( F6 [0 p0 {& v4 s' Ystatic void McASPI2SConfigure(void)
% H* t, \+ o8 ]{
$ ]& Y6 c0 [+ l8 u. n* q: Z$ a) _McASPRxReset(SOC_MCASP_0_CTRL_REGS);+ {5 j: |% w& F1 N
McASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */
' I6 Z" U4 j* M" a: WMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
' C3 p# ?. ]0 C& UMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */3 m: i! v# h7 R) I
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE," t5 {* ~2 N( p9 Q
MCASP_RX_MODE_DMA);
. ~6 E0 | g( U- O0 OMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,8 \0 o1 Y( u D. g- m5 Y- @
MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */& f( a3 H- R* ~0 d( w* b [
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
L/ U( ?) R m1 x% A9 K7 \9 RMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);6 I3 j o# n N1 B6 r/ E& @/ A) X
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
& o7 U W1 }4 i6 E; CMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */
- ]; X. K& h, _/ u! \ zMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);- F% \6 b8 o- I6 R: H9 b+ V* J, D1 r
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
" b0 a7 A# f2 n* y$ f! HMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,/ O- j$ O" B) N+ I0 `8 n, G* K
0x00, 0xFF);
/* configure the clock for transmitter *// p( \/ k. K7 k, a: [
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
% R0 c/ E7 w5 w; k2 B* VMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); - d" n& k7 t2 R! `' c4 {- a
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,/ \& }1 J6 n2 L, f
0x00, 0xFF);
1 `- }8 d h$ |2 p- D% J$ {3 F$ U' ~! I& R6 x
/* Enable synchronization of RX and TX sections */ 8 [5 d7 ?: G4 J! O
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */
Y% X, @/ K2 E% r' JMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);* V, P) B% w* I, T2 ^. ?7 m- g2 c m; B
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*
+ H1 q4 O* F& @$ w** Set the serializers, Currently only one serializer is set as) v! E" V7 F, c [4 T4 y6 X9 I! u
** transmitter and one serializer as receiver.
p6 _) P6 _ i5 P4 M E/ H*/( v: I9 @% ?, n6 c, F n4 R
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
; ]! a3 J3 l2 E4 X& }McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*) ?: y: z) C6 r' L
** Configure the McASP pins
; ?4 m2 O% m4 C7 y' q** Input - Frame Sync, Clock and Serializer Rx# t( N/ S' {& F% I4 V6 T. J2 X
** Output - Serializer Tx is connected to the input of the codec
" ^3 e |# f+ ]8 L% w*/
& ]& U1 P& O# wMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);+ J* I8 I2 t1 q
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));& m% ~* p0 Q2 X# B x8 Q
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX# i& d+ n$ \) d5 X! c
| MCASP_PIN_ACLKX ^; L+ @3 z! C I
| MCASP_PIN_AHCLKX+ M9 z8 o- @# S5 q/ k7 w
| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */
% I" ^4 a! q" K5 bMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR + p' X" T$ R+ k
| MCASP_TX_CLKFAIL
! p. t- p6 P! `% S9 @; J| MCASP_TX_SYNCERROR
$ p3 y/ o% x1 c3 s" d| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
: Q+ \" h" j6 K: v- r| MCASP_RX_CLKFAIL
% ^+ Y* a9 i+ c# u5 I! y2 s| MCASP_RX_SYNCERROR
- ?) u* n' B P/ \3 u| MCASP_RX_OVERRUN);
, _ L: [' U& e( j6 D}
static void I2SDataTxRxActivate(void)
3 ~) W! P& K6 m e{
+ |- _( X# \2 ~$ }/* Start the clocks */
d2 q% b8 I/ zMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL); `+ h( B9 X. ?* i5 T- w& l
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */* V. b# ]; Z4 w! u7 K
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
2 y9 n8 l/ H" `% N. }, _EDMA3_TRIG_MODE_EVENT);9 r0 e W( S9 O' o4 c- @
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
5 j) b( _) x- {; Z6 P EEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */. ]0 T: U. \1 n$ R5 v7 O
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);7 \, b$ K7 C+ i" b& u, r0 o) K
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */
( J. S9 M* O5 S- f/ b0 E' f3 m! Jwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */8 i+ ^# ~4 ?1 w: c! r
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);1 ]2 v' j3 `3 L
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
% ], q) f7 p5 ~/ g! k9 S}
, _$ X7 k" F* h4 t
请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
( k# {% p7 ~0 l! D! @; l
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |