嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,
# S! p2 }8 a; `4 [9 x3 `input mcasp_ahclkx,: `$ e- i- \# F' a
input mcasp_aclkx,
$ B) C) k" O, l8 zinput axr0,
: x0 {* i* x% O9 K3 ]
8 |% d4 Z4 Q k+ Moutput mcasp_afsr,! A/ ]$ k7 y1 e7 }$ q7 x! e; \
output mcasp_ahclkr,
7 b6 }( }7 Z# K P- h2 l0 [% Uoutput mcasp_aclkr,' t8 C, x7 N1 y( s& g
output axr1, `8 L- i" g/ m* D
assign mcasp_afsr = mcasp_afsx;
; ^) X" j9 S, X, V Hassign mcasp_aclkr = mcasp_aclkx;
3 `) O N3 X6 a2 ]assign mcasp_ahclkr = mcasp_ahclkx;
' K# X' l$ I" D- W6 Yassign axr1 = axr0;
2 A7 z% n6 d8 y8 C4 I* p3 S: V* F
4 Z' ^- y- n: r! g( M( |在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
' T" q* D4 \$ V& b# s( J( Ustatic void McASPI2SConfigure(void)3 ~( n2 J" R" e {4 P# \
{
$ Y. W4 q9 p4 {" f7 K% l; XMcASPRxReset(SOC_MCASP_0_CTRL_REGS);) r" U+ ^9 t7 ^
McASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */( f6 {; E1 _1 k+ g
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
" W$ d1 b2 x' J; Z7 }! z/ YMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */
" J% G4 E( P& P- d3 i0 dMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,0 q* p- ?7 e: p( ?4 k* y$ D9 z5 j
MCASP_RX_MODE_DMA);
5 w$ H1 t n$ R- ]5 A2 KMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,( R! l7 l* B3 `, d# Q6 r9 U0 ~
MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */
1 X, D$ Q2 m4 W8 Y; W4 ?McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
9 O" \. W: T9 r3 m: ]# s' jMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
. l3 R2 D) K) TMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, / h6 F* _: g. c' w+ G4 T/ j2 p7 I3 q
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */
2 H+ M/ x5 y* w; uMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);) c' ]. Y% {$ w3 ~
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
% D+ l- _& }+ U! D* @McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,: f7 l0 S1 W- T8 ?, l
0x00, 0xFF);
/* configure the clock for transmitter */
1 v4 w7 j* ]6 m- ^! Z. u# yMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);9 R3 o& F. a- _
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); 2 h& l0 Y; ~1 ?; E' y/ _
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
9 P A L/ k& t$ ?* e0x00, 0xFF);
% ~& j" S' L/ r( z( G: M) Z* B4 O$ n
/* Enable synchronization of RX and TX sections */
" X) w5 ?7 d. W6 s3 @; bMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */, j0 K! h/ z5 K
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);' p6 O7 g7 h1 U* P3 p
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*# g( m9 k9 y: a; F, b0 G
** Set the serializers, Currently only one serializer is set as
( L6 k) x; ?4 ]/ F, i# g** transmitter and one serializer as receiver./ b8 n4 N" l: L/ c n4 T3 M
*/8 l! L2 o# H' b, c) x
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
6 d+ B" v' e& F4 {+ {5 _McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*
% u- P# i$ r- V0 ^% U. p3 z** Configure the McASP pins 6 A! @6 v* \8 Y% Z
** Input - Frame Sync, Clock and Serializer Rx# E, k9 ]4 S% t. w
** Output - Serializer Tx is connected to the input of the codec . o6 `( h' S# a. H8 k0 Y* `
*/& s' ~/ J3 {, k
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);7 U& F" q: H/ w5 R3 C
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
; K4 E% _' e) @0 ?+ s5 p# RMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX$ S* n% `5 y f; B9 f" R4 E
| MCASP_PIN_ACLKX. n Y9 [0 K: p" c' O% i- q5 }
| MCASP_PIN_AHCLKX! m! Z7 N: K. T
| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */( x3 T. i* |+ {" X2 ?1 H8 x
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR 6 O) J' T+ j: m4 @* @- i; X
| MCASP_TX_CLKFAIL
8 W- `# @8 D0 M" `| MCASP_TX_SYNCERROR. M+ ]' p/ B' c1 \- A4 i
| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
0 h6 y- c& r4 q- I! h a- m| MCASP_RX_CLKFAIL# D. z8 S- Y. H4 q( }
| MCASP_RX_SYNCERROR
! \. g( I6 W# V) ^| MCASP_RX_OVERRUN);- ^5 i( ?0 `- {( G) G) e
}
static void I2SDataTxRxActivate(void)
2 S1 D- i. J( R) U{, F1 E1 ^- y' ]2 |: i
/* Start the clocks */# X; t4 x3 r& W7 c8 @
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);$ n% ^0 A x# T$ U: l+ n7 T# u
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */
( R: L5 T% r1 l( `; ]; \* UEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,: `* U# [2 P* q9 @/ r" V" H
EDMA3_TRIG_MODE_EVENT);7 U! ~& m5 U9 c% Q J0 R
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, 2 |5 Q7 h2 O$ S9 q
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */
6 A; r3 U6 r) p' NMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
; Z4 y2 C% [1 K, f' B9 XMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */1 |4 ?4 X" K' H
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */
! n$ w6 g+ r, A- N$ S5 ^ B4 i6 OMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);) X. T& i0 _* `$ R
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);/ V4 R% o8 T+ ^8 v0 k
}
4 z4 z" ?8 t! z" L
请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
, E* P, A% u' H4 n P! T" K
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |