嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,/ \- J' _+ g- N! M$ z# T) x. ^. d9 R1 }
input mcasp_ahclkx,
- V3 w9 E) i1 l+ _* g* {input mcasp_aclkx,. I! V. ]: w$ O$ k3 c
input axr0,
7 h' c& d) `, u8 `$ u) h1 |5 [4 `, R; R& ?1 C
output mcasp_afsr,9 F) K5 z* X$ \9 N. D& }' E
output mcasp_ahclkr,$ J6 K* @0 Y* U) x5 b
output mcasp_aclkr,
! G/ j; p/ ^3 G) ]9 aoutput axr1,
9 F; d; `2 M; o* ?( y
assign mcasp_afsr = mcasp_afsx;
3 p. \$ e/ o; c9 m9 {assign mcasp_aclkr = mcasp_aclkx;$ L6 U9 Z" u$ r% Y5 ~% w
assign mcasp_ahclkr = mcasp_ahclkx;& g0 C/ h, P" t {# [# Y
assign axr1 = axr0;
( A+ v' X, ^) V$ t X0 C! M! I3 @
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
. N' @$ \" u7 M+ ^# n" ?
static void McASPI2SConfigure(void)
" m; y7 c1 R) V( v/ ]) a{9 w s' l& O5 \/ a, f
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
2 M) R. S! Q7 y7 ?McASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */. E& I% @8 V" v6 c/ h; J
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
1 ?, P% W& y/ l8 B7 o2 ` ?# K, r8 n+ GMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */( h) e1 q4 `5 i% X
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,' x7 ^9 x5 c; J7 D
MCASP_RX_MODE_DMA);
. d' f$ \; S+ g) a4 y- XMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,- v+ W( {& I+ W7 K1 Y/ P% s
MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */1 [# e4 h6 b% E0 H5 |( m
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
7 d; A& l2 B9 d- E5 H3 T+ HMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);/ L1 b" b5 h: M4 _( A" p' x$ j
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
3 j0 @! |0 l2 j- q5 I3 J3 rMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */
/ y- x) U1 j9 v, U! E3 JMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
+ I1 }' { H% Q; O; e* J: `McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
, \4 u' V. k4 t9 i: b* RMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
7 P1 L5 |; S" D+ p3 y0x00, 0xFF);
/* configure the clock for transmitter */* D" t- N& ?9 A+ S* G
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);4 w7 r, S; ?1 p4 J1 w8 l
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
* j2 t7 h7 p# |8 |/ xMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,6 w3 L# R& N2 U1 l* e2 |! |
0x00, 0xFF);7 I5 B- X) W& k* `* k
: T6 r% G; k" R: q% G3 a% y. c/* Enable synchronization of RX and TX sections */
1 k* {3 I4 s6 x7 \; M3 ]McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */
' U- m) R( \( k5 u) z3 \8 CMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
+ S; ?# T; w" R: K( W) CMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*4 `7 k$ \/ y( V2 N' ]6 X2 b* x
** Set the serializers, Currently only one serializer is set as
+ l4 y; I/ h* F( V- }** transmitter and one serializer as receiver.
+ _4 h9 v4 }# ]& F*/0 K! ^2 @& u r+ e! \
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);* @) z4 z4 q5 M! P7 I, I
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*
/ V! W. H' K' c, |" o** Configure the McASP pins
6 G! \7 k: X! J, M& u5 N1 R** Input - Frame Sync, Clock and Serializer Rx/ I' O$ D' K- S9 }
** Output - Serializer Tx is connected to the input of the codec . L( O. L9 Y: y6 M) T
*/
: \3 ~9 i8 K b$ u# GMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);0 _+ I2 ]6 p8 _* M+ b# _* q
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));$ ` w& G8 o C; Q5 `; T
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX7 m6 p0 H& i9 f; f _
| MCASP_PIN_ACLKX
7 p, q& k$ m* ^5 \5 K2 `; l+ B, T. E7 W| MCASP_PIN_AHCLKX
# V0 f( L* [5 \6 t; g| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */1 F/ ]2 l/ K6 h. x
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
9 `% \4 G& Y0 S2 T| MCASP_TX_CLKFAIL 1 F( E k6 Z+ f" ]$ y' k
| MCASP_TX_SYNCERROR* P0 @2 A( r" M% r' q0 e, P6 }
| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
3 i5 o- ~& g3 ~. T2 S9 a! Z| MCASP_RX_CLKFAIL
$ g! g2 |, p, i+ A| MCASP_RX_SYNCERROR
: c6 o# B' P O1 k1 z1 ?| MCASP_RX_OVERRUN);
7 P( `7 J& s- v& n* x0 {}
static void I2SDataTxRxActivate(void)
, z# l# S* [1 `, m! N1 D{
! Y; s! L" K; S* M5 o/* Start the clocks */. q5 b) u: ]! e9 f Z5 }3 \" _! \% h, D/ V
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);; G* M0 C7 k& o b2 T9 k j9 H2 j
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */
$ Z3 Y* T- j& I1 YEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
0 q9 j& F$ f, o7 s. AEDMA3_TRIG_MODE_EVENT);
% Q( S3 j7 S( EEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, 6 V9 t3 D2 K0 l" m
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */
4 U+ e |$ `/ d9 d0 O# DMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);) S- L- N/ Y+ D+ S8 l) w: U
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */
# v8 V* E5 X1 i6 ]7 g- B' m Wwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */
7 S. x$ ?8 c7 k7 B! YMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);1 I" l0 p) W* @$ \9 u
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);% Z7 N' R5 p) F; l( Y1 j+ _% a/ `
}
1 ~& Z) \& Y* K5 p' p! _! Q$ ~* Y
请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
, |3 s* @9 M# A& b* J2 Y
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |