嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,
" h) }0 ?: Z3 P7 d- O- Tinput mcasp_ahclkx,, J3 R, }: Z# l4 I# v0 w
input mcasp_aclkx,
% }9 n& I9 y4 t# k4 G' ]input axr0,
# u" k, d3 \5 ^ a" p
; K) n2 b( f$ g1 J0 D# n0 Foutput mcasp_afsr,$ E5 k3 P1 p5 F* D' \. K/ B2 n
output mcasp_ahclkr,3 I1 F4 L( c$ T/ _" ]
output mcasp_aclkr,
. Q6 S# a7 H% \+ Toutput axr1,
: O8 g2 }8 o2 y+ \$ ]; C/ v; I
assign mcasp_afsr = mcasp_afsx;
. ~& H' b' B: O9 e, passign mcasp_aclkr = mcasp_aclkx;
$ a$ `" G" {9 J, Dassign mcasp_ahclkr = mcasp_ahclkx;) y) j+ \: B- H, x, i. m7 l, r) X* q
assign axr1 = axr0;
0 ^/ d" B( d' W. z6 `7 u$ j) o9 w8 o- u
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
( A: P# m- _% M& i8 tstatic void McASPI2SConfigure(void)
. t( U3 a1 m2 N' y{: J" b4 p: v) V l! W* D" p
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
# H7 { Q5 \0 \, K0 T( e' yMcASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */+ |- j( u& | F. p. _6 e" D t+ C
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
( y% L/ |) G3 eMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */1 E1 H \6 h1 q1 v. h2 C# ?# _
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,* z& ^" U: @3 L, r
MCASP_RX_MODE_DMA);0 E0 n5 k- V* t: @, W
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,9 C; [: B4 g9 i5 D9 l! W6 b
MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */6 H& A- b! s0 q8 z) t# X! ^8 [
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
! G4 t, R* R' \3 _( S: \( kMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);5 W5 W |( r ~
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, - C+ L( n, z# { q7 ~8 E
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */
; d3 n& O6 C" |- w8 SMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);8 y! d4 _4 C( t0 N/ b8 H6 M
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); 6 e: s2 O' u6 B
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,# s5 o$ ]$ M6 ?$ Y& q! b. u' U3 R: C+ q
0x00, 0xFF);
/* configure the clock for transmitter */
0 u/ a9 ^1 F u9 J% PMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
5 x0 [# u$ t2 g K' D; yMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); * } `% x1 {& Z0 R- Y% }
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
6 |% y- S, L4 U+ u# S7 f0x00, 0xFF);
; b3 k( m7 J6 y D) P( u& M
! l8 z& x* x+ v' X/* Enable synchronization of RX and TX sections */ & c6 y7 {9 T* a
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */
* f! d! U) `( f1 lMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);' i* i, P( n1 ? p/ P- z
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*
5 P3 O8 O6 G$ G! [** Set the serializers, Currently only one serializer is set as
# T% g: i( O; [** transmitter and one serializer as receiver.
: }$ a2 U3 D1 H, ^*/3 g! \/ p! U* E" k
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX); n% a: R# i! c$ z( }3 I
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*2 S; ~* S/ H8 ]$ f- Y; w" D* o
** Configure the McASP pins 8 ?: l0 ?/ b% K$ V- O: |/ j9 t" D
** Input - Frame Sync, Clock and Serializer Rx, ~8 |+ a& P$ ]2 z
** Output - Serializer Tx is connected to the input of the codec 4 V# {" c, b8 t+ F
*/
9 c* W1 `9 z& @1 O% ]6 ZMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);9 j: [* V6 ^0 v- \2 f3 z
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
* b9 n" X2 [+ {4 m/ A4 yMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX1 L( a8 k2 M! f, p
| MCASP_PIN_ACLKX
* |$ [3 C; g1 a" d! r| MCASP_PIN_AHCLKX
0 h8 q& h/ K0 [* P! E& V+ }# I+ ]| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */
3 O7 Q# j2 v7 J* OMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
3 s' r3 k2 X$ [+ S8 F( b% c| MCASP_TX_CLKFAIL * X8 j0 a" H: d# u# l0 l+ b
| MCASP_TX_SYNCERROR
N( B( F8 R& u| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
7 q7 s6 `2 q1 W# Y+ C3 ?| MCASP_RX_CLKFAIL& n- l; q! G, V' y) U
| MCASP_RX_SYNCERROR
9 j( a% L) O7 c5 [| MCASP_RX_OVERRUN);
& l! ~7 ] W' J}
static void I2SDataTxRxActivate(void)
9 e8 P- K) X) `9 e. E{
* L! s6 G- O$ |6 K1 B! D/* Start the clocks */
3 E( t- s5 m3 y$ e0 rMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);6 B4 i8 {0 \3 S( O
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */$ i+ k9 Y- e; A2 H+ K# `5 _$ Q
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,! w% _! m- |( [5 x
EDMA3_TRIG_MODE_EVENT);
0 n6 H8 M; ?6 U" N k& JEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, , o3 {# Q$ G9 T$ U( e& \" e4 V6 o
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */
) c! H/ C4 d+ U) Z/ h6 e4 hMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
8 U: T/ o' F# [/ k+ hMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */. K* r# Z3 a! K7 z% i
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */2 Z3 E9 _1 z# y/ I& L# Z
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);' ]2 k+ O; m# n" K* E6 F' u
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);! M/ ^! \! e. j
}
6 |8 e. }+ d* m1 R; p请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
+ t+ S, l8 X! s) L; c/ E7 m8 c
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |