嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,. \5 X' V. b! K G" V% z8 u
input mcasp_ahclkx,
% T6 M0 z% Y" @# {input mcasp_aclkx,4 X" e9 G6 j: M! M' u0 k( R1 X
input axr0,
+ H T& ?% K9 M3 }3 ?5 `* M- i9 p9 @8 I( B7 h9 o$ k2 t
output mcasp_afsr,. H! i4 i- P) i3 b; Q" Y
output mcasp_ahclkr,
( T+ v/ A, L0 _! i. D5 ^2 ~6 noutput mcasp_aclkr,
2 B- J; c3 m$ ^output axr1,
2 h7 R9 D& O3 R" [1 B4 p
assign mcasp_afsr = mcasp_afsx;
5 P0 |0 \& n8 B* u& L/ Aassign mcasp_aclkr = mcasp_aclkx;9 c9 J0 ]2 v; |, ]& x3 F% g. G* f
assign mcasp_ahclkr = mcasp_ahclkx;& b; I; E' m3 h# U
assign axr1 = axr0;
+ ~6 k+ b0 z$ o* D
4 D- d1 `: E/ F" {: x在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
0 I9 U5 o4 R' _+ r
static void McASPI2SConfigure(void)
1 s: v4 N9 {2 H' D) N{
5 U! D/ Z! B+ W" u9 d: X, w- T# TMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
# ~/ V* Q5 U8 x7 V* |5 NMcASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */
3 Z( R# s$ x; Y0 ~+ c: ^$ OMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
" N" z. M1 F C" ?7 o% {/ g9 \McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */4 W% h$ |8 ]" b6 O+ F
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,# G7 u- @% N- m# K2 K
MCASP_RX_MODE_DMA);' o2 d8 E6 L, u2 N5 w
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
5 U2 l# T: W1 s8 [7 tMCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */) S4 z! b3 [: u) E4 k
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, 9 ^) Y# Z% h" ? {+ P
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
' v0 z- L- u6 ~! y3 r2 BMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, : ^) n# M9 S9 A/ |' o$ S
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */
, W& N' s+ G1 j' l! g- Q3 eMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
8 F" ^3 O$ \1 \( jMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
6 I; C# @: m7 k# c' F. m# x* M3 [9 n" ^' ]McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,- S0 K8 _; L) o# L
0x00, 0xFF);
/* configure the clock for transmitter */+ d. r/ N8 {, P# W& f8 Q) S# d
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
; q1 O: D3 A' _9 g( O5 r' ^/ }: v# \McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
$ T" L" g; k# j8 n6 qMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,+ Y* t& F& t- S' `0 Q( i5 e
0x00, 0xFF);
# C; f6 }; s. d" m$ Y
* L1 f+ z' K- A% e' Y _1 ?+ }/* Enable synchronization of RX and TX sections */
; X7 t$ F& K# ^McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */, F R" @7 S" T/ [* z
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
! a8 O7 k _6 GMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*
7 g8 g: p3 b) V% E4 W+ g8 |3 g; b** Set the serializers, Currently only one serializer is set as# @! f2 C( X; W9 Z& Y: Y/ ]4 H
** transmitter and one serializer as receiver.
: h. A+ a" A* n3 T8 Y( V# c. x*/
( G5 K0 Y! W& jMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);: s; n: ^( C+ V
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*( t, U, C7 V- ?: u# W
** Configure the McASP pins
& J% p. o$ C" u/ a, l** Input - Frame Sync, Clock and Serializer Rx- A0 c. {2 F" C
** Output - Serializer Tx is connected to the input of the codec $ |5 X7 R* o( u
*/
' ^; L( o1 E. V/ a' C3 @McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);4 l) ^: L9 D' t; Z3 Z
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
% C$ l1 X7 m$ g. V! d( v" vMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
, M% q1 E( M- E| MCASP_PIN_ACLKX8 t0 b- [: d# z9 c" |
| MCASP_PIN_AHCLKX2 F1 h. @ w$ O+ D1 h. n
| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */9 x- ~5 f2 A' \, ~- [# {$ Z
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR ' F. }7 {# @/ X+ w
| MCASP_TX_CLKFAIL
6 E4 j- M# v( m: D; i7 V/ e4 o| MCASP_TX_SYNCERROR
4 D& I, n. T; z| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR * K; q5 g T% n4 p
| MCASP_RX_CLKFAIL
6 h! J9 D, s4 o# H8 K; R ~9 N. k| MCASP_RX_SYNCERROR
+ d/ ?) [6 \( f6 C/ h| MCASP_RX_OVERRUN);
4 {* c, G' l5 Y# g9 d9 ^ t}
static void I2SDataTxRxActivate(void)
1 s8 A, D/ d x{
" r/ {1 k( m7 |1 J6 ^/* Start the clocks */
$ ^" @- g& F! g3 h9 a, ~McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
" N" X$ |; m" m4 N+ vMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer *// |9 \: v$ q$ o" j8 U3 f3 W
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
3 }1 ]; ~# G& H' c6 H1 E1 u' JEDMA3_TRIG_MODE_EVENT);
# Q6 Y7 l2 S0 v- S% sEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
7 c& J6 j; k$ a& iEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */
6 c/ O3 x7 z8 x; s* E; {& ZMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
; h2 M5 x$ @& u* c2 S; X; n7 P0 jMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */) v. n5 R8 W" j6 G8 h+ P" q8 I0 g
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */. e4 j! g5 P5 l& [5 ?
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
: \5 }! d. _/ ~5 W# eMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);3 i+ C$ v; @- E9 d8 g+ E3 i- R
}
% m2 Y0 F6 c/ l" B请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
( n7 d- g* j( p7 E
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |