嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx, _" ? Z( Q! R
input mcasp_ahclkx,
( o" W- X8 S0 c( E& W c& |input mcasp_aclkx,2 R* q* G2 n& J) u6 C
input axr0,
8 M' v( x* a# z% A
( I, o0 Y8 U( d1 {* U' u' r% soutput mcasp_afsr,
0 q' _6 N5 v2 s% Youtput mcasp_ahclkr,
) h k9 F1 I, houtput mcasp_aclkr,- R; J0 |- e' B
output axr1,' W {/ i4 b: Z" v
assign mcasp_afsr = mcasp_afsx;
8 c) s _0 a5 _% e9 Q8 bassign mcasp_aclkr = mcasp_aclkx;* \9 _- l9 W! s2 T/ P8 d
assign mcasp_ahclkr = mcasp_ahclkx;
p6 L: M! u1 L/ ^3 L, B. sassign axr1 = axr0;
& Z. i( j7 G0 j( ^
1 P6 v! [/ m2 v [) F7 r! t& ^
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
) i7 y7 m3 z2 \
static void McASPI2SConfigure(void)
5 N, f8 H1 T+ w{: z; x0 K, |2 \: D5 E
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
- X. m# c( |% z; zMcASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */* r# @" ~1 I+ H
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);8 {! n$ Q" X( G8 V o. x4 R) m
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */ Y9 q7 \! S! R7 Y! u$ D# j
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
7 Z2 S! _* b( j- v: `- C3 XMCASP_RX_MODE_DMA);
0 r% [0 o8 C+ I6 w1 S5 b5 j: @McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,- [+ D6 B& Z5 a2 Z0 W F9 W
MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */
q+ X# J( k$ |) FMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
' x, z3 u4 ]$ u9 U, V1 ZMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
8 t" d$ Z1 Y- R, _7 {) aMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
$ I& ^! g+ K# g; BMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */# c* C# o9 j( S; Y1 ^" W. g
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
6 I, D; W) Z& M' T9 H/ \McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); & C1 x+ R% a/ q( O, P& e
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,9 }2 X+ ^6 ~ B. a) R
0x00, 0xFF);
/* configure the clock for transmitter */! Z9 u1 @2 M. R2 c# c
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
2 T# m3 J; m9 ^+ N4 w2 GMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); . D% n8 d- m- R) u
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32, S7 r) _ G) D" l( A
0x00, 0xFF);# o# t7 g4 v% E3 S; t. H
# F0 }: O+ m( W# Z4 W' A& [
/* Enable synchronization of RX and TX sections */ 5 U# C, z9 L7 Y% r8 ^4 E/ H
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */( O5 A+ `, y% J) b3 O8 l4 m/ e& t L
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);+ m% [5 F7 F7 D# E2 A" L) _
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*& _ ~! z+ ~% w( ^9 ?- ~" v
** Set the serializers, Currently only one serializer is set as
4 [" q( K+ F$ | r5 n" b* l/ g** transmitter and one serializer as receiver.
2 h% ^7 r7 t* n, R3 p/ {*/
% ^, d( Z+ U A N/ lMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);' H9 N: H% v% l" H* m% ]2 W" t
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*
* S( b6 ~ s: a- s** Configure the McASP pins
4 y5 ~- q6 V% Q* E) `** Input - Frame Sync, Clock and Serializer Rx
) I7 \1 [0 L/ }5 R** Output - Serializer Tx is connected to the input of the codec 4 J+ d4 Q+ P. z; _7 t% \
*/1 [$ N1 U9 i/ Q
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);/ |1 k5 v8 Q2 j" Q9 l5 L
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));+ R& i i; y. A
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
" X! `6 u$ I3 B: O| MCASP_PIN_ACLKX, d, d9 _* r9 E
| MCASP_PIN_AHCLKX
8 } y- ]6 I8 K, S- a* {| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */
" T+ s) J, Q8 r" ]McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR . Q F* D' w4 L2 F' m
| MCASP_TX_CLKFAIL , K( v+ h& U* x) h$ l! ?7 Y! r
| MCASP_TX_SYNCERROR
& y! H/ M' P. ?4 v) s, M: q| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
1 [$ p: n) I0 _| MCASP_RX_CLKFAIL
; V2 u+ E# f5 K" ]| MCASP_RX_SYNCERROR 1 @1 d( Z% E/ c; i
| MCASP_RX_OVERRUN);2 \* W) F" o+ d e
}
static void I2SDataTxRxActivate(void)) y6 ]; {6 `% z
{
- R* W8 u7 U* x, k ]/ B d/* Start the clocks */
. u! r8 ^# @9 }2 fMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);3 o' i4 i; c+ a4 y4 o8 U+ B9 G
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */9 L1 Z! I) Y" O- O' C
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,+ A Y( d3 p( {" n1 u
EDMA3_TRIG_MODE_EVENT);6 c! K! c- N5 ]
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
' t" A V4 l. C2 J, P& jEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */9 Q5 o, S. ?8 K! t! C, R# N5 Q$ ?
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
8 F6 `4 i) P" U8 pMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */
& T, g+ I) r' W& Vwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */" m G$ [) v( k, R; a
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);+ U* \0 w/ c( Y, s6 |8 V" A w
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);0 e! W+ v: }" v! Z r$ f
}
, M! Q4 _8 _" t& k5 A1 S8 h请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
* N5 h4 W$ s0 Z2 F
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |