嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,( t+ G, A! }7 H' t4 v6 o* u
input mcasp_ahclkx,0 M: C& }+ Y4 ]6 p
input mcasp_aclkx,, V6 ?$ Y9 Y/ c a u7 X2 ]' m
input axr0,
7 }! ?) v& k9 f& j/ X: f' [, f ^& w+ ~1 m
output mcasp_afsr,+ ^. q5 m# ]5 L$ [( N6 U. G
output mcasp_ahclkr,6 ]0 \) N o8 ` z1 s5 h
output mcasp_aclkr,
& P% n& X" \2 V1 zoutput axr1,+ b, z$ [* U4 Z* D; K3 i
assign mcasp_afsr = mcasp_afsx;
. Z) c+ ^6 L% E1 ~: n3 Z' |- Z4 Oassign mcasp_aclkr = mcasp_aclkx;, l! M; M6 b! ^
assign mcasp_ahclkr = mcasp_ahclkx;* X- b. ~) w# \$ Y6 T( E. A: b
assign axr1 = axr0;
" x- h# z7 T O6 Z: M/ [; } Y; L$ i! O) u& N0 k' B& Q0 M9 ?9 y
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
' ~9 h/ y/ V. m; ?' Istatic void McASPI2SConfigure(void)
i8 i! T+ k A! {{ o/ [; X- J% C6 A5 h
McASPRxReset(SOC_MCASP_0_CTRL_REGS);- O' ~5 b; S2 W# X/ @
McASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */
8 [; c3 k3 O+ Q7 S# t [/ C1 nMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);* T9 u4 s* U8 V) d$ N
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */3 Z" G, h; u# x9 d
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE, ~. ?1 G; m; B+ ~5 j
MCASP_RX_MODE_DMA);' d) X+ ~$ h0 A& I$ j/ ~: w( X- @
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
5 N: V1 \2 _& |6 dMCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */: P: U4 z% R$ o/ ?# k( x& u9 q
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, " Z# C* R; W5 F" |6 ]" s1 k
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);8 {0 k9 G( J d! U" R
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
( o4 b; e8 p4 l$ F+ l1 S' CMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */
( |6 I9 q. z+ ZMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
" a# u: g; z# n& y# ^McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); " \. E& \& w4 b A
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
( |+ B: F; |: q" Z0x00, 0xFF);
/* configure the clock for transmitter */
Q: G# i) q% p5 q- ]: }McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);/ E! {; S- N% i" j
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); , w1 e$ w% t/ U* k# W* } F
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,0 o) z4 A1 q, k; r3 T7 W
0x00, 0xFF);. {. o7 P) i$ M% \3 Z) g( x
. r) f8 K+ j& D, _9 c/* Enable synchronization of RX and TX sections */
3 S/ c v, M$ C$ y5 ?/ IMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */8 R ?& \! C8 [$ D
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
6 N8 G) l+ p- @4 `8 @3 m$ b) FMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*
8 T2 H; D! m1 [. y# K% `' a** Set the serializers, Currently only one serializer is set as8 w/ W4 m; o, h* D9 m
** transmitter and one serializer as receiver.2 l' Y6 G: ?1 B3 O9 o: ~
*/ J; G( q% f ^: V$ h# ]( T' q) \
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);. B, A! ]) e( C' x, `
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*
; X: K3 I. w4 d& q** Configure the McASP pins
! l9 L5 y+ ]7 v# t** Input - Frame Sync, Clock and Serializer Rx( X; r! [' G. @2 k7 P2 h* O
** Output - Serializer Tx is connected to the input of the codec
8 z+ l+ X2 v9 i3 S% s*/- B7 p0 t+ o3 l
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);' H8 ?# _/ o% C; R6 Z5 }
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));6 U8 ^- v. b4 c" \+ h5 y( `: g
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
; T$ }6 s# X P. H| MCASP_PIN_ACLKX
% h h$ v0 W# p' V| MCASP_PIN_AHCLKX
4 e J p9 w9 W5 Y5 L| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */
, m1 {/ l* v# H! L8 }! c* aMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
9 D; N2 n" o# x. R p8 R| MCASP_TX_CLKFAIL
5 N$ U [. R/ w' r9 i8 T& G9 S| MCASP_TX_SYNCERROR
$ {1 P( f! z, q| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR ! Z& I5 \3 @; H/ v% k
| MCASP_RX_CLKFAIL
0 q) l8 u) }2 _9 c( Y| MCASP_RX_SYNCERROR 2 G4 ~" {/ X" X2 v% g
| MCASP_RX_OVERRUN);4 g* [" r9 z* T7 e% n* f6 A5 S2 C
}
static void I2SDataTxRxActivate(void)
! l3 p+ W+ l% ~: a$ B [- N! {8 D{7 r$ R2 m" c, @9 h
/* Start the clocks */
; T4 [$ O* U8 Y+ h# n' g. CMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);" M/ } u' A- W! q& ?
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */
; K7 t% A# Y" g5 k( x6 K9 l# tEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,4 }" l5 ]5 c2 D$ `8 T* V) U5 H. ]
EDMA3_TRIG_MODE_EVENT);8 \& U. S4 p; ~ s- j: P8 n3 ~$ a
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
! z& O6 Y3 U/ W0 V' G; d8 UEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */, W) m1 U) M" N: m
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);7 l, \$ w! P! n
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */6 j8 ^: d* E2 o3 ]) @
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */
! }; T0 Y9 Z3 K% qMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);
0 r% ?9 ?! X, D M& u/ G! N9 cMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);6 _. S1 y2 ~4 ]# U2 _+ s
}
4 Z* z K; P& i3 o5 E请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
- j6 v! F9 d5 i7 z+ E
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |