嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,* a8 i0 Q6 G l( _1 o5 g- B% h
input mcasp_ahclkx,: K, N) b; ] M8 Q- U; c3 m
input mcasp_aclkx,
6 z1 g' s& h9 Oinput axr0,& ~& K+ H$ w3 I: r
) F( k2 `/ L0 Z- a# b% t
output mcasp_afsr,
8 p! b3 C4 {- n$ i2 ^7 G8 w( ~output mcasp_ahclkr,
% k) G& Q: _/ M3 X1 E Loutput mcasp_aclkr,$ [3 s3 u, L- U
output axr1,# W! L6 P( U! \$ A2 X$ c
assign mcasp_afsr = mcasp_afsx;
) \* s9 k$ b* @" \4 |2 f; q! xassign mcasp_aclkr = mcasp_aclkx;
0 A( \$ ^& _( V0 L* Wassign mcasp_ahclkr = mcasp_ahclkx;
7 S& h( u6 b& m/ I4 ^7 D$ ^: hassign axr1 = axr0;
0 [5 B3 M! L/ M4 O
# m+ O# n9 j- q& j5 ?在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
+ i8 R* i/ B- I# f, f T
static void McASPI2SConfigure(void); P5 M) D7 T, {2 C$ n
{, l7 o3 k9 V+ s
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
C; ^ f4 Z6 B* gMcASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */$ t8 o' e' ~$ z' L
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
& i( E# Q7 T! o. Q( k* G$ vMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */
) q) l* _- T& |' z3 z4 h" TMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,/ s* p0 d4 O6 F# ^9 \& B' U( j
MCASP_RX_MODE_DMA);# f# a# X9 Q0 k1 i6 m+ A
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,1 g' \+ V. Z, W. P' ~( d
MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */
1 M7 c7 Z0 f* C$ o4 hMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
4 O4 R/ H: t% x s- o! Z5 z" W# JMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);! |, `# Q/ Y3 ]) v
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
_! D; _6 x, aMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */
; p! G# B. _# q+ ^McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
+ `7 _/ n( D$ p2 qMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); * H k% L& M0 a; q* }
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32, t. V8 m& v, F; s' t& |9 B* F! o
0x00, 0xFF);
/* configure the clock for transmitter */
4 f7 y: @% s/ r0 a3 P% u! OMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
9 d3 ~! Q' L9 _1 l1 t3 BMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); * F$ S, p0 e9 u4 L& K' @
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32, D/ w- l9 r ?& W- u! x
0x00, 0xFF);
. A/ m. c' P1 J6 f
# P5 f3 ]* W5 ~& g, e# ]$ T. r. H/* Enable synchronization of RX and TX sections */ 2 F4 G l2 U7 s) t' P1 j/ l" C
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */8 g% R) w N6 {* I2 z+ l" k
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);. R" l) d4 X/ s' N; q7 m7 r% v' l
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*
. R4 l- t6 V# t2 M$ u** Set the serializers, Currently only one serializer is set as
4 X, u6 S3 a) Y( x8 N8 D** transmitter and one serializer as receiver.
* Y' @/ K8 s- X( K3 @*/
e" @, l. J$ f% k, qMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);* P" b; T& q3 D1 H
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*
6 \2 v' U" v e9 H** Configure the McASP pins
9 e' r) a& G. G3 a8 G: _: O** Input - Frame Sync, Clock and Serializer Rx
# J. K# o2 a8 V, v( z** Output - Serializer Tx is connected to the input of the codec ' e3 q5 Z* |4 k0 O, y2 U
*/' Q8 G9 X8 Z- e( R* p3 f- k
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
) t4 z! _, r. j3 j; X8 BMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));; ]8 s k* g; r! K, K
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
& D! b' `; U% o! U3 N| MCASP_PIN_ACLKX2 p& T+ e! C2 i }' i
| MCASP_PIN_AHCLKX
' A) b. n: Z# s- w! U+ s* u" Y }| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */
3 `. \- Q9 O4 M; p; J& mMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
2 h5 m! M# t- p# R. S1 F& J% E; O6 E| MCASP_TX_CLKFAIL
8 t& d) _0 {. h| MCASP_TX_SYNCERROR/ h3 a/ I' o2 k! z) ~4 d U9 A7 D
| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
! a$ r" T& R# _- M| MCASP_RX_CLKFAIL
6 G- ^7 f9 h4 e& }| MCASP_RX_SYNCERROR ( e0 O& E' o6 w( Z( O
| MCASP_RX_OVERRUN);
% T/ r0 r" [; J}
static void I2SDataTxRxActivate(void)* F& ]4 L% L1 P; v% Y( \, Y* b
{
- f8 E5 c' b# M9 I! E: a! e1 g/* Start the clocks */* |( H# y2 l) {9 y ^
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
8 i8 ?# i" f; q8 lMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */
" h" E2 @, W0 u! A4 y2 O* J$ ZEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,6 v, r# J6 [, \. B/ D, T0 _
EDMA3_TRIG_MODE_EVENT);: x9 e) D+ R; r8 |: F6 [! ?
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
+ |) j' J) ?# Q. }. u, S5 [9 AEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */
3 A3 ^3 v, _3 m# jMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
/ {, N+ o2 q6 P/ U2 o) rMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */
: {: p/ _2 J1 @4 x2 Q3 pwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */" X1 j5 p0 O: |/ ]4 i) a" \; ~* ?
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
8 G, ]+ o; w7 D' cMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);
7 V: _4 U6 A" b/ `! t}
. P# d* o7 z( _- C
请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
3 Z3 y) O( c; n, Y: Y
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |