嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,# m3 Y n1 \; p6 ?& ]
input mcasp_ahclkx,3 C6 D2 @$ K; m1 D# [1 I
input mcasp_aclkx,
8 y4 d9 x5 s7 rinput axr0,
5 S2 d6 @2 L5 R# ^5 Q4 f, u3 u4 a$ x+ R" X; u
output mcasp_afsr,6 d1 r4 z# A9 p8 h) y
output mcasp_ahclkr,
+ \, e# t' S" ]output mcasp_aclkr,
. J( F. p. I: {1 s2 foutput axr1,
% u2 A+ I, `( ?$ H% T
assign mcasp_afsr = mcasp_afsx;
4 s/ `5 N/ @& h2 ^; e# F+ a! ?0 Oassign mcasp_aclkr = mcasp_aclkx;
: m, D5 }1 {, y, T8 Uassign mcasp_ahclkr = mcasp_ahclkx;
: U& M* ^3 K8 Q0 y2 f; q0 V7 j+ Fassign axr1 = axr0;
% \6 B5 P5 Y( {7 m$ D0 u* ^, O2 S- w t, [
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
6 v! A8 D2 c ^" G Ustatic void McASPI2SConfigure(void)! K0 S9 ?0 p t# ~# i0 n
{6 ?( X1 P+ e% J% g9 j* B* i* z
McASPRxReset(SOC_MCASP_0_CTRL_REGS);/ h$ M* V0 e8 j. S0 T
McASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */
, Q; B9 u+ t2 I ^5 [! zMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
* T; ^# w- m: `* H1 U+ Z4 X2 {! ~McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */6 j) ^' W0 C2 K+ r/ F. w
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
$ k/ @# V4 N6 M8 o4 `MCASP_RX_MODE_DMA);- S* x% |( c+ o$ A3 c. \# M
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,7 z, c- ^. C7 y" p8 [
MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */, ]0 v6 c+ J4 x0 P( w$ |/ n1 J
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, , ]6 b* \8 g8 J5 r" i
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);( Y0 l# `2 x. ]
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
$ l* G; Q" _+ rMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */- T1 v( t0 x5 L6 g$ S( i# f. @
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);3 ?2 |* I' R8 l
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); ) k. R8 N* R" D! [( m$ [0 E% d3 E
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,8 [5 }4 t2 G* R8 M8 y
0x00, 0xFF);
/* configure the clock for transmitter */0 K- Z1 v1 S8 G. A
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
! x4 W* R# F6 v: \& ^McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); 4 F3 K7 o0 O* s: V
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,4 U8 c: ~7 u- I. c
0x00, 0xFF);
8 ^$ g) t1 ]/ A" ^% B+ c% P8 L5 o' B0 Y+ f6 Z; f2 N
/* Enable synchronization of RX and TX sections */
" Z. z, ^0 `: l$ ]McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */
" y, B+ L( Y" |- {McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);( f1 d2 U+ I' J- x9 j1 `% y
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*
( J; e W) e; w& T** Set the serializers, Currently only one serializer is set as
# m& f! y6 J1 f/ p" ]5 l( k** transmitter and one serializer as receiver.
1 C8 k' C* ~' d*/
, Q' }" n5 X0 m' ~+ W7 zMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);+ e( z3 X# E. U ?5 A
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*
2 K& J& `; }- [# S. b** Configure the McASP pins " r& ]' o8 x3 I& {6 P6 F' l
** Input - Frame Sync, Clock and Serializer Rx) W( M/ {$ l* u8 I
** Output - Serializer Tx is connected to the input of the codec 5 T( V. ^' ~/ b6 M
*// l2 }# ^6 T: Z
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
0 s& e5 c! l5 MMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));# K- [6 S& P p7 i* b" X+ Z7 c, q
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
3 S3 z- b6 j- k0 U, m$ @- @* @, q' r| MCASP_PIN_ACLKX
$ J* z% n/ ?+ t| MCASP_PIN_AHCLKX
. F8 _" [' A* C3 E| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */0 R7 {0 U0 s" z4 x
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR 7 L5 V+ n% g* h9 v6 E: z
| MCASP_TX_CLKFAIL + ~/ `4 q Q. _8 g9 B
| MCASP_TX_SYNCERROR
. E0 ]2 r' M+ U| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR # D# }' |& C9 k7 q0 {8 W
| MCASP_RX_CLKFAIL
7 v4 O0 h# M: K' ~: N/ K$ F| MCASP_RX_SYNCERROR
! U1 c2 j. o. o+ B| MCASP_RX_OVERRUN); ]4 E$ Q2 f% t/ m# X0 g
}
static void I2SDataTxRxActivate(void)3 L) B4 E5 B% E
{# |5 N* R9 C* T6 m3 u8 G
/* Start the clocks */2 S7 ^, b9 M% @8 ?! x
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);! V" s; v$ j8 N5 S2 v
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */
) r7 t# C6 r5 ^. U5 o5 X1 zEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
; ]8 B+ {5 x" |, W2 rEDMA3_TRIG_MODE_EVENT);
1 Y/ `8 A R3 H8 x8 k) REDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
0 i+ M: `0 H# A- W% F/ pEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */
7 y$ ~/ U- Z) D& O* L1 e2 ~McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);2 k( |# o9 y; b( u. ?7 t5 m2 }- ~
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */
; y% f- | ]1 a6 `7 g8 f" u, u9 w' @while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */
& Q, n% X4 z$ {McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
; ^$ x' u" c0 B, D$ zMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);
4 i+ E! {* x; g5 E. R' x}
0 m4 ~. f* l! E$ t3 R, s
请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
( C0 l+ Z' {. n/ i
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |