嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,! |' Q5 k7 J. |
input mcasp_ahclkx,
0 t' \ D. g" C4 l) J/ U' p1 uinput mcasp_aclkx,
- G0 r3 w; X$ sinput axr0,6 q" J% v7 J. K5 ?* W
+ o/ B- u8 [5 m5 y3 l7 }output mcasp_afsr, T2 N* u0 \$ f1 q
output mcasp_ahclkr,! ^& ]: n7 r" F9 s! A. x. t
output mcasp_aclkr,( F# O# x2 h7 ]) ?' H
output axr1,
3 ?9 n1 ~6 w# V8 p
assign mcasp_afsr = mcasp_afsx;
1 }. J+ S0 y5 \" N6 massign mcasp_aclkr = mcasp_aclkx;
9 ~+ ^, a% W' F$ U0 p3 v4 j& Q; |assign mcasp_ahclkr = mcasp_ahclkx;
3 u8 C) i9 V7 @3 jassign axr1 = axr0;
/ i/ m% e. {% m" @) r( q5 x7 i
5 w' R; |7 o; H
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
r( G& l- G$ r5 }* _! S
static void McASPI2SConfigure(void)
; u1 u3 F+ U* w{
6 R- e% A. T) SMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
$ Z' T7 W; e# }* H! _' d$ `1 uMcASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */
Y' L/ u* U- b* E5 w/ c: pMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);' h3 b: B1 ]$ L) s! b# P
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */
5 D) _0 C L; [% Z9 A6 X& A& _4 JMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,; `, C# }+ I6 T6 F* m G2 B
MCASP_RX_MODE_DMA);) [; M/ I" r V, ]. I- ^8 e
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,) a: y/ G( B+ j5 d6 K
MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */6 H, F$ W, o+ K) Q7 t( O
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
7 Y J7 X/ l8 e I2 AMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);7 i! M7 v3 |2 |; r7 ~" B1 r
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
: \2 T; l" y% q; a, l& q+ i. w, |MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */
7 Z5 {$ e- r6 J7 N. \: b1 xMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);/ j- |4 E7 B- \* n$ m y9 m+ H
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
% i# ^* o' Y1 lMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
' p9 B: G9 O3 j, k0 P0x00, 0xFF);
/* configure the clock for transmitter */
2 o% g7 l8 f& ~' ^( I' Y' fMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
8 p" C( f# I1 x- r2 yMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
3 ?! I1 Z. C" ^" N; t# I& IMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
0 ^$ S9 W7 n0 A O( p8 ~ x7 Q9 F$ U4 t0x00, 0xFF);2 L- j: Z, q9 ?
1 ^7 |' `/ q1 P2 k2 D0 @3 o' o1 \/* Enable synchronization of RX and TX sections */
* i1 w8 C2 z0 j! e% dMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */" Y- v0 O4 B" d1 [4 d
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);7 y9 T0 m( s- U5 Q6 S& g
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*# M# P0 |: W8 p3 n1 O
** Set the serializers, Currently only one serializer is set as; L5 k9 J6 m/ U. D
** transmitter and one serializer as receiver.
, F' b+ I. y3 c, a*/( d) U8 Z" X" i0 T
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
7 e# J% A5 n5 }McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*
( j" {2 f% g5 C6 f) s+ y** Configure the McASP pins : T# m* X! [3 ]" _# N
** Input - Frame Sync, Clock and Serializer Rx5 @* Z3 G( h- M* P/ H+ s
** Output - Serializer Tx is connected to the input of the codec : U' k5 y" i7 }6 i& }
*/# k9 u. W1 u- [, P+ X
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);0 d7 a& q) z7 f8 a5 f
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));% k! q( S6 n$ G
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
* J1 w7 ^9 ^8 z. Y3 M| MCASP_PIN_ACLKX
/ }% C' N& f3 C/ G0 i: n* r| MCASP_PIN_AHCLKX
# f4 @% t, T& I- r* {1 W8 r| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */1 D1 o6 S( Z6 @* L" y0 ?% u
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR , M$ [0 R& |: t0 d# [, [4 ]+ d
| MCASP_TX_CLKFAIL
3 C! p0 V; @- X& H+ Z| MCASP_TX_SYNCERROR
& ]0 R8 p9 L2 Q* i8 R! `' U| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
7 d) M* E- ?3 S( Q| MCASP_RX_CLKFAIL
9 |$ X$ ~9 o& k| MCASP_RX_SYNCERROR
# o/ ]* r# m s9 z% O( ?! D| MCASP_RX_OVERRUN);# W9 o5 b7 R' u5 }# _
}
static void I2SDataTxRxActivate(void)/ m" W4 O5 G. H% `# P) S% c' n
{
# ~2 T+ g. o: P* f" p/* Start the clocks */+ Z& c4 s% G5 H5 j0 V* G& y
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
, s8 q0 F" j( I. \* IMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */. w' ^- Q0 r+ R
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,6 D$ Y0 h1 W$ g$ n) N( U
EDMA3_TRIG_MODE_EVENT);
5 b3 k5 n0 Y7 W& }9 Q F e+ @5 YEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, 3 X8 W# b p; W+ Y! w& h
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */$ Q) x# P9 q4 J9 a
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
6 k+ ?. y' A' {# Y) k4 AMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */: t% {4 a6 N3 b) T* E
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */
, ^* g d. I! k$ B* `McASPRxEnable(SOC_MCASP_0_CTRL_REGS);# j9 f0 n1 R4 S9 K
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
) U/ p- k4 L" a2 `( I* i}
# P+ z+ C0 k: u# R
请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
7 i! {" y7 F# x# B. H
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |