嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,- f$ x- G- M) r: M
input mcasp_ahclkx,
# [( E& \; N) n" p+ W }- I" ?7 [/ _$ sinput mcasp_aclkx,0 L! w+ r2 z. Z' G. y$ r! t. K
input axr0,
3 _# q( y; e0 `9 ~5 h" x
' @* N) ^- U. E4 Routput mcasp_afsr,, k" D8 R! _( ^! U3 r& e) m$ l
output mcasp_ahclkr,
* B B) N/ ~$ k0 Q0 Loutput mcasp_aclkr,
1 v- M; a( u' }output axr1,4 p4 u* m0 u6 w+ M
assign mcasp_afsr = mcasp_afsx;; o1 l8 H; w" r0 W! F. `: r( E
assign mcasp_aclkr = mcasp_aclkx;5 M: O0 _+ N5 e5 N0 y4 B
assign mcasp_ahclkr = mcasp_ahclkx;
6 M8 l0 U* p# W# ?& w( a6 F* Q! bassign axr1 = axr0;
7 R, K4 N: X0 u8 ?/ L/ x' Z; w6 |, b! X! {* c0 k
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
9 \1 o5 o4 ]3 s* }
static void McASPI2SConfigure(void)- ^' Q- K m* ^5 }' u5 y) c9 q1 E
{
$ g+ W+ @; S: [, y) f7 T" BMcASPRxReset(SOC_MCASP_0_CTRL_REGS);: _) t* f0 g/ J' H
McASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */5 B6 ^! G7 R5 _1 ^, R# [0 G
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
% W, N( W: I4 zMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */, @9 A) x: r; L* Z+ f- V
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
5 r; k/ d/ w- i: m4 ~MCASP_RX_MODE_DMA); D6 L, m0 N7 V* U
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,9 X8 H, A2 g% A [( i$ |9 V1 L
MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */% R# L8 A# C% u+ \9 C0 d% {! |. @
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
5 V5 A1 J% _9 ]. R, XMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);. j) N7 H" z4 I3 m* ^
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, 1 r# t$ E* g: L6 F' t) x6 j+ p
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */9 H1 m6 o9 X: C% L8 x
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);2 G+ ?7 L: { w) {# M( k
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); , g7 w4 n, m- B& e7 G6 A
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,& F! S( X# u2 u) l4 N% i7 e& m
0x00, 0xFF);
/* configure the clock for transmitter */' }- c* |. E" I
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
( F# U! S$ A/ T4 d/ sMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); 5 M9 I9 N5 c1 ]
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,) R0 O/ e5 J0 h. s, ^& \: G
0x00, 0xFF);1 Z0 G) k U0 Z+ g6 |
, {) A4 ?! Y7 Q% x/* Enable synchronization of RX and TX sections */
/ x$ |& c4 z1 F8 GMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */
7 d* m3 } _: J, i* MMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
3 [/ a: n( L0 R2 \$ m% @9 bMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*( C n# v( v( `% v+ [) `; ~
** Set the serializers, Currently only one serializer is set as) \$ ]+ L* K1 a! c1 |3 s
** transmitter and one serializer as receiver.
+ j$ G/ b+ X$ Z/ |3 C*/5 f' Z# ]9 ?/ e/ F0 K' @! c* e
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX); }/ c/ j. G; H7 v4 ]
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*
+ i% w' C3 _ S** Configure the McASP pins " v4 X! o- O' F# G) B' u
** Input - Frame Sync, Clock and Serializer Rx+ a, U" S7 V3 w: Q9 W
** Output - Serializer Tx is connected to the input of the codec 3 F" T" _9 B( H' w/ |
*/
& M/ H( [7 x% v0 n6 rMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
( @# |) }. q9 z1 o$ vMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));& f- y" l" l) v3 P& ?# X9 }
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX4 V0 L6 x u# R4 O
| MCASP_PIN_ACLKX' z1 y5 U0 q6 S) l; {
| MCASP_PIN_AHCLKX
' f! d# U; Q3 `7 Y| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */! u! p( J; _+ W. s
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR + R: I* x$ q" {# q; N5 Q* W* ?
| MCASP_TX_CLKFAIL
$ ~5 m, g8 {: f `% N( V| MCASP_TX_SYNCERROR
0 F( c* b* S- G. m9 h8 a* || MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR - a7 Y9 y& Y" K/ R
| MCASP_RX_CLKFAIL2 h* ~" s4 C& \: f
| MCASP_RX_SYNCERROR 6 a/ t0 J. v r. W N& {; l7 W
| MCASP_RX_OVERRUN);- x6 L" T8 R, H# }
}
static void I2SDataTxRxActivate(void)
s5 l* H, ]. L3 M{% x% \1 r- c+ f ^4 x U
/* Start the clocks */
6 z1 D# E! O6 L3 rMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);" v2 ^% C w" o
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */
9 h0 q( D9 f5 `2 ~" P5 [2 LEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,' t- M0 {% ]' s) Y" N) G& W
EDMA3_TRIG_MODE_EVENT);& O3 G6 u8 b& U2 U# |
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
; h" D; s1 m9 K# uEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */) o- R9 w; z) u
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
- T( f+ h/ P6 \, DMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */) o6 |* N# U6 l
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */
8 g. @/ Y6 r2 T6 c/ IMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);
4 q* \) f2 u5 \6 C7 y# o7 \/ PMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);, o' K" s% p& D7 ?* n: h
}
4 @' n5 V8 |* j1 Y1 Z请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
! Y1 p: t* t# J5 }) I9 S' ^
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |