嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,, m3 c- |1 X) x6 n$ D
input mcasp_ahclkx,
5 H4 l5 J; G0 Binput mcasp_aclkx,
3 B% m. T3 }; `9 r! ^1 J Cinput axr0,+ J' |; Y& v& J
6 B+ v+ ~. |; x+ k8 n5 T4 A6 D2 R. G
output mcasp_afsr,
% y/ j$ M. D% Z9 poutput mcasp_ahclkr,4 e) M$ s# z2 m: ^) O
output mcasp_aclkr,
2 i& \: R" X" e; {output axr1,
/ ?* E5 j$ L/ k7 @
assign mcasp_afsr = mcasp_afsx;2 w3 t7 ~! w+ n1 Q7 H1 p
assign mcasp_aclkr = mcasp_aclkx;
: S! x+ N4 z+ x; F( N6 Q2 }assign mcasp_ahclkr = mcasp_ahclkx;$ k. o: T* e. q" Z
assign axr1 = axr0;
7 }7 H- R4 }4 L! q% _. d5 ?# v
+ a E' J5 I& S9 A! P
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
0 i- S" L B) J! Y% X/ Rstatic void McASPI2SConfigure(void)9 E$ k: e8 ]' A5 y4 O
{3 d; Y4 t0 H6 o! H, I( f: _
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
* ?0 S4 Q" }' e# b- x: m+ Y0 DMcASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */% |7 R$ q$ K2 d& o! s
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);- u% g4 v& B( P7 u$ x; U/ Y
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */+ `; h. q/ z! R" a. g- |4 N, M0 K
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,9 m b9 R" p9 l5 j
MCASP_RX_MODE_DMA);
3 t0 j) X4 \2 i! L; HMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,7 c5 ]' w M1 p1 k
MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */# F3 H, D: y+ R) Q$ [) y
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, , t' b/ t! G# }4 r; _4 o
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
" s+ Q& }! y, b2 I+ _3 O6 KMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, - H! ? c& z4 J( s8 { S
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */
: Y& {" h) H/ m+ J) R) ?$ ^( @McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
9 d6 f: h2 j. J4 O* c* n9 YMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
# R1 R5 k) f1 X/ x7 qMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,' U9 q; C4 o/ O/ l% G) c
0x00, 0xFF);
/* configure the clock for transmitter */$ ]' {; ?6 E' v2 E/ X
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);1 s2 |; {% H v
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
/ A3 Q9 \. P7 H# j/ tMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
# {; S* @1 ]) J/ z/ g1 L0x00, 0xFF);
5 J( f+ ~9 m/ w3 i
0 u' N6 H- E% [$ F6 U' |4 w/* Enable synchronization of RX and TX sections */ 7 q2 k ]. w. {7 H* `2 V0 j
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */
+ @7 o, Y k+ g4 }! K- R# e5 AMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);- c' O* F" _! n( ]" h) {
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*' x+ ~+ A7 [# K* I
** Set the serializers, Currently only one serializer is set as# h+ N8 q; U( Q L' k" d
** transmitter and one serializer as receiver.: k, a& G- m% Z1 e! |
*/
" }% {: \- @) [0 nMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
n; ~. K: u; C8 QMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*3 l7 Y K& f) h' o+ s- u
** Configure the McASP pins 2 P% e/ K* n+ p8 \( {
** Input - Frame Sync, Clock and Serializer Rx
, v/ _. b2 {2 W** Output - Serializer Tx is connected to the input of the codec 1 C4 ]. S2 w/ K3 ?3 Q. H7 w
*/& {0 {$ t4 p5 n: u) R+ H |4 x
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF); n+ R( z. Y: ~# c! O- t8 p
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));9 z! \' ~5 K+ N2 t
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
- ~ m3 U! \7 g5 V/ C| MCASP_PIN_ACLKX% ~3 a3 z: X9 ]# g" t
| MCASP_PIN_AHCLKX
; o5 s9 J6 J! W! n0 F) l| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */
& e" n/ D$ G7 U; ^5 B3 c( J: kMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR * z5 x. i2 L0 x" L% u) X) A2 h
| MCASP_TX_CLKFAIL
2 |8 ~- C L2 a& W) y9 T. E' o" w" t( h6 K| MCASP_TX_SYNCERROR
+ K3 V; |: l/ k' o- N| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR 5 y4 w4 Z( y' v4 d/ [, s* u
| MCASP_RX_CLKFAIL7 [9 X$ \( ]0 f# x9 t
| MCASP_RX_SYNCERROR $ e' v- U! ^# w b% I& T
| MCASP_RX_OVERRUN);( c5 _$ Z H( D0 t; I5 _% w4 C1 q( e
}
static void I2SDataTxRxActivate(void)
; p4 ~6 Y: u Y4 O. U{
( A# e6 [& s$ B' y/* Start the clocks */
# ~% `/ x/ q/ D+ E0 \* n/ c4 s3 R) SMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);6 D/ \! |& [5 \$ ~3 d
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */) f0 Q: e% p$ U6 z" K
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,5 E; I9 Y+ D, O
EDMA3_TRIG_MODE_EVENT);' `9 \3 G) D. t
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
7 s$ E) K, F8 }6 N$ d2 s; g4 r6 v LEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */$ Z L" _. e7 |7 z- U* k$ }' S, ^9 f
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
1 F& {- o% z% p# m$ fMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */! T/ X7 j, p1 Q5 { v$ v
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */' b- e* e! s+ P8 E
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
$ b2 @3 Z) ^) BMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);
0 [8 I: |- P8 ]}
$ e4 F5 P' ] h1 l
请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
) @/ N$ ^- v7 L
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |