嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,
' K. Q" J% {' v/ }5 Ainput mcasp_ahclkx,
4 x' L6 i7 B. E" N) [+ xinput mcasp_aclkx,
- n3 c" k0 }2 ]4 ^4 E. pinput axr0,+ E5 ]! |( p' u: b
1 U) P }5 V a/ T9 i: i) soutput mcasp_afsr,3 x/ q n) | J( d& Q% n
output mcasp_ahclkr,
4 z7 Z0 P+ }" N$ h; T5 x5 goutput mcasp_aclkr,) b4 o% ^6 J& P# T9 V6 K' C# G& G
output axr1,5 z# F0 X3 F1 H! |
assign mcasp_afsr = mcasp_afsx;2 c2 J; x. R& B$ e" u+ A3 f
assign mcasp_aclkr = mcasp_aclkx;7 [3 i7 I* X4 `
assign mcasp_ahclkr = mcasp_ahclkx;
2 a6 S* ]+ s; @- `4 Massign axr1 = axr0;
7 L: b/ u/ u1 G% `+ ~' B" J* ~( H5 E. a# Z5 g2 _* W
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
' _( y; m* {/ u% r/ q; V
static void McASPI2SConfigure(void). _2 w3 a, i4 N0 [4 ?
{0 }- F C# c0 }- Z# H( \0 E
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
S; ^2 M8 @) O7 E7 l7 }4 ?+ B1 JMcASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */. h. q- H" j) b0 X9 G
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);, p" Z' h1 Q7 C
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */
; z5 f, p K v0 a% I7 S% k \McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,3 Z0 @5 ~* S+ h) r5 n2 c
MCASP_RX_MODE_DMA);6 a/ M2 R0 W; I& [; c5 C6 R& |
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
5 Q4 m! m( G( ]3 @, XMCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */
! `6 Q5 b" X9 N$ t# XMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
: W* V* B2 F7 W0 Q: Q$ l# KMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
8 ^6 J4 Q# x' c/ J. @( ?McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, 4 W1 h) U- [/ b1 J+ A3 d
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */& b1 X3 |& a# h8 F [1 z
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);/ k, T k9 s% g9 f
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
, h. a0 W; h% }5 v/ a3 LMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,$ Q# K9 z' D2 R/ N; _7 ]. e
0x00, 0xFF);
/* configure the clock for transmitter */3 t' u" O, Z) U3 r" f) e( s' q
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);/ d8 t z1 Q2 f1 Q' }
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
( Y3 z6 t, O: j* e+ x$ KMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,) ^- @8 r3 [; O% J7 G; R8 \4 M
0x00, 0xFF);
% y& C j0 [( G6 q7 q
0 p6 v6 m; b* X2 K) A) |9 m5 O/* Enable synchronization of RX and TX sections */
* \7 N9 I! C7 |; B( cMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */
& `5 p5 [& K4 d6 S' ?McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
4 b7 e9 }8 R/ E% I) _3 d/ E6 fMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*
% H8 x' ]* C& ~# [% \** Set the serializers, Currently only one serializer is set as Y8 k9 V4 O" { ?2 V# n
** transmitter and one serializer as receiver.8 ~8 s( D3 [3 D1 ~, b# E
*/$ Q9 N0 U/ o& v( `
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
4 b1 \! ]- T; ?: bMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*5 u* w5 {8 {' J! V
** Configure the McASP pins
: p7 e! y1 o+ w' l+ K8 X6 |( G** Input - Frame Sync, Clock and Serializer Rx9 r' L4 X4 E4 O0 u: x
** Output - Serializer Tx is connected to the input of the codec 4 d, W3 T3 |9 ` }& }5 A/ Q
*/9 c- \& J* V$ C3 B
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
$ ~0 W$ z& \# t* X. yMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));2 a: ^8 B7 j$ D; y1 n1 p8 y
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
- y W5 t+ V! y& m2 U' `% ~| MCASP_PIN_ACLKX
9 \. K2 D5 z d| MCASP_PIN_AHCLKX
; ^* Q/ E! {! M7 D; }. R. \| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */* g/ }, p1 h% P* `1 Z5 k' c
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
1 p. l* H2 v4 A) b8 {| MCASP_TX_CLKFAIL
, X& g4 V. M6 b/ U$ i; l| MCASP_TX_SYNCERROR; j$ _8 p1 V' ^& z
| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
- V$ a& j+ T0 T| MCASP_RX_CLKFAIL
' E1 R ^% @) e: n) x1 l| MCASP_RX_SYNCERROR
' L% q6 s8 t5 h5 l* K4 U l| MCASP_RX_OVERRUN);
! M: g' E$ w. o# `, A) a S2 o}
static void I2SDataTxRxActivate(void)
/ K4 X; g( B! v8 C- U1 d7 k8 R{0 a! ]2 S3 E. k8 W: g: y( E
/* Start the clocks */
, k1 P6 i. A }6 Z8 W' H# SMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);% l, R- K5 O4 ]5 {# h+ h: q
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */% {' ^( ?% W+ A! T- m8 B6 C- ?
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,) n+ G% v# i. V- X/ }$ b: f
EDMA3_TRIG_MODE_EVENT);* c% L; ?/ f6 a, D' l3 b( T) C$ {
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
; r6 u: z3 T; M0 N) i4 [EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */2 k0 P* O( c/ @/ a: [+ O6 x
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
9 V2 P3 Q' p3 \% G' ~; @; E4 QMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */
S& J# W# _' ~0 E( z6 _( y. twhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */
! L$ ^" q8 ]. w( ?* b% f/ g0 O6 R8 cMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);+ F' c$ b1 V: d/ m7 O3 F
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);. Y ^. q. l5 w% X2 }) f- }+ M
}
6 a4 S. Y' @( Z9 ~请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
0 J6 U# L( i1 z8 B$ D
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |