嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,
, m" {$ u5 ]; v4 H3 _input mcasp_ahclkx,
) x5 a) Z7 V( |. \1 a& X# Ginput mcasp_aclkx,
0 X# |7 W, S3 p+ }( w& linput axr0,+ h: T: n+ w0 u e6 ?8 Y
2 U; k: `- @$ G4 b Voutput mcasp_afsr,( Q5 U4 f2 E7 B0 r8 I
output mcasp_ahclkr,4 P2 ~; b; @; M4 N ]/ m/ x
output mcasp_aclkr,# n# l) j0 {- R4 Z& k& F4 W. i, T
output axr1,3 U3 F- r& P, [$ ^/ L7 C
assign mcasp_afsr = mcasp_afsx;
& T- ?* l, e5 \% Fassign mcasp_aclkr = mcasp_aclkx;
2 L/ B& z! G$ h7 }/ M4 Hassign mcasp_ahclkr = mcasp_ahclkx;8 `5 _) m3 n, n
assign axr1 = axr0;
+ @2 }0 h& |: o+ i' ~7 G' P: ?
! E, T; Y9 O. ~2 N) |5 d/ `在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
: I h5 Y9 B! d- J" }) B! m1 sstatic void McASPI2SConfigure(void): G8 j# u" S. l7 M
{
7 I7 a/ g; [! ] m4 ` ZMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
0 c$ [5 c/ f3 E2 D7 f0 w9 m* eMcASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */- C* L) F% A: }8 R$ G" O
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);' Y% l5 d( x$ @+ J& N& C8 u' C; y3 P
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */* ~, m; \$ y8 r
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,# `/ L+ H0 j+ t/ A
MCASP_RX_MODE_DMA);
" ?" \1 i! V8 V8 t6 rMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,; l$ K3 S) z, H* V
MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */
# m- Q/ V2 E" z. g' R& L f/ K* UMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
' |% }5 K; {5 q+ o# M# wMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
& o, A* L+ G& N( o& _' w; @1 r3 OMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
. |1 Q/ P2 u t8 ]3 t0 k9 n' uMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */
. P! X/ a/ J4 C( K1 H( y" aMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);1 l! c5 H' j- f7 ^5 _4 r
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
; l% w5 N% A8 g3 \McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
" g1 @. n( t; s1 W( ~6 l! K( Z* P0x00, 0xFF);
/* configure the clock for transmitter */
$ K( v$ ]( {$ i0 K, BMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);6 J r7 k6 t& m( ]
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); " y! G- ~5 R' s0 [* g
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
3 G0 \0 X. R, }0x00, 0xFF);
0 g+ I: y. M' `( O: @' ]7 X1 m2 e' p. M+ H9 z, R2 S/ S$ ^6 U
/* Enable synchronization of RX and TX sections */ & R3 c4 y6 k' t" p; [, w9 T
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */# q" U9 t; I+ ~8 k6 h
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
3 e) C! B! {. W1 DMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/* i# R! {: B# X' L% H, l
** Set the serializers, Currently only one serializer is set as: P) c& a# N7 ]$ H/ v7 k/ S% I
** transmitter and one serializer as receiver./ D7 Y; b* k6 l* _5 m
*/- e3 x, l0 p/ l& t$ V8 `9 M
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);" q* N: [& A# b
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*
2 R. b& U' s/ |* }. b** Configure the McASP pins
- E) @+ |2 a. {9 ~2 H** Input - Frame Sync, Clock and Serializer Rx
4 j, R* U2 p8 ^! l** Output - Serializer Tx is connected to the input of the codec
7 \; E1 B+ e& |3 p$ r*/
3 W7 d" J$ X' m uMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);7 X7 e% G7 Z) N% O4 K8 M+ E5 Q
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
, ~3 `5 D0 L2 a* n2 i OMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX; O. W6 ]+ q9 n! ]
| MCASP_PIN_ACLKX% ?6 {& f* V8 o
| MCASP_PIN_AHCLKX# H" i( _% T5 ~1 m
| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */% F, {9 F) K& E' f" d; M
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
u. C3 D. o5 p l/ @! X/ Y9 f| MCASP_TX_CLKFAIL
8 u" O1 @# S% d% n| MCASP_TX_SYNCERROR2 }+ i( {! D* V C- ?0 H+ Q/ U
| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR - y, A* B1 Y7 w# d) G
| MCASP_RX_CLKFAIL& g1 Y4 T2 U- H( Z5 e
| MCASP_RX_SYNCERROR . |' w, _6 ?6 g M/ t7 _
| MCASP_RX_OVERRUN);3 c; v2 P! l9 E+ [/ _
}
static void I2SDataTxRxActivate(void)( C0 P: U9 u) ?# F
{: L6 F& L( j. g- d: `) b2 k% b
/* Start the clocks */
6 V- X% a& j3 a3 D9 z* CMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
2 U, L- T3 j+ s9 \+ B& J* v. oMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */
" {0 |! m7 w0 m+ ^9 b7 I9 a5 `EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
1 z) l- h- j0 w5 ^# H7 A2 fEDMA3_TRIG_MODE_EVENT);
" Z: F/ D. u" N! MEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, ) u; _# G3 k0 v2 _1 |
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */
h7 S7 k. l4 o% @4 OMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);) u% _$ G+ r& U. j" y& B
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */4 w t6 A, {, b/ R* S, F
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */, [+ V: U5 q$ ~! l8 j7 }
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
( s2 t9 Q; P/ b) m" }% cMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);
0 W3 X& v$ O; v2 Z}
2 D/ g! r* I- r请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
9 p4 `4 L8 Z4 B% L# n
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |