嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,
7 [; H+ t8 o- Kinput mcasp_ahclkx,* h8 A- |3 f, L0 i$ j: x9 I# _6 {7 u
input mcasp_aclkx,
6 i3 M. q9 D v& Sinput axr0,/ @! T8 a6 n4 q N! y
. f, d6 Q; k5 T' @$ {, h
output mcasp_afsr,( O$ J0 k5 M1 k- v5 m7 Y+ n
output mcasp_ahclkr,$ j$ d# k- s( f# G0 s
output mcasp_aclkr,
3 a! ^3 {+ Z7 z* _! S" F6 T8 voutput axr1,2 s9 H. |- j; Q9 Z! t
assign mcasp_afsr = mcasp_afsx;; V2 ^) P; I! c+ G( A& u% g' y
assign mcasp_aclkr = mcasp_aclkx;
% }" a! l" c5 \assign mcasp_ahclkr = mcasp_ahclkx;
2 T' d- H% f& R2 lassign axr1 = axr0;
7 R; S5 m1 h! U5 \
: w0 I5 u# m. B( |' b5 K0 k
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
: h6 v) _' ]' S6 Y9 A2 i$ ?static void McASPI2SConfigure(void); g! Y2 B! @2 z
{& u# O# q( L# p/ U# c w z
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
" t* ~, r8 `; S' g' S+ t2 w8 yMcASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */
9 ~: I' G9 P% F+ ^+ t2 QMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
- s5 ]7 \8 y2 F5 t, oMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */- o2 ^. \- n. c5 v
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
1 ~7 M4 e& _2 c( r$ X# MMCASP_RX_MODE_DMA);
+ |: b& q% k( u$ V. q3 X0 g+ mMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,) b6 T7 G0 Y9 H$ {
MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */ o5 q+ n7 o; c) q
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
* m" ^) |) V1 E/ O! a% mMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
1 k7 v" _5 a ]& Y0 [' a7 HMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
5 b# Z o w* v, x6 aMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */
$ V1 A0 u1 e5 \9 X3 TMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);: T5 k& ]5 h8 E# {
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); q, E+ R, [2 P8 E; u0 _( n
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
; M, V( F' g! B8 P0 t" T0x00, 0xFF);
/* configure the clock for transmitter */$ T9 o7 J0 R$ D) a3 d* O2 m
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1); G; L3 l1 |8 O4 l, F" V$ t
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); * y/ d% d/ Z# B6 u$ x, z' [: a) N
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
7 b3 e6 E: \5 _9 g" M% V. b0x00, 0xFF);
7 }* y$ L3 _; w- F" G: m' F$ a+ {, T5 b8 v' }: n0 ~
/* Enable synchronization of RX and TX sections */
3 V0 `+ U+ z0 `# |McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */ r4 d& [0 Y1 D6 R5 y" v2 z
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
5 U- a7 a- c9 a% S4 E/ jMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*4 W4 |! |& u- W1 j
** Set the serializers, Currently only one serializer is set as, `, ^4 k$ A- W9 R- @3 s5 A
** transmitter and one serializer as receiver.
& A; t7 W, f- e8 f, n*/7 a/ O; ~. T \
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);# X- Z+ J& `( @6 ~& m% r2 _
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*
: S& b0 G& C9 L6 ~** Configure the McASP pins
- B/ Z- {- Q! K! }: o** Input - Frame Sync, Clock and Serializer Rx3 B; q/ V" D+ m5 `1 p" }
** Output - Serializer Tx is connected to the input of the codec
% `8 C! f+ F# J$ i' T/ Y- O* H) r*/3 H2 R$ S# C( u( O+ f$ E
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);0 }, o) d5 p. u
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
; [! \( Y/ m$ IMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX1 v* b) q+ |2 ]( a1 w0 k% R: U- E
| MCASP_PIN_ACLKX
4 F5 v+ I6 o' E$ w| MCASP_PIN_AHCLKX1 f; B" x0 }+ L0 M. Z
| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */
* b+ l3 Q/ c* z2 p- G& iMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
0 i4 r+ B- [ L) H. G0 W) ~8 d| MCASP_TX_CLKFAIL 8 ]4 l& h7 I4 ]2 {! c5 b6 H% x; M" ^
| MCASP_TX_SYNCERROR+ ?; r# @7 O+ \/ M9 W+ K
| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR ( k X& I; }6 m/ r* g/ i- d
| MCASP_RX_CLKFAIL
" n2 D* m/ a- K+ _2 d9 E5 n9 Q| MCASP_RX_SYNCERROR % M4 ?5 I- Y( _* S
| MCASP_RX_OVERRUN);4 r. U8 @3 F$ u, h. D$ y j
}
static void I2SDataTxRxActivate(void)
; V1 G! b6 ^* H{
' a# Z, \! G# g9 y( i% d/* Start the clocks */ O: Z+ {' M3 }% B/ U' R4 C
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);5 Z* c& U0 }( ?
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */1 }& @8 i4 E3 F' ?4 a2 i
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
U+ j( T3 g6 G0 o+ P- |1 uEDMA3_TRIG_MODE_EVENT);/ D& p9 \% r M X9 h
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
- e, b- y/ w6 k* g0 T3 IEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */; F, l7 r1 z$ B& u- J' R( i8 S
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
( m3 X: d* j/ F) ` @4 CMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */
$ X6 o+ M1 Q2 Z3 t6 M3 Owhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */+ M! r! y8 P; n: V6 W
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
) f; J2 {0 o: p5 | V6 B5 C! eMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);- q _# v3 a/ i1 t" x
}
, b8 n" y1 j: V8 T0 |% w* M请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
7 p( y( E! [7 q* r1 T( i
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |