嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,
4 h( x+ {& ?9 A) Finput mcasp_ahclkx,. h( `7 O/ I3 f0 s: O& k
input mcasp_aclkx,
9 p& ^+ I6 h& J, vinput axr0,
8 d# C3 L. M' f( U' x( e6 e
, h3 @, O3 f# Y e2 N) Boutput mcasp_afsr,( n5 N+ _7 r3 M* ~: j4 B9 ~8 E/ K
output mcasp_ahclkr,' b7 b+ E. D j7 P3 `
output mcasp_aclkr,
6 ?+ @( C8 }# c" w5 Poutput axr1,: j- _9 O _7 J3 V# l
assign mcasp_afsr = mcasp_afsx;
! U. W* f% K3 c+ ?/ cassign mcasp_aclkr = mcasp_aclkx;
% w" n; h2 X4 oassign mcasp_ahclkr = mcasp_ahclkx;% j; u9 z/ w2 h4 M
assign axr1 = axr0;
& G7 |, n/ R4 d4 t* S
8 {, x7 t, [9 l2 {, @& }在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
, E, C* u# X) v; Ystatic void McASPI2SConfigure(void)
( C, q- Y! P- u0 ~{
0 b- d; Y2 h& }/ b8 O9 [" l5 M* E' oMcASPRxReset(SOC_MCASP_0_CTRL_REGS);' N+ h4 X5 Z# U
McASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */3 y* J. ] b3 m% {- W- C8 s1 I* H
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
6 q2 b3 [/ J# y, f& K8 nMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */
! `- [/ y$ j% {) L$ \" ^McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,) T9 c) o T$ ~$ @9 O2 f4 i
MCASP_RX_MODE_DMA);6 w/ S) V2 ~) S9 V' y8 R
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
' i# V$ n& h2 R% M* n9 s$ I1 G5 }MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */( O" K. ^- y- C: P% b' J: l- s; V
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
6 I. j8 [7 S" mMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);. l5 J8 x- i. I
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, + f; W, _, Y/ i; ]9 S( h' n
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */
3 @$ m2 T( E. f K; `, v% y/ J$ aMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);: O; i! |2 N5 C4 F; k5 n
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); ) u- N6 |- _/ d( f. Y$ a
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
* ?! F7 n2 G; Q1 ~% H- E+ `5 R6 x0x00, 0xFF);
/* configure the clock for transmitter */
1 E* ]/ H" k% |McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1); s1 k: y, [4 v N! V
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
# G4 ?: y! ^+ Q" AMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
$ N) w s I E3 K0x00, 0xFF);
: O( D: ^! t3 D) q& `' |+ z/ g l. q. q& [4 U* ]8 a% }* j/ c3 o
/* Enable synchronization of RX and TX sections */
9 _" m' ^* e0 D/ _& bMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */
& x5 _3 T0 o* u& S/ PMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);7 Y' n! B l: p/ i
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*( ]9 v5 ~8 ]6 h4 L, W8 X2 F
** Set the serializers, Currently only one serializer is set as
3 @7 X' v" J% v `* b** transmitter and one serializer as receiver.4 N: U/ `* L6 A3 D
*/8 f/ q' T2 c1 E$ ^- G0 b
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
( n0 y6 y# X( |0 E3 TMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/* R! Q) T8 D* S( Y! c5 n% ^; J
** Configure the McASP pins
/ K+ p' x" W( C# `! Y3 u** Input - Frame Sync, Clock and Serializer Rx
6 Y4 |1 n( R% B# \4 q** Output - Serializer Tx is connected to the input of the codec
9 u0 b3 I) w1 D*/+ D( Q7 g6 P: t/ D$ J' @4 n
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);. s# i, e$ J/ Q$ x; @
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
8 f& r8 j$ d' q6 U* P/ tMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
' T& L3 F N) q( d! \) N| MCASP_PIN_ACLKX/ E% n7 w$ q2 C! h' H6 ?' m! G
| MCASP_PIN_AHCLKX8 L* i, q) t# a
| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */
) M/ g: o* [/ [: }) AMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
& Q! ?# d/ h( {3 P" d| MCASP_TX_CLKFAIL % _/ D+ n2 l' @( n& c0 w% [
| MCASP_TX_SYNCERROR5 k: ^. O. ^3 J v3 |- p1 G
| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
* q2 p# m( B( O/ Z: b! O| MCASP_RX_CLKFAIL J {* k; |- x
| MCASP_RX_SYNCERROR
/ {+ R. m }# W4 |1 i* x| MCASP_RX_OVERRUN);0 y3 a4 o2 F. z8 x; \# @
}
static void I2SDataTxRxActivate(void)
8 q$ {7 J0 @1 {$ |9 X{4 x5 {2 f- ^' d
/* Start the clocks */8 j$ m9 H8 ~: Y. [/ j* Z
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);; O$ y O% T; \ b; \* E
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */
3 H% F' `' h2 G4 DEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
6 d/ S* m/ s0 F$ N* ~% L# GEDMA3_TRIG_MODE_EVENT); V' o' \% u& c
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, ! N3 I& q, y' t! Y0 f
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */
) {$ X2 E3 A( R) C6 {2 VMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
( e: X1 P, I% ?McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */
( |( s2 ?" w6 u7 bwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */
# |& A' w- N) O: @. \McASPRxEnable(SOC_MCASP_0_CTRL_REGS);$ t6 r6 r7 k' X
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
# X9 U& _& m8 E0 n- M2 P7 j}
- O( x* C a+ r: e) m' m6 ?9 R请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
' ^1 u5 A. l* K/ K y3 `7 f5 m
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |