嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,
& t# Y8 f5 m* G' v* Uinput mcasp_ahclkx,( D4 \9 U5 s0 m3 E2 ?3 P
input mcasp_aclkx,
, e* f" ~8 m* U5 O- L' }9 `input axr0,% o1 E( h; p q4 W: I1 }# G
4 k; U# T l; _0 h: _
output mcasp_afsr,/ S/ E" C; N5 h
output mcasp_ahclkr,
% F4 t6 c9 {/ o% J! ?! ^2 v7 xoutput mcasp_aclkr,* C: c% z3 W" W" {& H8 s5 K0 _7 `6 g p% {
output axr1,7 D1 k! Z3 B7 Y0 `; {4 }& `# K
assign mcasp_afsr = mcasp_afsx;
1 w) U/ {9 d/ d. {/ Vassign mcasp_aclkr = mcasp_aclkx;
, b9 I9 t9 Y7 g! Q( K* K, [assign mcasp_ahclkr = mcasp_ahclkx;+ c3 U6 [. ~/ P- B! ^+ h8 Q* r
assign axr1 = axr0;
2 F: R6 P( j( l4 }# @0 A8 H( I5 d' Y% {! k1 b- `% V$ \
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
8 i: ^$ C. L6 i5 v- `static void McASPI2SConfigure(void); m v1 f1 R# a* w; E
{5 A& P( n, D1 B
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
/ o. `# j7 `7 I2 }McASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */
- x% C% q; N" R+ [; G) ?/ ]' @! u. wMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
5 s y; D0 q5 CMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */: G' \: _+ G* t) O) U' G9 k
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
" p L/ D) ~! I$ [6 F6 YMCASP_RX_MODE_DMA);
3 B, V! T$ z9 u2 [3 Y( pMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,& U! p. g: { T8 G7 g6 Z
MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */
. a! R0 q0 F# D9 a8 oMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, 1 x. W9 R3 M" M+ M; W+ D
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
/ _# [( J/ i9 G# J+ x0 j' O) NMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
' o6 v. j/ h' A0 fMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */
& c7 a) V s( U, _, IMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);) i R8 y2 B F5 Q
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
( G c) L, ~7 ^' z; k# |3 Y$ K. CMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
( {* Q9 L% s: A0x00, 0xFF);
/* configure the clock for transmitter */7 f" I0 x# {6 p' _1 o: `6 b4 }) n* e# S0 S
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);$ | L* i( k1 D7 C
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); ! D' A4 K$ A8 e6 Z
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
* E# ?) `3 }3 H% F0 P0 P0x00, 0xFF);
1 T. E) {, m' s1 q0 f
! V I' v% C% }) y/* Enable synchronization of RX and TX sections */
5 c( _: O+ V0 X; i ?McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */
) A1 ^( D' f0 r+ ^) |McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
, E& e7 V9 o# ^8 rMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*2 r- s# F% s# m
** Set the serializers, Currently only one serializer is set as6 x, h# \: t$ p& I
** transmitter and one serializer as receiver./ M2 L) T5 M: K2 h& w
*/( `: p; y, ~ q
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
( G% G6 I8 i+ Y$ c) H. f; c1 E6 BMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*
9 n: \7 w, `8 f( D5 A2 h** Configure the McASP pins 0 `2 b6 f0 I+ ~ ~2 f% e$ W
** Input - Frame Sync, Clock and Serializer Rx Q b+ e y( U- T
** Output - Serializer Tx is connected to the input of the codec
& a9 I! a; T1 g5 r3 q( V x*/# f% {" F" h6 J- P
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);6 K; V |- G# |
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));% _# d5 w g: F
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX6 T" c8 |' `5 _1 s( |
| MCASP_PIN_ACLKX
d6 u; C7 t% `: E| MCASP_PIN_AHCLKX" s* d3 H& ?0 F
| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */6 e: x( W! k" A% @' e4 N7 P
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
2 f5 P" h/ V% W: `: h, [| MCASP_TX_CLKFAIL 2 x% c+ m. \2 S, T `) W
| MCASP_TX_SYNCERROR
" W! j5 t4 r2 ?" Q, U7 d# Z/ L$ b/ R| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
' a8 l1 `; Y0 f) S, T5 t, @| MCASP_RX_CLKFAIL
$ S K' a! S7 J2 t6 q. Q" k| MCASP_RX_SYNCERROR
& V U5 x( E6 _| MCASP_RX_OVERRUN);* c: [ W& |' v6 z: u$ Y4 b7 R( ?
}
static void I2SDataTxRxActivate(void)) u/ N) i8 N( t$ l
{: W8 Y" ^! X% ]: ?& y+ l. q0 b5 n( J
/* Start the clocks */
9 ~, k+ {7 D( {% e* e- `9 lMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);( }7 c; ?% q6 x; U' E+ l9 C9 L
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */% b% f5 E2 { x
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
$ }# K- O- {: T7 u2 TEDMA3_TRIG_MODE_EVENT);
# ` o8 u U# {6 r; \$ JEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, & ^! b( U2 Q5 S' N
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */
, f: P+ M h. p* IMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
h9 R; e) Z3 M' f1 k' |2 `7 x! ]McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */: i# S: l9 F0 l
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */
* J( N% a# B+ }. NMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);
( c% _+ ]# F( ZMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);( d' {: e. P( R. C4 a
}
9 z- W( b3 Y, E. Q' X5 Y: U3 U请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
3 G, u6 ?* n. _4 \5 ^
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |