嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,
2 T. e6 m% V7 C: Q% {" ]; Tinput mcasp_ahclkx,
9 p/ l$ s' [- l w# Yinput mcasp_aclkx,
& L" w! M8 l# Ginput axr0,: {) H2 @! m+ ^ Y2 k# |
6 c9 J" _+ `" [( ]output mcasp_afsr,% ]% }( f: ^* s* ?8 h, w! J# |; j
output mcasp_ahclkr,$ |' |6 C# t# o0 B% e
output mcasp_aclkr,: b. x, H3 A* J5 C2 N( R5 g
output axr1,
' s: L+ x0 W* A; O- ~
assign mcasp_afsr = mcasp_afsx;0 e, a, x! s' E' \/ ^$ F5 G. D
assign mcasp_aclkr = mcasp_aclkx;
" m; m+ B$ d% Sassign mcasp_ahclkr = mcasp_ahclkx;
2 U4 D$ W" m% L: f/ p' v. s4 }assign axr1 = axr0;
; O5 M( @6 V: _* z) `
2 d3 J& ^( Z* J0 _
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
# J4 h! q0 U1 C/ M" y- j
static void McASPI2SConfigure(void)
, ^7 W# u3 q, C0 C& T4 j{
# ^3 z7 q) K* `# c- vMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
% v3 j0 x2 w& P2 ^, l) CMcASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */
# @$ g# v4 a6 H4 \8 U. y" A: UMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
2 W! H% }& w6 G; f6 w( E1 DMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */
3 o: X# ?; o1 M) n& H" n/ P9 a% M' NMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,4 x" M1 l a6 f2 ?. V) X: K) }/ U
MCASP_RX_MODE_DMA);
, f3 ]. o, |* u+ n. d3 WMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,3 ?5 v$ E* O. O
MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */
2 R* p3 I5 f9 |6 IMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, ) l7 D, e; R& C: `. W
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);9 Y9 _: i0 w1 h' |5 O
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, 8 d8 Z' q' C- N* W& |( l
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */1 Y$ J0 {3 A9 @5 R" [$ E
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
- [" D5 u* P0 V. Q2 x3 w! _McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
7 r5 @8 e2 k$ b: n. o+ NMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
; [8 _9 f- \% Q. E0x00, 0xFF);
/* configure the clock for transmitter */
; c/ r, h( ? G: gMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
( R+ a$ p- p4 P. v+ f1 }, oMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
9 l! C. X& ^3 ?/ {1 Q( j9 t5 {' r9 f8 sMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,1 Q' P: f. C* H& f i0 ~7 |
0x00, 0xFF);
3 _# n% L# g" }3 M3 }. W
7 e/ a5 c2 n4 u/* Enable synchronization of RX and TX sections */
- l3 V3 o' s) K2 Q2 G) F/ aMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */+ Y, O1 G. L: L( L) ^
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
) T6 B8 b, r' R! qMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*
; u5 t/ I4 W: O3 A. L( u8 T** Set the serializers, Currently only one serializer is set as7 B" ~) l& z- S# h, X* Z: R" V
** transmitter and one serializer as receiver.: i5 m+ q7 y. H
*/8 {; y! m/ W. a: w f
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
5 Z' _# z' _! r. H1 xMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*- N, {0 a+ [8 ~) _" N
** Configure the McASP pins
/ q& J: y- n2 p1 ?( m! C% M** Input - Frame Sync, Clock and Serializer Rx
x ?& O8 W" _" c, F** Output - Serializer Tx is connected to the input of the codec ; y1 a% c! m; t; D+ i) v$ E
*/
. M# d! l! k7 y( l$ S; z' \8 Z+ BMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
' E, Z& U' v& j# P1 P% E* `McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
2 r6 f- @5 Y0 J! CMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX% _/ X, N: Q9 E( H" ]4 _! y
| MCASP_PIN_ACLKX/ r5 ~4 Q! M. E* y
| MCASP_PIN_AHCLKX8 U5 z4 h. M* S3 m# b* I* {
| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */
8 c$ ~& I# ~' p$ i4 ]2 ?McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR ) x8 c; }% s0 p8 N0 p* t
| MCASP_TX_CLKFAIL
5 y. [$ M( D- s% O. B1 A, K| MCASP_TX_SYNCERROR: w4 A a) ~5 U# w9 V! w
| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR : ?7 W- p& n3 V8 y6 G' t
| MCASP_RX_CLKFAIL' h. A. @- k+ k# Z+ v- W5 @
| MCASP_RX_SYNCERROR
$ i6 _6 ~0 P0 P# W4 }4 X| MCASP_RX_OVERRUN);
$ r' r& D; w2 H' j3 ?}
static void I2SDataTxRxActivate(void)' `% f) b7 P4 a7 x
{
5 y% ?* V' _3 q, ?; \: a/* Start the clocks */
# y- e* E' j. m2 ]McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
6 G+ Q& F# E# V6 S# m0 jMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */
0 E. R( f2 c! u5 ~5 `! d. j$ {- }EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
2 t% ]& h2 o e2 N' VEDMA3_TRIG_MODE_EVENT);6 i6 o( B3 L5 K
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
( y$ \% S) `+ qEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */$ S0 [, H Y6 J( r
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
& a) |& Z, @5 ~2 G: Z r8 u$ yMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */6 u" _6 l" m- h/ F' s
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */
1 y1 M# _5 ]/ E, Q" }: z: \+ a. g2 eMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);4 Q& |; c; q9 E( F8 a' i' f
McASPTxEnable(SOC_MCASP_0_CTRL_REGS); M" s9 W) n- m0 J) {* T2 {( ~
}
* B! D* g0 t7 p5 v- |9 x" Y1 @
请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
) X* A& Q1 T( H5 o( h
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |