嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx," U6 k# Z7 R% i$ i# P- t
input mcasp_ahclkx,
- w X, b7 g. |* Z5 |input mcasp_aclkx,+ Y8 N2 _6 ~: B% \: N8 N0 I
input axr0,
' ?6 v" ?3 L2 x) U2 M9 I
$ A0 L, c: T/ v9 a, t" l% W5 Xoutput mcasp_afsr,! ?6 k1 R# O- j& l1 @9 V3 j- K
output mcasp_ahclkr,5 w# X$ L/ s& a" w7 d1 K
output mcasp_aclkr,
7 h! j3 w8 R. `4 a3 Y! ?output axr1,% g* Q4 x: R1 w ?# B
assign mcasp_afsr = mcasp_afsx;
# ?! E+ V! u) u; g" o2 M5 fassign mcasp_aclkr = mcasp_aclkx;! c; q9 C* }. D6 E
assign mcasp_ahclkr = mcasp_ahclkx;
& Z) y' T; X7 {! iassign axr1 = axr0;
: L& _, t* a$ ~8 Y/ Q* \
; U- I# U" l: v- t9 D& T在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
, |! n7 m5 U5 e$ c5 q% U
static void McASPI2SConfigure(void): v' I+ L c, `
{
8 d% l1 p: [) v, ]$ pMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
$ ]" _2 N! K( d3 I+ aMcASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */
7 }& H7 e0 ^5 MMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
* D: k* X2 j" N4 e lMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */
& ?5 Y5 q- E8 W4 m( Z& u- r; AMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,4 i7 O: N: f l0 S+ ~ L
MCASP_RX_MODE_DMA);
, l: X0 `$ A' {7 Z! uMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,1 S. D- ^' c( g+ e+ s" J) r5 t0 U
MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */. b+ d- w# `% n
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, 4 Z9 b8 V( [ v" c0 j
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);( P p' f9 v5 m! O4 H
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, - }- J# V/ |1 C. U6 x$ }9 G) f
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */ K$ C; w) O" {1 x! `4 c0 s
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0); U7 v+ w% P/ b+ Z
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
( j- o8 e8 j: C' O2 U( k+ }7 g% @McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,: l8 e. W i- C0 g+ w8 ^
0x00, 0xFF);
/* configure the clock for transmitter */
( a7 C* e( i1 D7 z. S; }$ {: DMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
2 u, z0 x/ b ]) yMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); ! Z# Q, x$ V) R' y7 ]2 Q! r8 g
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,% O' \3 q8 V$ Q- S
0x00, 0xFF);
8 M- U# }* q4 J9 }; n- M" l/ ]6 _9 {+ _; V
/* Enable synchronization of RX and TX sections */ + L+ q& } {" t7 i8 B: K
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */, t+ ?- r! o# q
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);' I1 p6 s4 s2 i" l: A3 x, M
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*) l& I% I7 ?. a
** Set the serializers, Currently only one serializer is set as+ Y4 m8 H* G6 d. |5 u
** transmitter and one serializer as receiver.. t1 s4 b5 c5 T: Q a) T3 Z. K
*/5 A- A$ S6 {3 R0 P
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);1 C. u; g! m3 Z) c2 ]: ~
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*
- L8 w0 x4 Q1 W) U** Configure the McASP pins
/ T' L# T. W- I** Input - Frame Sync, Clock and Serializer Rx
$ h8 C ?' \; L& i/ p) V; s** Output - Serializer Tx is connected to the input of the codec : L1 A! _' Z2 l. G2 P. C
*/4 u% Q5 e: e) h# T6 G
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);/ N/ P; | a9 y4 g$ Q/ u
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
" }5 H6 Y" _5 I! p/ o$ c$ zMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
2 p. D" V. F. b. P| MCASP_PIN_ACLKX
- F" a# P# K0 V7 V/ e6 u# K| MCASP_PIN_AHCLKX
2 \* p9 K2 B, J( m$ Q| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */
6 H s7 E! X8 K9 K2 N6 M5 y) i; OMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR 0 Z1 \) q6 h* v0 s
| MCASP_TX_CLKFAIL
( A! a- V$ v4 e' {| MCASP_TX_SYNCERROR
& T3 }) ?7 t$ G8 t+ k| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR ' _- u* |# |+ A& s( a
| MCASP_RX_CLKFAIL# x4 U. B+ ?' l8 x( K3 h1 m
| MCASP_RX_SYNCERROR 5 S# G7 {4 Q Q8 }
| MCASP_RX_OVERRUN);% o1 A2 I, S5 ^! I: F
}
static void I2SDataTxRxActivate(void)' x9 Q5 F4 s" M' e+ }
{* {: ] g7 T+ W7 i; Z3 K" t
/* Start the clocks */0 e7 e% Z, k! w
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);' M( l: ]; a$ ?4 t7 Q
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */0 L/ E% K7 E. O+ A
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
, |! w' D C- `' p' ]9 e& SEDMA3_TRIG_MODE_EVENT);1 r' n( u4 \! o
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
. y# K9 _, R. B% t8 x+ ?& \* S2 R6 AEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */
6 s! m% d- E4 q% FMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);5 D7 g7 r* \, Z3 Y/ w& L
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */3 i* f2 l; \6 S
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */$ M- E' q, e1 ^2 H+ n R- T
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
, j7 J0 q+ h* z" v' _7 K AMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);& { x( l9 W# O2 q" z4 a
}
" q( o5 m( U' M# F
请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
* M( s! c5 [" b' m
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |