嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,
( Q# X+ G& F8 O6 linput mcasp_ahclkx,2 G0 L: o' o; ^5 }. f& }7 t( J
input mcasp_aclkx,
c' l9 ~0 o8 O' ainput axr0,
! H4 }6 S! q: |! |; y/ I
8 d ^5 q* c: T/ Woutput mcasp_afsr, x3 U+ G3 x$ Q2 ?* U4 m/ T) V
output mcasp_ahclkr,
# }9 j) f' P. g0 D D% Loutput mcasp_aclkr," ^ V6 C9 X5 r$ ~& l: f$ I' f
output axr1,
/ m& N" l4 J. g7 O
assign mcasp_afsr = mcasp_afsx;. `* ` ]0 L; R
assign mcasp_aclkr = mcasp_aclkx;
# ]+ Q1 j# C g* a; M+ Aassign mcasp_ahclkr = mcasp_ahclkx;
5 b \$ @5 |) a) s7 l& }! @assign axr1 = axr0;
U2 L. Z! I) X& [! m# j
% ~) l1 Q( r) t3 W/ z
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
" h7 E3 j3 C! k' Y, ?' S) _static void McASPI2SConfigure(void)7 m% k; {+ N9 l6 f w3 F3 ]5 p1 E
{
, ~* ^/ g% @% O8 B! s; R7 XMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
9 ~/ P" K3 C) T! yMcASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */
- u: e \& L% Z# G- W9 `2 eMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
9 h S7 ]( T* x: Z) aMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */6 M! P F3 z, y [ W, E
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
: o) ]: K' @1 QMCASP_RX_MODE_DMA);9 c3 m3 Y2 l9 U9 u7 z
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
Q7 z k3 h% _" K/ L6 HMCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */
; G( d! _2 k" q- {' u" n0 `, dMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, & _8 r. ~3 Z2 _5 {! r) [
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);. I. K( | y/ g/ m6 b4 N- t7 H
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
7 D. Q0 u0 E& C+ @* F$ `% zMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */9 Y* t$ Q" C! W
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
2 b/ a& t" G4 X/ d+ [/ O5 t) E; RMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); " }) |5 x: u: X) y3 f
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,5 ]) N6 \, c6 H
0x00, 0xFF);
/* configure the clock for transmitter */ i3 S9 I) T1 _6 E5 C+ [
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
8 @2 @& X P- F' UMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
- @5 h! c: N% oMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,$ T# `1 {/ n; q0 c$ ~ P
0x00, 0xFF);* S9 }) e [( s+ v0 C
' ?- `" {7 b3 a/* Enable synchronization of RX and TX sections */
# k1 `. {- z0 s' n# w) iMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */( r4 B. L4 Z( K0 n/ f7 Y
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);! j4 f2 ]" ^: T" N9 C8 r: [2 h
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*
5 L1 K5 ]: u1 I3 a9 D# s** Set the serializers, Currently only one serializer is set as
# f( W0 S1 {7 q8 Y; V8 w; f* D8 r** transmitter and one serializer as receiver.
# ]0 G" r1 T/ T' v*/! I- }$ c5 K/ t* `: K4 C6 k6 y
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
5 h: @, w7 s5 \' v0 wMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*- }2 {* s% b2 W+ w
** Configure the McASP pins 7 C. m; ?9 V( f! J
** Input - Frame Sync, Clock and Serializer Rx
( \* A$ |) ?" \0 S+ I7 \! v6 S** Output - Serializer Tx is connected to the input of the codec
U/ o' G6 E" ]4 e: y1 ^ b*/
" z* Y: F1 [) q g& O, h t8 _McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
: t: ^) o# S! }- dMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
v p3 ^; ?) T$ ^; v4 \McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX2 }( L) r& [6 k* ?
| MCASP_PIN_ACLKX
/ ~3 T2 }1 B8 I5 `3 y| MCASP_PIN_AHCLKX
$ m/ S* S. B" b) j& }% ~9 L# b| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */
: [# f, t4 y8 f! u* QMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR # G9 q- x5 n$ [. w
| MCASP_TX_CLKFAIL 5 p4 F- B" m. T* l
| MCASP_TX_SYNCERROR0 _! d+ v/ s5 N$ I H
| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR / j; S0 c t4 g# x+ }) o5 K; S
| MCASP_RX_CLKFAIL
U6 B' ~* |, w6 k/ _6 w| MCASP_RX_SYNCERROR 2 Y3 S+ K, X9 T* q V I
| MCASP_RX_OVERRUN);
- O+ d5 {# y# j}
static void I2SDataTxRxActivate(void)8 r3 J/ V% ~5 x/ {7 z) P, ~/ B9 b+ \
{
* F4 N/ R$ S# k, j# ~+ K: _3 ]* s/* Start the clocks */% W, R7 I) F( a% E( w
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);- d M& @* p. G+ C# } Y% v3 k+ Z
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */1 ]: g3 a- m: j/ d" u: u
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,& C# W2 f) g8 n( Z2 t% J. r4 I
EDMA3_TRIG_MODE_EVENT);
! E( ?- }- s2 f( C3 C) `EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
6 o9 h6 H/ M" ]; s1 fEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */
. `; O. S4 E3 A, ?: u( TMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);/ O4 _- S( w) C3 K
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */! A, y# w" q* i- F" b- f: A, M. s
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */& y/ g0 B5 s7 _% k
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
- h3 l; V# O: B! A2 oMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);3 ~! e- n0 j8 @0 G" j, T
}
& ~+ ~4 m. g7 y$ E6 S J8 [
请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
& I( F, |* \% O' {: L1 ]( N: x
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |