嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,3 v4 W7 L, f: i: |5 b
input mcasp_ahclkx,3 X* m+ ?% u0 }% t% Q3 f: A
input mcasp_aclkx,* c ?8 S8 K6 F$ ]; V5 L
input axr0,. ^/ S2 L* W- |9 J! m
2 q* S# f; Z: w0 Q' m! I
output mcasp_afsr,
3 l+ S, K8 |* F% v: }0 k3 E; Joutput mcasp_ahclkr,# q8 d4 [) W4 [. q) j+ n& T" n7 {
output mcasp_aclkr,
8 _* ^& {) c* |0 A. `output axr1,
8 j3 A1 Q3 j* J; h
assign mcasp_afsr = mcasp_afsx;: O" V5 T: Z4 L) G2 \ f& ^ E. w7 H
assign mcasp_aclkr = mcasp_aclkx;
; a' I* Q/ q( V+ A% [! F1 V- D7 K! Z# Massign mcasp_ahclkr = mcasp_ahclkx;: u9 @+ K, ^5 l& E, q/ P( H3 l
assign axr1 = axr0;
0 ]$ x) l8 B( C& u6 a
) l& p2 a; ]! Z+ Z3 J# U
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
& Z2 q* J3 ~# {
static void McASPI2SConfigure(void)! F, [+ e" V8 j8 L. c, Y6 `
{
4 B! v0 |3 _1 }8 Z" h1 m' nMcASPRxReset(SOC_MCASP_0_CTRL_REGS);6 c0 Y; P8 u# b4 S( Q% {' q
McASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */& ~& Y5 T$ _7 F! |
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
7 C2 O3 x/ a' q, m5 X4 xMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */
/ K8 B5 h2 A! [" T1 }$ {3 ZMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
* J- |7 C$ C8 iMCASP_RX_MODE_DMA);
2 I" N% S# V vMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,$ n* t, u3 i. \, x; q$ M( g
MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */
( y3 [0 C* b/ @6 m* o$ u3 fMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, ' x+ N6 s; Q+ t; a
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);" R2 N1 t4 Q& K1 Y0 s$ z+ y% n
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
$ f. @- h) U h3 l, T) XMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */
. `1 A. m1 N$ _4 c" |9 j! yMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);4 W- s# ?- w3 ?, k9 L( o( i
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); 2 D; G8 u( L% F( l3 Y1 H, e
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
8 n- A- D% I7 |8 \8 K3 J: q0 ?0x00, 0xFF);
/* configure the clock for transmitter */
7 Z* [( n3 x+ d0 O8 O1 Y+ lMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);) A/ Q# F3 p( i$ @
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); & X1 z5 ^. r. {! R1 D1 @
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
) n5 `: h( Z8 k+ K; f+ f3 c; F0x00, 0xFF);, d0 E' z: ?, H# b; G
6 a/ B2 ~3 G7 b$ j4 y
/* Enable synchronization of RX and TX sections */
3 A( u* k4 v& M5 |McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */9 J% e7 A r7 _! M
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
; m" e+ n0 I8 A9 L7 Z/ F: I0 U% \McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*. x6 l5 t- U& u& G9 v
** Set the serializers, Currently only one serializer is set as
7 H1 f; i0 ^2 |: c/ j** transmitter and one serializer as receiver.
" p9 n( v7 @0 u' u. ]4 u*/
6 R$ p2 T5 I# }, J, }McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
7 q- h. B; Q( \- c8 _4 z' [0 L( v7 U6 KMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*0 o& g9 d3 Z3 O0 S
** Configure the McASP pins 6 x6 \" E& @% Q$ n _3 X
** Input - Frame Sync, Clock and Serializer Rx
) T, A9 V4 e8 {** Output - Serializer Tx is connected to the input of the codec & q. u9 s2 e2 c3 N
*/+ w1 {6 u. t, W
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);! |8 a* X1 @* A9 n6 r9 K
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
) X7 X1 o/ h4 G* Y, UMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
9 l! j& ~- `8 }9 w( w| MCASP_PIN_ACLKX, ?4 H4 j# U* d$ p$ ] `' d _
| MCASP_PIN_AHCLKX
' y2 l7 U* F* H: w3 k: `+ g* C| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */
+ h5 a" B Y9 P0 S/ J: ^+ |McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR $ L0 y% Q# V5 V" [+ @, J2 i
| MCASP_TX_CLKFAIL
. E/ \0 D& i) x| MCASP_TX_SYNCERROR' \! N! U1 {9 `$ N
| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR ; h' G* K3 [, _" C
| MCASP_RX_CLKFAIL- O* x4 `. L5 |; n7 S
| MCASP_RX_SYNCERROR 7 u# r' i6 E- F% i+ g4 W
| MCASP_RX_OVERRUN);, P" `+ o1 g& ^& h1 f: n) i5 ~, Z
}
static void I2SDataTxRxActivate(void) i* q( D9 b! m
{
+ }" j/ { B. Z ~/* Start the clocks */# o8 b( X' @: v9 _, a
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
3 s9 h& K4 f- e2 Y5 PMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */
$ B6 A9 |+ g1 ^' B, E, P6 KEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,. a& A: M1 l! D9 ^
EDMA3_TRIG_MODE_EVENT);
- U1 {- z: x5 yEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, , d7 B4 x" V9 o, {
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */, T' o5 G% u, m/ N& G& b
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
" P4 I5 l! u M0 X% @( j. gMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */. ?! D7 s' j5 ~) h3 A6 n* x
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */8 c6 e$ d' Q& U& h* ~5 v2 y, @2 Z! |
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);6 K5 y! N2 c e/ {; C" }4 ^
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);6 u% F( B9 t5 h: V
}
* ~. V7 L: W; X v$ g% }
请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
E' L- D; t- g, h' f
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |