嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,
5 f6 E6 J; |8 L0 sinput mcasp_ahclkx," h+ ]" Z6 n- G$ A0 M( g7 q
input mcasp_aclkx,
) P9 |) O' S7 V# w6 j0 Kinput axr0,
" t. o2 \" [. P7 Z$ ?
2 P; S* {1 Q# b( m0 O0 j: F! n" moutput mcasp_afsr,4 B9 N U) I* b9 G4 o: i5 ^
output mcasp_ahclkr,
/ \3 S' ^1 M) s: }- `4 R+ s9 M9 Aoutput mcasp_aclkr,
, T% S# a. X! F* Routput axr1,- o4 a# Y) o- R, N1 l2 v' z
assign mcasp_afsr = mcasp_afsx;) {1 ?/ m7 b; O) I s! }
assign mcasp_aclkr = mcasp_aclkx;5 W1 ~+ W; q: o, w; |: r/ x
assign mcasp_ahclkr = mcasp_ahclkx;7 h- ~1 L. a; R
assign axr1 = axr0;
; X0 l! c' C6 |9 j* Q- i; M6 b& J* i( h& I
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
2 q z3 g6 c0 ?6 S" j& q# ?
static void McASPI2SConfigure(void)
! P% W7 z+ X7 n4 @0 U! v' s{( K0 [2 t+ I' O/ T: J1 Y ^
McASPRxReset(SOC_MCASP_0_CTRL_REGS);) U5 @/ a: D/ L" m9 S
McASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */
3 _' ]7 I0 Q7 z( \6 XMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
3 L1 p' ]' U# ^: P( XMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */0 d3 \) ^0 f% b, z/ P* s) O; v1 M* H& S
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
* ?8 V* h, N- ~" TMCASP_RX_MODE_DMA);' S8 `) W( F: s2 x( x, d
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,2 d# D1 d4 |( [" x) ?
MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */0 i! y+ ^/ u* Z6 y8 x# G6 Q
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
- T7 ]# `; w# {% Q+ U# v: dMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);! d- d- K4 t2 K2 E
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
# a) B7 j4 I" r/ U+ J) s& p# ^MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */: |+ V; [( P6 Q& N; w
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
0 F5 @. J, G9 l9 BMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
8 m; ?) P6 S- BMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
' C5 @& G+ ?4 p8 Q% ?0x00, 0xFF);
/* configure the clock for transmitter */
; W/ U$ ~4 ?) n: A! N) W: h- TMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);) e6 ?0 F$ N. Y6 ]8 E0 a
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
) {" Q( Q& u8 AMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
3 K: k8 x, X1 o3 j- g0x00, 0xFF);; j3 v9 P) j% X4 L8 v
8 X- Y2 B R+ S$ {8 O; z
/* Enable synchronization of RX and TX sections */ ; Z' b3 x5 _9 W0 a
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */9 F& @8 n, u& j! x. Q2 U! q3 e
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
" a X/ c$ h4 o, }McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/* P! S$ H$ h4 P* _% \' c* x
** Set the serializers, Currently only one serializer is set as; Q8 F8 K; M' G/ \" d2 Y+ N, A
** transmitter and one serializer as receiver.7 W5 l# o2 w4 x
*/
& F0 ^* ^3 @6 x6 f* rMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
! p A) S/ M4 y* O- u, jMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*
( Y+ d4 q* S$ h/ q/ |6 q! C- a** Configure the McASP pins & _/ K5 M# `+ X3 O
** Input - Frame Sync, Clock and Serializer Rx' @0 o4 R n/ d' z! H# q, ~
** Output - Serializer Tx is connected to the input of the codec
. Y- | m2 d6 N*/
$ I9 v1 X5 {/ T& h. U; \McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
0 f$ y- \+ V% E5 |+ J* kMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
f' a2 B7 _- w7 C8 @: wMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX* U8 E0 o; `2 g, Z
| MCASP_PIN_ACLKX
- i7 [4 O9 @0 H4 R| MCASP_PIN_AHCLKX1 l! W) p- E1 r- z8 R* u! S9 c
| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */
0 i. I) z+ a* @+ j# HMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
. F0 M" l: K* s) x X z| MCASP_TX_CLKFAIL ; S# R- V t6 S; ^# T
| MCASP_TX_SYNCERROR
4 j9 }" G& Z# o| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR 2 S& [# O& R7 `5 |) s
| MCASP_RX_CLKFAIL/ d( I' }$ P2 ]+ H% L1 _4 k2 J
| MCASP_RX_SYNCERROR
) t- F. ~3 ]+ K* `+ @; `0 y| MCASP_RX_OVERRUN);
9 G2 P$ {# b- g. u* t1 w}
static void I2SDataTxRxActivate(void)
' y4 d1 ?; O. K9 S, M) }2 V2 z$ L{* b5 H' {* I9 A2 Y! Y: i5 B& C
/* Start the clocks */
* ^! h* P, M+ qMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);9 a S. `( i7 a" V# o
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */
, w8 Y: a- x& EEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
9 |8 P, r- f2 T$ g* y) AEDMA3_TRIG_MODE_EVENT);( Z5 ]$ c& p6 |* ]9 R2 o% @1 r& r
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, 8 H' a6 w( C4 U( ]
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */
" `$ \' A) i8 Q% V/ _4 ?% e/ ZMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);6 I6 I1 z9 @% t% |" ?
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */
9 x8 b4 K8 P: i! q& hwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */* D/ @ K" `( s" n9 `" M
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);% z% m# _1 n; {! A2 I* F
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);! O' K0 [, m: |: g1 j) @3 h
}
$ X! i5 c( e4 r4 w% K+ O6 a! ]5 e j1 h
请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
' n5 P' Z8 o$ B9 G) _8 q7 S
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |