嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,2 ~7 @; O) H+ J# g0 i# [
input mcasp_ahclkx,: X8 ]! u5 u A7 Y' I0 ?- h
input mcasp_aclkx,, _# Q J& R; N& j- V8 K# T( b
input axr0,
' a9 D( V% K4 u5 e ^' z: ~0 z2 j7 F3 J
output mcasp_afsr,) ^: l# _' w8 s6 A
output mcasp_ahclkr,
, N# z+ L% q4 j5 a( x4 b" foutput mcasp_aclkr,
+ Q2 k" V7 ]* h& [output axr1,; e. p# {; r$ ]1 f9 b# i# g
assign mcasp_afsr = mcasp_afsx;0 T9 u$ R# S; U. `1 w# ~6 P
assign mcasp_aclkr = mcasp_aclkx;
) j i, ^- F+ v* f) massign mcasp_ahclkr = mcasp_ahclkx;9 t8 [0 F/ U5 n& D L6 q& R
assign axr1 = axr0;
3 P \6 o6 D& c* [; Z
% [$ q% M; }% {4 j. D5 N' e8 v
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
* K4 \3 C! ]* V2 u0 G
static void McASPI2SConfigure(void)+ X8 K& D. S( O3 q
{
' h) _9 t- i" B1 J/ fMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
8 l9 }7 f' m( hMcASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */1 k# Z0 R. ?7 G! J) K
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
1 q' |3 V! [8 x* h* O1 ~McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */
. G/ Y1 W8 z2 {+ LMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,: f. f" i: m4 R4 i1 m! q* X5 D
MCASP_RX_MODE_DMA);( H" b9 f a" ]: _' {3 t
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,. M# v+ k- z' a8 L8 S. |& u! ?! ~
MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */
. z. ^, k/ N+ m8 ` k2 bMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
3 k: B* Y' M/ g0 |MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
( A9 N1 Z: A, v. g4 hMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
, o+ C! f/ V( |+ b$ BMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */* Z6 f, P6 } }, Z8 F8 Q$ p2 k
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
; p2 b7 M: M2 y4 ?McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
0 i2 _9 c; i; T1 `McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
/ {% j+ c8 Q: s. U4 c: H' c0x00, 0xFF);
/* configure the clock for transmitter */- o, u: s2 E C$ q) ~/ r$ N
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);: N, b n7 s, K; X! a3 @% l
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); 4 n; ~$ F( l- U* ^5 u0 X' W+ z
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
1 w. L. ~6 |/ u$ M& R; o- ]# c: l0x00, 0xFF);% [/ \8 d* g. y! q+ o' W
, r' C. o9 G6 f2 u: F5 g/ Q/* Enable synchronization of RX and TX sections */ / O8 x! ?6 \& X x# S* G
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */, l$ t- V! m- D. j
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
, U8 `- \. A) [' M5 E0 |* DMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*
3 N+ x0 y6 T+ t! g) G# h) t( @# C% n** Set the serializers, Currently only one serializer is set as& j& T& d( t; w t
** transmitter and one serializer as receiver.
( s+ J1 I: X) g) r5 Z$ E*/8 K2 H8 A/ ~( J& B B
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
% X3 k* [7 L1 P, QMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*
5 G8 h1 m. F* `( |1 D3 `3 c/ l9 X** Configure the McASP pins
" M4 ]* V8 u& _** Input - Frame Sync, Clock and Serializer Rx
y4 e9 [; r! b) ~' }/ n** Output - Serializer Tx is connected to the input of the codec
) R/ @2 M$ {& Q# W& H6 B*/
- D4 p( e- F0 n5 k3 q# d7 EMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
; Y- W* [5 t4 G$ A ~; _McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
4 K+ q6 j/ \! P* L4 z, N9 r. ]McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX& Y9 L# c! x* B0 ]7 H
| MCASP_PIN_ACLKX. @. b- K. e4 z0 C
| MCASP_PIN_AHCLKX, ^6 P9 N4 y$ M
| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */2 x: u3 X. i" R5 a3 \2 R* @4 @
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR $ s- y! o6 Y* t+ u6 p* |
| MCASP_TX_CLKFAIL
! X+ ]. Q" D. N* w) z# z/ s| MCASP_TX_SYNCERROR9 T! K0 r/ k! Y5 K) d. P8 _
| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
3 t4 i* o& x/ a- X& A0 ]| MCASP_RX_CLKFAIL
+ Q. b( }8 D$ j0 p- F| MCASP_RX_SYNCERROR
n! Q7 s0 G+ e1 n: [5 ]3 Z| MCASP_RX_OVERRUN);. l2 K9 l/ t" X3 y% M8 X4 U2 N
}
static void I2SDataTxRxActivate(void)" e+ o8 ^# n% K) X1 t% B
{
6 v# \6 S3 \8 d+ D f/* Start the clocks */
: R8 U' ?$ S! o5 s. A |) \McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
/ h5 p+ I% ~% WMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */+ x+ T& @$ _3 m$ y# P3 P
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,0 B8 v4 }' j$ X, U3 `5 I
EDMA3_TRIG_MODE_EVENT);
6 D! J$ s5 p @) Y( REDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
6 h& h/ X5 j. E! X7 ?EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */
" V0 y y, {0 ~' tMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
5 t) |! D5 U, ]7 X' ?4 r# uMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */
7 t* H: Z% _# d2 q- A* ~while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */" }) ]! Y+ Z& n% w( }
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
1 K+ o* A4 {' v" T1 p% S& ~) R5 h5 PMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);
! T9 G8 ~6 H9 m7 J}
& j% Q! R7 A3 i) B7 p; h请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
7 V+ }9 S7 L! u( D: W
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |