嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,5 t: w; x- w( z% T& c
input mcasp_ahclkx,
4 a% S+ f: ^+ `input mcasp_aclkx,+ c. b, ]5 c6 l& u
input axr0,( a t. z5 H4 j. p& c+ z
( p- P# u& H( r5 I8 c
output mcasp_afsr,
) A% v( V( L( @# |/ V9 m5 O; O9 qoutput mcasp_ahclkr,
4 J8 c' o! _2 Aoutput mcasp_aclkr,- O2 Y+ `% i+ r$ `& W |% f' O
output axr1,
: I7 ~8 T- ?$ {: X
assign mcasp_afsr = mcasp_afsx;
6 E9 I0 m' o! {9 F, o j4 s4 ^assign mcasp_aclkr = mcasp_aclkx;5 T, e3 {, ~+ B7 M
assign mcasp_ahclkr = mcasp_ahclkx;
( L s* w6 {/ h$ H7 R( Passign axr1 = axr0;
" x! _8 q/ m3 q* w+ J
7 D1 q/ N+ t: [& J( E, d在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
1 G, M1 ]3 ]+ w2 D/ ?0 Z4 B$ q0 |static void McASPI2SConfigure(void); v9 V& N: R3 `
{
5 H# r" \* f4 a) kMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
/ ~) d% @0 T* H2 FMcASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */1 O! ]9 c# c! @ i8 z
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
; u7 M* ^1 t$ v4 U8 Q+ q/ lMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */3 _" n4 I5 l" Y# s3 o B ?/ z# k
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,- a* D6 T1 G& k& g( l. n/ r2 b8 n
MCASP_RX_MODE_DMA);
! \% T0 k5 p, v( ]" J% s! ~+ vMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,9 f& P& F0 g- x% X
MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */
0 {0 M- \, [4 z: ^McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
) U2 ?% t$ w4 e+ `) U4 r+ RMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);2 h: D7 d4 q! ~. Z" e7 k( B
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, 5 \8 d4 P, e8 z6 C# @% M( i! G
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */9 q m4 y" g8 p* T& Q5 C& w
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
) Z8 j+ F" b" y1 P5 K: HMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
. m2 ~* R5 `* oMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
- W: A/ Q1 W, b; G; Z0x00, 0xFF);
/* configure the clock for transmitter */
8 a" P6 g( w! P4 S+ b/ U6 DMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);3 L. w2 w# a* `2 a5 ^+ X d* v @
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); " H- J) y7 h( M5 x7 T+ O& Z
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
- c& A. Z/ Q* R. q) e0x00, 0xFF);
8 g& [7 K# [0 P2 a. I: T: U ]. @7 m
/* Enable synchronization of RX and TX sections */ / c2 ~/ I f0 ?0 f8 r
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */
3 O, T, }1 H6 mMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);3 y4 |0 U( q/ V: |2 Y
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*$ g4 A' E x$ S% V
** Set the serializers, Currently only one serializer is set as5 I: F& t$ a7 M
** transmitter and one serializer as receiver.
# h0 u9 n" H) K, k n*/
, Q/ [' X* q, ~& zMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
2 o/ k* E: X+ v8 Z5 ^4 i; mMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*
/ I8 _2 ]% r/ O: r** Configure the McASP pins 5 d" u H- N" I2 ]) L3 S
** Input - Frame Sync, Clock and Serializer Rx, c/ D: U% s& B8 C# `
** Output - Serializer Tx is connected to the input of the codec
9 ]: h2 [1 T [' K) ]0 |( ~$ p# F*/
; g0 g+ T6 H% U& e f" w; _0 AMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
: S3 Y$ m: w2 `McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));% K' {9 @* b: t3 j
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX3 L% c" N( o7 W: ^/ e- [
| MCASP_PIN_ACLKX
' l; w# [2 j6 m6 d| MCASP_PIN_AHCLKX! J( g/ {* f: y' X/ [8 a& L3 w
| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */
0 `' d7 {0 `$ E% C8 Y0 @McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR ) f* z/ Q, |. I9 I8 T
| MCASP_TX_CLKFAIL 2 p) I" h& c& i
| MCASP_TX_SYNCERROR3 C# N; l% ^: Q9 v/ h
| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR ' O* e9 P, H: ^" V) }
| MCASP_RX_CLKFAIL# O& X9 v6 z5 j) i* v6 V% j1 e
| MCASP_RX_SYNCERROR # f# X6 r, t2 I7 y
| MCASP_RX_OVERRUN);
. W2 F! f T6 ? g}
static void I2SDataTxRxActivate(void)
9 Z4 L3 I+ M' b/ q, h' F{
% i/ j" @# F+ Q1 @/* Start the clocks */
. ]+ x# K. k; F: N7 ZMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);" K( ?) b2 s3 F0 B! b) J
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */3 c& F8 B/ U4 g/ `3 [( Q m
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
4 U# t& q" D- l9 X4 wEDMA3_TRIG_MODE_EVENT);
# }$ ]/ s5 D7 }0 b7 VEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, 9 [; n5 g! [/ g$ k
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */
3 u$ _$ }/ h8 }/ P4 w) p# PMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
: X: Z; S" o- H+ H2 c& s, Z# ^' Q9 ZMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */8 [# Y* m% w5 E. K1 ? i# B
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */
s. u7 Q& |# Z& b" h) S5 wMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);+ w ]6 h: _: h2 {& F1 i$ P$ H# G% @
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);" B( U5 `' h7 G2 `( b2 z
}
% p9 |3 I- A8 ~6 j# ^; X
请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
^- X: A8 D! @3 `+ \2 j
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |