嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,! G' f3 C/ h5 J, k/ L
input mcasp_ahclkx,- Z9 a7 O! }9 w0 t9 Z2 D
input mcasp_aclkx,
2 s2 c- m1 s/ S. ?0 w3 ?input axr0,+ i5 V0 k! M3 t4 ^+ w) Y+ Y5 X
/ l; x; [; G( D4 h5 ~ xoutput mcasp_afsr,
, S1 z0 x* I9 Q5 S4 v" foutput mcasp_ahclkr,
, N& x3 ^7 e Z; w5 v& Voutput mcasp_aclkr,6 j1 e3 H$ _, V% X, P! a! F
output axr1,1 E. S2 w: g; X) @6 W
assign mcasp_afsr = mcasp_afsx;
1 k# V" u1 r0 t# o: `7 x/ iassign mcasp_aclkr = mcasp_aclkx;4 N4 X; z* R- U z% w- P, m T
assign mcasp_ahclkr = mcasp_ahclkx;
# g( K' r' M7 U( ~. {* b5 z' J% sassign axr1 = axr0;
6 M; |% n A( Z- ?" y% P
! n2 Y8 W# j0 X, v) e, J
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
, ]) \* ~& E3 ?. m& l" R
static void McASPI2SConfigure(void)8 X0 L: M [5 x5 {6 d7 O; W8 L
{
5 ^/ h) _& X0 |- R4 l9 HMcASPRxReset(SOC_MCASP_0_CTRL_REGS);2 x( J7 f3 i$ `* G7 T
McASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */
& \8 [+ b* ?! h- \, rMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);) f2 f6 _/ q, Q7 z' Z
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */
5 {; { k/ ^0 N5 h' d8 F" j3 NMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,, T8 c- C; G: ^6 v7 P8 E
MCASP_RX_MODE_DMA);, j! |" D w; G4 d+ l. c6 i
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
3 C$ }, B. N( m2 n) W& F4 I& `5 X7 PMCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */
* Z! g; U0 K+ U4 a4 ~9 K, k9 ~McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, 3 q: b1 @6 y4 h& L
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
/ b! ~! g% E* F. `4 k. G3 [McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, N. ]& o* k, l4 |' F3 R
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */
, M: {" x' D- s* k: [/ CMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
2 ]: M. `% [& X! u% P* I0 Q" KMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
! d0 t8 D# v- y: y3 pMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
* L, a% n+ W2 f* n* w5 \0x00, 0xFF);
/* configure the clock for transmitter */ u) j: L3 L# @! X
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
/ d8 b" ~" S+ \6 ZMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); 9 p- m) t$ U0 F; \- h* I7 B
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
4 l1 g8 U2 A+ l0x00, 0xFF);
8 {: L# {% V: u7 d" B
e( w" g& w$ W: |1 i+ I, K( X5 h/* Enable synchronization of RX and TX sections */
$ `% h, y7 K" F4 B) W; m6 pMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */" h6 E2 R# j# w1 g
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
3 B. \9 g# Y$ dMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*
, j: l2 e) o+ h** Set the serializers, Currently only one serializer is set as
( N; ~ M" P; e$ W# C- ~** transmitter and one serializer as receiver.
7 e, v3 Y A/ \*/$ g9 ^; w' H+ P1 j% `
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);' y# {/ o3 Z V
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*2 u6 R( q0 w+ o9 I( b" E4 H6 S0 i
** Configure the McASP pins
- R8 l, o r. `0 s6 D! {0 \9 I** Input - Frame Sync, Clock and Serializer Rx& |8 Z. Y# l! u* K6 e2 W
** Output - Serializer Tx is connected to the input of the codec , o0 F b$ J* P, u; n4 u5 p
*/
1 Y! l9 O, W6 j5 _! a E9 NMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
2 I6 {6 L' c3 l2 OMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
% T5 t5 P. m0 A7 m/ D1 iMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX8 L! ?9 j7 C$ B" t8 B
| MCASP_PIN_ACLKX
4 }9 x5 K0 m6 O6 D. z3 @' _# }| MCASP_PIN_AHCLKX
) q& \) b ~2 p9 x9 Y. Y| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */
1 P, J" l$ x& K9 T4 aMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
+ K t T _, A# g# d| MCASP_TX_CLKFAIL / H, c$ Q# S. _
| MCASP_TX_SYNCERROR
7 g* J+ }3 I1 y5 b6 m| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
p/ a+ {- E1 i0 [$ k; Y| MCASP_RX_CLKFAIL+ S E5 |9 F! h" ?! W. y
| MCASP_RX_SYNCERROR " n l+ |8 j7 k
| MCASP_RX_OVERRUN);
4 G" E% K# q) e}
static void I2SDataTxRxActivate(void)
# C& ]) `% L& D{
3 r" V k3 r7 |" V- y' y/* Start the clocks */9 ~$ y' D7 J6 D. P$ C
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);. I4 y( U8 G" c$ z: V
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */' y3 w$ e$ B2 K- N5 h2 ^
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,/ r" B" p3 T# O) ~
EDMA3_TRIG_MODE_EVENT);
7 F( s8 |! M, @- Q- _EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, ' _2 ]: [/ [& N# H( t0 t9 D
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */4 D/ i) G: I- E" ]# B( n
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
/ j# ^7 s A: s3 X4 fMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */
/ m# T& t. x" x$ C: o2 ]while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */0 C! w0 d+ e$ t6 M! C3 f& w' D
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);, N1 S) O u8 j
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);# a" r( f' t7 G0 k# N7 ?
}
; ~$ r5 L1 r% s) f9 v* H$ U请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
' M$ W/ u6 i2 b: ~% M# m K
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |