嵌入式开发者社区

标题: MCASP自环配置。 [打印本页]

作者: wapdasta    时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,
: X6 q9 n1 Q. V3 Oinput mcasp_ahclkx,/ ?* d9 z9 W+ T) R- S
input mcasp_aclkx,
$ J3 N. x0 Y8 f/ Oinput axr0,
& w' x; {; T& y) o5 k) Y& e
6 N$ \6 B6 R* ~output mcasp_afsr,! n7 X: l9 {1 ~3 c0 ]( r3 n
output mcasp_ahclkr,
4 M& s# k( H, s: r& |# e2 Joutput mcasp_aclkr,! c  y5 X' |+ s+ l/ F) r* m9 A3 o" i8 T
output axr1,
" l/ ]+ ^6 U4 u
assign mcasp_afsr = mcasp_afsx;$ K0 I5 d' y$ e
assign mcasp_aclkr = mcasp_aclkx;
7 E* K$ S+ y+ |8 M: \assign mcasp_ahclkr = mcasp_ahclkx;, s2 ?/ i# @: r% h
assign axr1 = axr0;

4 w" K( N; @% r
4 T( Y6 x6 o* S" [+ T% W
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。

. [$ J( q0 B+ A' C8 o1 i# s5 e
static void McASPI2SConfigure(void)
. j! B. q8 f% r' T{
" q, X9 \& B9 ~3 |) a: w1 i  s; [McASPRxReset(SOC_MCASP_0_CTRL_REGS);
# b  k# V% u, [% N9 d! SMcASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */
5 H: z: p# Y8 `6 T- XMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
" B% g7 ^. \" _& I; ?3 iMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */
. L/ A8 b; F! u5 N9 G: @McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,  V0 B* b/ {% E4 a7 _' w$ M+ _
MCASP_RX_MODE_DMA);2 V% w: t7 N! q7 {+ }4 ~0 S3 o
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
( \3 ]2 ?6 [. |; ^$ HMCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */9 L$ f! J. i+ r6 D
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
. A9 [7 n+ E- j+ l" ^; {MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
& F8 Y" h7 K! yMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, * y) T6 {" w- Y: o: S# g, D
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */. v7 r$ D) g$ A  F* w% `: I) P
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);. Z4 t# ?  Q- D. }. ?" L
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); ! f8 P5 l# e+ t+ B, x
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,, c) _' I5 Y8 m& O. q
0x00, 0xFF);
/* configure the clock for transmitter */
  w2 @! f( @8 ?2 ~5 C! ~McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);: S6 ?) L% v0 V# \
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
+ B5 c5 \& i& g& E$ ZMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,* e5 G# p+ ?, u3 P
0x00, 0xFF);, c5 a- w. `1 B5 D* d
2 Z) g: t9 [( i0 O0 Z3 s
/* Enable synchronization of RX and TX sections */ 1 I% f. G2 m- l! {- {
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */# s1 C1 M1 r% |( Z$ I. d, T0 M
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);- N/ t) W1 K) G& |/ X: t; t
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*! a: I; `/ ]+ o+ ], T* S; r
** Set the serializers, Currently only one serializer is set as6 L$ P. m* Q/ p5 J4 O
** transmitter and one serializer as receiver.; W& p6 i* i) i5 E# A
*/* ?; V+ i2 }: L! O7 U
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
  U( @# ]$ y3 {McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*3 X( [. i9 a, s
** Configure the McASP pins
1 G' l3 m' Q" l** Input - Frame Sync, Clock and Serializer Rx. [2 D5 ~  G% A, O3 Q- }
** Output - Serializer Tx is connected to the input of the codec 4 \2 K. T- u6 m! O
*/
" e5 s0 ^. K! LMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);) D7 x1 k0 D4 q9 l0 ^; p! i/ U( e
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));# R. _8 Z$ Q+ g) \) h* _3 ~' `! |
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX: v  k/ v% M! S: h; Z* i" z/ e$ }5 K/ B
| MCASP_PIN_ACLKX
' I0 G1 P; T6 \5 v9 A| MCASP_PIN_AHCLKX; ?6 M# [, P* O& [" w
| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */
: b. x0 d0 R, s3 s6 NMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
' X- O: G% |8 |3 G| MCASP_TX_CLKFAIL
) b/ G& \& }. {  m( Z8 m. `| MCASP_TX_SYNCERROR
! x$ k+ r! j2 d$ e+ P| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR , F: w1 \# w& R& z( L: [! U/ m
| MCASP_RX_CLKFAIL* q+ y/ G" m$ K4 j' |0 L1 w
| MCASP_RX_SYNCERROR & B/ _; o1 T' F; F& u
| MCASP_RX_OVERRUN);7 R; |0 @8 W; w& ~( j* C3 S
}
static void I2SDataTxRxActivate(void)
, x8 y1 q6 a) L{
2 h$ t/ L& t% V% y; N/* Start the clocks */
+ e4 F1 E' B  I9 P: qMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
! \1 R: L* g3 x6 _* ~) S, y3 [- u" OMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */9 l& Z9 Y4 ~! `0 X$ d8 j: J4 P
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
. a! \% Q* ?) o9 M" X7 j: H, FEDMA3_TRIG_MODE_EVENT);
( X; L2 A8 O$ I" m6 ?EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
- y6 a4 ?9 ?! Q! H& ]EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers *// x# ^3 @- b3 L& T4 j4 E
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
. m' ^; Y. U3 W1 j1 S* z" }- B5 tMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */
" [) m9 O) L  C/ @# n9 K% b! W* Q9 o, bwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */
+ g: ]9 ~9 c) n4 B1 m3 QMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);
5 B. a& h: q7 RMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);, X' l7 C  t, l) H% }$ g3 h
}
' I" f2 _" Z7 n  u# K: E  z  a
请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.

# ?  S, O1 h; p' f( Y




欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) Powered by Discuz! X3.4