嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,& u1 \- B' ~$ g' m+ Z* V+ E y2 k
input mcasp_ahclkx,+ k1 R# Z1 ~) C* v+ Z. v8 z
input mcasp_aclkx,/ i8 Q% I( s9 V/ l
input axr0,3 t9 Q9 v1 |; w1 L2 X E
* g$ z# x$ U3 K) u. F: ?
output mcasp_afsr,
* X( [) `& r4 Y$ Eoutput mcasp_ahclkr,% ~4 Z0 R8 e* N! \; H: e- y5 \, t
output mcasp_aclkr,
8 G9 `& m3 Y' z% ~3 l+ l/ y) @5 Poutput axr1,
3 ^% g) ~, B# D
assign mcasp_afsr = mcasp_afsx;
% M3 m/ r7 j4 E! ~8 W- ^% a3 v& Vassign mcasp_aclkr = mcasp_aclkx;6 ?$ N! u* i4 Z6 E, I
assign mcasp_ahclkr = mcasp_ahclkx;
. ]5 o( {9 b6 o! R( Sassign axr1 = axr0;
6 J2 H6 c% }% j1 f( y( y, U% O4 I
0 I5 I' u- M, {" n* @4 [8 f
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
8 @' f. t! R. s) X2 E; Hstatic void McASPI2SConfigure(void)+ U8 h" J' Y( g1 o1 x, B
{/ k8 t# Q, _/ J# C+ @, {$ S
McASPRxReset(SOC_MCASP_0_CTRL_REGS); M1 u7 C3 J$ j+ ~9 h: ?: S
McASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */
" q8 {+ V. |! C4 e8 N4 rMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);/ B* {% G/ Y) Z- R. @
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */
) {, J# O7 B! @7 q0 z6 P7 O3 AMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
4 |) g, g. j& Y' e7 GMCASP_RX_MODE_DMA);5 A& n3 j" r+ l( }" V
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,2 H2 {' e8 f! F# M
MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */" M; s) l7 S2 |) Z+ T+ P1 @
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, 8 l5 H" A: n: F1 h$ w
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);) N3 y5 J1 r. s! r$ i+ {3 f8 P
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
2 p: r- [' ]% h$ x2 QMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */% Z: C( }4 l( I1 M' S
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);; I$ T# ~) H' | z1 c& V
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
) W/ j4 l9 B1 L0 r+ d. Z& YMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,+ z: B" c" h# p
0x00, 0xFF);
/* configure the clock for transmitter */6 L) o7 j' B2 i1 v4 n) w
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
! t6 g- V0 {4 A& {McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); . V- ?0 P8 n& {( J1 i* D7 v- t
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,1 _+ Q. F& k5 A3 G$ Q6 Q
0x00, 0xFF);+ g$ }2 a; q, N- B' j
0 L: Q% l+ c5 k% s/* Enable synchronization of RX and TX sections */
: t1 ^4 ^$ Z$ O; B. G0 M# {McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */; K R7 L5 f+ a0 T- R9 q0 z
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);/ W0 k% q5 b0 d
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*
/ A. l/ g$ |) M. p% e- u** Set the serializers, Currently only one serializer is set as
/ K* t$ ?! P5 D8 i/ k( j+ ~4 [** transmitter and one serializer as receiver.3 z+ G+ ?1 Y g
*/" @6 ^: } P- t! u* y
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);3 v6 M- `1 E" G& H2 O5 k
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*! w1 V! q- o% q5 E
** Configure the McASP pins 6 W/ H3 ?& x+ Y% D9 ^5 f: b
** Input - Frame Sync, Clock and Serializer Rx. r+ f+ s: G' B' l0 t* k/ U9 F
** Output - Serializer Tx is connected to the input of the codec
6 |5 F: ^5 C9 \+ H7 Z; v" V3 y*/
/ Y- ~0 P3 e) z u* h9 e3 t" aMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
5 q. ?: Q5 @# e% h F2 F* v+ iMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
! X1 b6 h7 I) }- H0 {* j5 A- _McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX. I8 T8 N. B2 c7 I, {% J
| MCASP_PIN_ACLKX w6 F" S. F: A" {; s
| MCASP_PIN_AHCLKX3 }; ~. T& [, j) q; ]; P# B
| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */1 P" x4 ~+ g7 `6 E$ Y* H7 O' g: R
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR + r/ X* o0 Q, t/ Y, R7 k8 U
| MCASP_TX_CLKFAIL
% J, u6 h" J: ?) E8 ?! R| MCASP_TX_SYNCERROR8 A" U4 [- I2 O
| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR ) n5 @5 a" B2 h5 J( [& ]$ x
| MCASP_RX_CLKFAIL, t8 x( Y, p( }0 B% O0 U
| MCASP_RX_SYNCERROR
$ L ]* g% w( N6 O$ H7 w( L| MCASP_RX_OVERRUN);
$ ~7 \; B5 V8 g& d A6 V}
static void I2SDataTxRxActivate(void)
. y( M( l2 W( ~# a% d{
. a6 ]* K. y n5 k* L' ^/* Start the clocks */
3 ^0 [6 P [9 L, c6 l* [( _) [McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
! x8 K6 y* }) @& R/ QMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */
* }: p: {+ K$ K) v. S# XEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,# _/ s0 O- L- i8 g: C8 N4 m9 P
EDMA3_TRIG_MODE_EVENT);+ }7 C# j0 ?+ M6 t3 D8 n
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, % C# E, F% J: T8 a# j
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */
1 G0 [7 n9 F1 w' l9 @McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);0 C V( L8 H2 z# a
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */, f, ?: z8 h; E1 g
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */
6 g5 |: I2 m0 r! l sMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);4 H) ]4 ~4 A& o& p- C3 R3 V
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
9 Q0 e; I, ^$ s) i5 X; F}
6 ^) t5 ^ T: b3 o
请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
5 h, ?& k/ }1 z5 Y6 j3 p
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |