嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,; E! U- f3 V1 i3 ^9 @- ?
input mcasp_ahclkx,
9 D& _5 H" Z. T0 U7 M$ F9 U1 A' [input mcasp_aclkx,( e6 E/ R) m& F, `
input axr0,; |& r) S! s( j! ], r0 E1 @
" N( I& v3 I% m$ f* a
output mcasp_afsr,, H: i4 K: L- {0 F
output mcasp_ahclkr,6 h- _) }, }5 o+ L' t: W- y, h! e
output mcasp_aclkr,
$ k [+ x2 ~: R/ L) d2 Loutput axr1,
$ C5 x5 G( o! {0 E
assign mcasp_afsr = mcasp_afsx;6 d; T$ P$ S' i6 g$ _: ~$ D' R
assign mcasp_aclkr = mcasp_aclkx;; S( d9 B9 t3 Y& G$ F0 I0 D
assign mcasp_ahclkr = mcasp_ahclkx;7 h$ U: M, b5 W1 \: g
assign axr1 = axr0;
9 ]6 O9 w: Z6 |. B2 S+ P" Q
V s4 [) q- O! Z- H/ d/ ^) z
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
. z* x1 w4 O4 H; Qstatic void McASPI2SConfigure(void)
/ d i s7 e5 L' c# \{
! F1 J9 s( m2 C" e# IMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
4 Y1 y( V* M) e9 S# p) eMcASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */7 W- c6 j4 L. U+ v" {3 _5 `* k
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);; v6 {, F, v% E3 K: L" u# d) u- U1 Y
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */
( u, D$ l9 H$ Q' A, P+ lMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
3 I, z, Y ` ], r& {! U* U; Y- HMCASP_RX_MODE_DMA);
4 S1 I* }* X: nMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE, P7 ^' u, P7 p# q) }) C
MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */) [' B' I& `9 I2 i& T; }0 i5 }: }
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, / M6 e* n+ |, m' I; M* b$ e- S
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);3 h8 R- b4 d0 n; C& d4 x* x
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
! c2 \9 D( p+ M* e0 T$ h9 DMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */% e; w5 h0 p1 G8 b* d9 D
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);2 ~0 o7 @- z4 w- n4 |
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); * t. k1 v5 P3 z" ]' J1 Y
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32, H5 @. [( A+ d+ } A
0x00, 0xFF);
/* configure the clock for transmitter */
9 Z- Y3 f. m/ p( Y9 `McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
2 ]4 I) D, N) V4 w% y8 d6 Y. ^McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
& x3 u, ?* [7 x# {$ i4 d7 y$ c/ zMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,5 p8 P# W& d4 i0 [9 K2 x
0x00, 0xFF);0 n! H) e* x( [, T7 X; `
& X+ j7 u& S2 `
/* Enable synchronization of RX and TX sections */
; b' g' |& z$ j: RMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */
0 R' l- R+ V8 dMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);* k# q+ H% z9 u
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*
2 i3 r& m/ @) g! I2 X, Q! C- X6 k** Set the serializers, Currently only one serializer is set as2 w: I# m7 d' U( t6 s4 }( t
** transmitter and one serializer as receiver.
3 T- G4 c. {; v S) a3 R% v1 Y- U*/" Z, `2 M8 y. }: d2 b8 ^/ j6 O
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);/ j: ~5 z3 `- X x" z: n
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*" H8 A) {) ~5 \8 n) n1 u7 l9 F6 @
** Configure the McASP pins 7 [/ ]' E% w( |4 u( e5 P
** Input - Frame Sync, Clock and Serializer Rx0 B1 _- d" G: p, U
** Output - Serializer Tx is connected to the input of the codec 6 n7 @% X) j& L7 C
*/
3 [: k( b% H V8 K5 vMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
b7 ^, S4 k8 F! e& YMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));) `' K; }/ }9 w; C
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
; E. I C8 I# `: I) u# H4 ^/ [| MCASP_PIN_ACLKX$ x% t% z. g3 F& Z2 o" ^6 f9 W
| MCASP_PIN_AHCLKX3 f2 s0 g2 M5 C! y# b
| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */
8 ^: h1 A% u8 uMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR 5 w' Z! L1 |+ j6 @! u8 a1 T
| MCASP_TX_CLKFAIL
3 x3 I3 X( ^" P6 k| MCASP_TX_SYNCERROR
/ M1 m- j* n# w6 i( [| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR R% C. t1 K! `% z
| MCASP_RX_CLKFAIL
3 q. ^8 Z- P+ p| MCASP_RX_SYNCERROR
% Y' z' I6 \* e( T| MCASP_RX_OVERRUN);
, r9 J7 f5 S+ e) M* V$ x7 J K}
static void I2SDataTxRxActivate(void)( c0 U N7 W. l' J# U4 u
{, R: i& t) Q) V9 s) D5 O
/* Start the clocks */
2 s7 G6 K; _. K, v6 [9 aMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
p h7 t" k- G* c. i. n1 u( F! X: PMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */5 J& d3 _* b& o
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,/ [/ b# B* j$ h
EDMA3_TRIG_MODE_EVENT);/ |7 f/ E+ `; t9 J: T
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, - U8 C& L0 ]6 E! ~8 C4 c/ X
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */
: r+ ^) c2 A3 H+ Q9 Q9 ~. \McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
: e4 J! ~. d0 E, H; |5 ]; @McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */
, ^+ J- r& s+ Iwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */! _& o6 J! _9 {/ f/ x1 f+ q
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
+ u. x1 u1 r, fMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);3 V8 B+ _1 T" Y$ k- Z
}
4 Q! f& l9 l8 h& ]9 O
请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
$ D2 [4 j' ~6 G% Z
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |