嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,
6 `* j5 r4 T- D# Pinput mcasp_ahclkx,6 s) v( _1 w0 m! t2 z+ G
input mcasp_aclkx,) }- P2 y5 ~5 _6 S4 h
input axr0,5 B' ], l# \% C1 [& Y
+ n( [3 Y& W5 Q; Eoutput mcasp_afsr,0 _8 H$ H1 D1 J5 R7 T( [
output mcasp_ahclkr,
7 ^8 S% Q3 I6 W8 N" Moutput mcasp_aclkr,
- U# L8 n- f0 M u% }+ _output axr1,
( j1 n1 i/ U4 e. H- Z8 a3 R! [1 ~
assign mcasp_afsr = mcasp_afsx;
- L) y9 l* q8 M& k; Z: K8 z2 t2 Kassign mcasp_aclkr = mcasp_aclkx;- U2 t2 u/ O N- I# j. r
assign mcasp_ahclkr = mcasp_ahclkx;
! Q! L( J5 g6 m+ M/ M) Gassign axr1 = axr0;
i' M& A7 y5 ]8 P7 H3 i; c+ |( N# m. Q3 B' {
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
1 I% p# L4 _" Z" b3 y* g0 s
static void McASPI2SConfigure(void)
( h' R" ~& J3 v# s \" s. {9 A1 ~% |{; F" k/ k- ?! T5 ~
McASPRxReset(SOC_MCASP_0_CTRL_REGS);- x+ I) s" P# s5 m
McASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */# ^# N& n4 i1 Z4 U# U4 a0 I
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
0 ]- k' R3 ?5 X6 |! ^! A1 @5 UMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */
0 l$ K2 n x6 t' Z/ CMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,( ]# d* w0 |: N. H! ?
MCASP_RX_MODE_DMA);
5 L& a' {/ V4 p( gMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,& O" m) j( q6 t8 O
MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */; c8 K P7 Y" q0 \% W% M
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
2 c+ n& E# n3 ?, a) n, ^' [+ QMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);" c' s+ A4 p: c* M3 Q* w3 ^3 J5 W
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
" R6 U- W* c( j" j- uMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */
9 N7 E6 O9 M! T8 d+ v; LMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
' @( ~5 I: J) d% p7 [McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); 5 H% s8 W5 ^9 B+ K w7 Q
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
6 T5 J6 q1 }9 b0x00, 0xFF);
/* configure the clock for transmitter */
& d y9 c! L6 M9 C, g& m4 oMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
8 {: m: k3 E" l% A9 j% vMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
0 F8 O3 D7 j6 X& K. }+ YMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
: ^9 Y8 j: B7 W! \' F* @0x00, 0xFF);
& }, j8 B4 ^' D: O4 e4 K2 {6 J6 H9 b# Q9 ]1 y) b8 {# T
/* Enable synchronization of RX and TX sections */ & ~7 b) f7 r' H: e% |9 w
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */3 K8 {" v( `$ v+ e
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);% a' h' i2 i" O
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*2 J) c3 W9 ~1 @* |7 T) x+ ]0 R
** Set the serializers, Currently only one serializer is set as
6 K: ]2 `# e* j( w** transmitter and one serializer as receiver.5 n# j/ E7 @2 V# S, \, O! k
*/
6 w. z# D }+ ` {3 s5 W( IMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);& {/ H! c2 Q& w* t/ w8 K2 ~* W- X( [
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*; H# O' L ]* h: O0 I+ V
** Configure the McASP pins
* }! x1 L& }* v** Input - Frame Sync, Clock and Serializer Rx
+ G# n8 S% h( \: Z! S** Output - Serializer Tx is connected to the input of the codec
k3 ~ d0 \7 [+ H*/' x2 X, W; M' J# \: W8 W! d( Q/ ~
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);- {' [% y! x5 C8 H
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
! |; B R, m/ L) y! GMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX/ r0 Z/ f$ k3 z; l" R$ p
| MCASP_PIN_ACLKX3 s) Y& d# B" R' p/ z% V4 d: ]
| MCASP_PIN_AHCLKX5 E# k9 ~0 W' t! p& d
| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */* H/ Z4 Q) B6 ]) U, g
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR 0 i5 |1 p8 q1 R- j/ P0 d
| MCASP_TX_CLKFAIL ) g9 h+ i6 O' d
| MCASP_TX_SYNCERROR: w$ i9 a! r- r M; S4 l5 Y/ s. K
| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR 5 s; G# Y) n) L/ l {6 s
| MCASP_RX_CLKFAIL/ W/ v% E r$ i1 H, P
| MCASP_RX_SYNCERROR / `0 j* {! `6 k5 S- M( C8 m
| MCASP_RX_OVERRUN);9 d9 }9 E! |2 T- ?7 k- P
}
static void I2SDataTxRxActivate(void)# j( _! X1 A) Y
{
4 x z: h' g' o3 A+ `/* Start the clocks */2 g2 h# [ |7 E" c
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);9 n. W9 B% Y" N$ z; E! B5 X9 o9 {
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */
) j3 ^: u1 \, L; p- yEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
% f/ ^1 @0 Y4 m P& A* xEDMA3_TRIG_MODE_EVENT);/ `* }+ U9 c& |) Q/ w1 g- A$ X
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
& B+ a# @) I, D$ `3 MEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers *// ~ n$ k9 j* S% Y/ t# c* X
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
! ]) u" `8 m, u% V$ CMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */
K+ J9 G' G9 _5 [9 @4 O# {while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */
! M1 @6 n/ P1 D# P/ A, lMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);9 V5 W( [* I4 x5 m' q
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
) r: ~& [( f4 Y' W0 v5 T0 G}
4 v' G) |2 L( `5 }
请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
4 P! V+ E% ^$ M+ r& Y# I' m- B7 @% Q
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |