嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,
: l. ]- {) z; C1 l) O$ }6 Ninput mcasp_ahclkx,2 ~, }3 m! N* L
input mcasp_aclkx,
, T. D6 l R z# d/ U1 n3 w3 zinput axr0,
% B, x' P8 ? u
3 f) D9 a- c! [- ?; M' D7 I. b3 ^1 xoutput mcasp_afsr, H! ]. A% J b: s% N* @" q$ J
output mcasp_ahclkr,
. m5 N; Q3 [1 o" _0 P; q0 `8 C; K/ poutput mcasp_aclkr,+ y7 V1 D. {5 O0 L2 T- u6 {# q
output axr1,% L% i/ z& h( b* y1 Y8 b( ~
assign mcasp_afsr = mcasp_afsx;* C4 Y, j9 X6 h, w/ Y9 m4 L; L
assign mcasp_aclkr = mcasp_aclkx;
. k- r3 p* c' i* I# dassign mcasp_ahclkr = mcasp_ahclkx;, F7 \1 B" f5 m `% F( a
assign axr1 = axr0;
0 ^* X8 B3 ]- ~, r$ S% H) E2 I7 L2 I) C$ ?
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
2 X" `6 Z A/ B. Z5 O/ j) j9 ?4 gstatic void McASPI2SConfigure(void)
}% H4 d+ l- @5 T+ @8 W0 O: d$ G{* Y8 k" r0 X) t4 B
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
. Z6 W3 z. {# ]0 `McASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */3 n5 }6 z! Y( t" o/ \* {9 V8 P
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);) T& F0 r# g; ?' k2 x& w ^/ [" O4 u
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */- [+ W6 W2 t% S7 ^( d2 k8 Q* |6 \
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
5 R. U/ Q3 @1 }4 S- ]8 kMCASP_RX_MODE_DMA);
+ ]$ d- }/ R3 `- n v# g. |McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
0 b0 ~% F( y) w u( C4 BMCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */3 U9 v( {* m8 l' B7 r# p) Q
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
7 x9 |" M. F; QMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
/ l) |& K. H5 w7 ?McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
4 L+ w3 d. A( T* R& n5 IMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */
7 a1 i) Y1 [/ v' D$ KMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);" q# A+ G6 ?9 F1 Q' F, Y' ]6 o
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); 7 Q. `; b O; e, P. e% |9 o
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
" e9 x! C+ m% W' H& u; y# L0x00, 0xFF);
/* configure the clock for transmitter */
4 d" J: d- Y7 q" M M$ R( q+ oMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);' s7 G! j% {5 j6 H: u% U* X
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); ; n9 E9 V2 Y0 p# [1 z
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,& x* y+ n* W9 s6 [8 @
0x00, 0xFF);$ w6 U/ X6 s. r. n4 B4 J
3 K* N$ _# ^3 q) d; g5 H
/* Enable synchronization of RX and TX sections */
2 z9 Q9 y: O( ?McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */
! ?( L$ L1 N9 x6 Y# n, G( j0 J, kMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);$ p8 V6 `/ q# P( d* p6 B
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*2 `# Z& b: R% J% B f
** Set the serializers, Currently only one serializer is set as
8 L; s" _* i6 g9 n# {$ Q, H' F4 p** transmitter and one serializer as receiver.- |9 u2 x: V4 D, ?$ L
*/
! r& j2 e, s8 @: E" P3 V0 hMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
* o' N3 e J; Q/ n P, SMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*
3 W, i/ F, w+ W** Configure the McASP pins 0 a5 q& {0 b; e5 F5 c
** Input - Frame Sync, Clock and Serializer Rx
( f- ]& ~1 J% g) o** Output - Serializer Tx is connected to the input of the codec
* m% ~2 Z" P3 s9 c6 p( |0 H/ q*/( w' g% I; c; ]/ v# N
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
9 j3 M! ~9 B- o2 QMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
! X B8 W4 [( k" L2 O |McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX0 p/ C3 [# p. C' a
| MCASP_PIN_ACLKX% \$ R) t- ?7 x& U, k; `
| MCASP_PIN_AHCLKX
4 b/ w" U ~1 C1 K/ M9 I| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */
0 ~+ @" L0 n: QMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
9 ^- r3 X% d# n+ {. r7 V| MCASP_TX_CLKFAIL
+ ]. [* F' p5 J+ I| MCASP_TX_SYNCERROR6 h6 G) r/ k/ ?3 m
| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR 3 w" [+ l2 o( @+ t
| MCASP_RX_CLKFAIL+ L# i1 ?1 C. I
| MCASP_RX_SYNCERROR / W A$ V& n. L" b- j8 x* S
| MCASP_RX_OVERRUN);* ?( P) _2 g5 ~
}
static void I2SDataTxRxActivate(void)# J2 c; @5 h' ~+ u
{
9 v$ {3 x+ K+ S( N/* Start the clocks */- |$ E$ {3 p$ M: z* n( W$ D9 u. u" e
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);; W& s% y/ d, r0 ^
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */
! R7 k' z% f9 N8 b) _1 D- dEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,& f' z) X* G1 B' X
EDMA3_TRIG_MODE_EVENT);" W% T8 s4 A# J) o. f9 z
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
, X9 W; z- Q* K& L" B+ OEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */
/ J4 g" j( z1 Q, q wMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS); X( t. E: U/ K7 z# B) x0 ]
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */
8 K; C: g/ G1 X7 v: _& V( m Awhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */
* w& d7 T* D8 p' v& l( YMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);( J5 e+ }" {# |7 C; `
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
! b, p3 J+ O; s9 _' J3 ^+ B( ^% T( `, ~}
6 m; J+ t; {8 v4 ]( O2 Z3 D7 d请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
+ c; R* V% ?( Z9 Q. e3 `
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |