嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx, K: F4 S( _- f# {' O
input mcasp_ahclkx,; U. e( Y6 U1 i. t3 c+ u/ Q# u
input mcasp_aclkx," {1 ^2 Z& v/ D e3 n' O# Z
input axr0,$ |4 Q# G+ O* l
/ g( L: Z& `8 ~- N+ Y
output mcasp_afsr,
1 k7 A5 ^' d& j9 ^1 B# Coutput mcasp_ahclkr,
& _% s5 V% h# v0 ]output mcasp_aclkr,
- Q9 ~5 g5 y, N( Z8 t% [/ eoutput axr1,- h0 R% j( a/ x# `" u0 b
assign mcasp_afsr = mcasp_afsx;& l j% E' U5 T
assign mcasp_aclkr = mcasp_aclkx;
. H- }; j% U8 g' n# y8 ? Q, j! b0 Aassign mcasp_ahclkr = mcasp_ahclkx;
1 L3 G3 A% f8 L" B; hassign axr1 = axr0;
* S# O4 Z0 x$ w$ b
1 v9 z! Q) S2 H( E3 O4 J在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
b7 L. a# s0 O2 Ostatic void McASPI2SConfigure(void). i4 F* [0 G$ J' J$ u3 e& C9 A
{
2 o% V" _: E; {2 zMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
m3 T/ Q: J$ @McASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */
- n- a' p; U6 M$ ~McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);: V$ _. o! b2 t- `! s" M. U
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */% d3 m3 I! ]1 I# P, w. J
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
, }, o, n; w/ k( M- t! FMCASP_RX_MODE_DMA);1 k0 Y; ~) n; @
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
3 x1 D0 W! N+ UMCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */
5 F. j$ f3 K) v; Q1 s; RMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
/ ?8 O# _ ]) I3 {. nMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
5 ^ O) u$ O+ b$ Y' Z$ n1 tMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, 4 j, t9 f& }; n* x" S+ I
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */
6 r; t7 X7 B$ X& T bMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);) m" R# Y) D8 r! h! [& H$ o9 E
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
, G$ [. t5 w( o' a. q( w/ Q8 g3 QMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,) J( n: U7 n0 C, b" ?
0x00, 0xFF);
/* configure the clock for transmitter */$ ?$ V8 o: g' E8 C' Y/ s
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
, E/ T# w! c* m; YMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); 1 B* o* _" d7 d1 d' U r6 O( H
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
2 `# l# k8 F; N( |0x00, 0xFF);2 ^+ z5 T. C- g5 V& W
; g0 n" K$ ]# u/* Enable synchronization of RX and TX sections */
+ K% q$ u( N* SMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */
3 a6 E. \- a8 b1 p fMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);* R; B3 f" R G% Q% p
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*' k9 ^9 S) r" h+ d
** Set the serializers, Currently only one serializer is set as8 V1 s( K( F% X6 b h
** transmitter and one serializer as receiver.2 s* W+ I8 a3 s5 h
*/8 z5 T0 G! x0 ]( S2 O6 S2 ?+ C
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
( Y# G7 B' m( n j6 a4 u8 [9 `McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*
2 k( h/ C: R. g1 \) h3 V' c** Configure the McASP pins
* W9 N% x. D/ I+ v- ]) c4 _* F** Input - Frame Sync, Clock and Serializer Rx8 Z& P! S5 G$ G: A- o! n& t2 E: ^0 i
** Output - Serializer Tx is connected to the input of the codec ( {' b! c5 F- _5 W- {
*/6 l, v& O: q7 P7 a
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);) Z% h! G9 g- ]6 R; W
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
( h" g; _( `( t8 ~McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
: f8 l. N& P# u! c, x1 _, s| MCASP_PIN_ACLKX3 B6 R& l) n; C/ i+ Z- S) q
| MCASP_PIN_AHCLKX. N( n! v5 _# P
| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */
0 }: e- E# ~/ r! VMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
; V* c6 i$ ]& L) P9 H/ g" ?% i| MCASP_TX_CLKFAIL ) v* E8 L. i* u: }
| MCASP_TX_SYNCERROR
6 @' O$ K8 H {| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR ' }4 t* G6 m* Q
| MCASP_RX_CLKFAIL
, C/ S8 b) B+ A* N$ L4 [! Y| MCASP_RX_SYNCERROR 9 T" E4 q2 u b9 O2 i
| MCASP_RX_OVERRUN);3 J3 T d0 R* U1 Q0 r5 l5 K
}
static void I2SDataTxRxActivate(void)" O2 z! a; ^! u
{! @. f" i8 D1 r
/* Start the clocks */, K* p. k9 K. q/ @2 f+ ^
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);' D# L! `% v, u/ e+ r. Q& t6 A6 r, L
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */; A, ]: J8 F$ F# G- G
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
( ~. E& j8 L% @EDMA3_TRIG_MODE_EVENT);) J, G3 j# {" h3 K/ |
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, " ?+ P7 z, B' M" u* S" J
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */( b0 \0 a8 M4 \8 _* o' Y
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);9 S' z6 u4 b% b+ v
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */+ s1 O8 W7 U2 U2 @0 p! z0 ~
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */: n1 j7 v2 |& t6 f( N( V' k
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);3 n+ ]% f; o: k) E' y! g
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
$ a7 R5 X, Q# x% g}
8 E( V* o. S" @- `请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
! z8 w/ p; N7 y+ v8 O( ^7 c7 S/ d
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |