嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,
' |1 \: u2 {9 _ w" S: U) pinput mcasp_ahclkx,
. _$ v$ w0 }/ W: rinput mcasp_aclkx,/ \* t s# v5 c4 W
input axr0,
( J: K; V" ?7 n0 D- I
8 D& e W; ^; J* J% H. @% @9 `output mcasp_afsr,3 |9 ]- N0 s- o+ E5 m$ `
output mcasp_ahclkr,
) o* V% Z: J, Moutput mcasp_aclkr,
4 C9 z/ x+ j A, p0 Z& z o2 Ioutput axr1,
/ s5 Q C5 @' P) s& H# g8 y
assign mcasp_afsr = mcasp_afsx;
+ s- s* s+ T% q- l, C9 \& x; passign mcasp_aclkr = mcasp_aclkx;
; e& a( Z: Q+ l$ b( @assign mcasp_ahclkr = mcasp_ahclkx;/ s! B$ W! d, s2 a
assign axr1 = axr0;
) L1 ~) g ~6 t. g3 c
" F) Q. f: u' D0 ?- b) k在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
' a( R9 O. x U) U1 T; u4 A
static void McASPI2SConfigure(void)
( X Z, X$ ~+ f$ b) z$ |0 s{" b, r5 c X* b4 {/ c. W1 o
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
! F' l3 {! a( A5 q1 aMcASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */- c' A& V9 U: f* S* l' K
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);+ F( H0 B% f$ U5 D
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */+ J4 f- F/ L, {% T5 k, L) V3 a
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
* j, T$ f: Z% H9 U8 Y* TMCASP_RX_MODE_DMA);
) R! P9 }. M9 |2 D+ M1 CMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
8 E+ `" Z/ b! q; ^" oMCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */; Y. U- ?, V d0 u. Y* s
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, # A l! @9 o: m# Q. O z6 g) ~
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
7 @) i- K* B) y0 {4 D/ I) NMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
( {6 E, j" T- A2 m7 S" J5 hMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */
3 v: ^9 e5 y0 [0 _McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
9 G1 L) C/ ?. H- W* E; K% m6 [McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
4 q1 G0 w) b4 N- m. v7 T0 P1 q, f0 wMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
- j7 r6 f3 ^2 a5 ? p0x00, 0xFF);
/* configure the clock for transmitter */+ a5 c/ e+ V0 K
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
: g8 G, j( X" c3 s0 `. HMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
$ \* [. Z) U& E$ F0 WMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
% z' V* z3 w7 f: N a8 \0x00, 0xFF);
s* ?- k( y2 S/ S* b5 N' v" P3 K' H" M/ j
/* Enable synchronization of RX and TX sections */
3 U0 Y P/ |' J# L4 V* e0 _; ^McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */; \$ | T3 Z) V) ]% ]+ q' W) t' g
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);0 _+ }5 r; F, C- M2 Q' q" ]
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*
8 \3 B$ A( C/ F% }& U) C** Set the serializers, Currently only one serializer is set as
$ R; |0 f! e/ Q4 C: E# A# ?** transmitter and one serializer as receiver.- N2 K9 M V3 \3 e
*/
3 V/ `0 W* D4 ^McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
" d: b! x3 e- l- g0 uMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*
- X n9 i i& I2 o4 ]8 Q, w** Configure the McASP pins / q- \8 Q& w4 I" c' q$ B
** Input - Frame Sync, Clock and Serializer Rx( ]; |6 |" J0 M/ V# V
** Output - Serializer Tx is connected to the input of the codec - |' j. ? }& o1 T @& T
*/4 T2 H8 [& C5 n* c! |9 |: R" c
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);; N g# i- Q! R
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));5 v% T- P% `9 l( P) r
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX/ ^% T! F9 k9 O+ E
| MCASP_PIN_ACLKX
: t* z( Q0 B0 p( z- \/ Y% f: {| MCASP_PIN_AHCLKX) Q$ i% d9 H3 {
| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */
7 S! o/ T2 x, Q; X7 c# CMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR ' S' J2 j, F; A9 k. |8 Z4 X! b
| MCASP_TX_CLKFAIL ( T* {& n0 `" a
| MCASP_TX_SYNCERROR' R/ s8 `9 p9 U" `8 m! ^( q
| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
9 V: \6 L* `6 f; ] j/ w| MCASP_RX_CLKFAIL
1 H) Y; q' m# Q a& g- C* C| MCASP_RX_SYNCERROR
( Y4 `3 d' I" Z- i1 K| MCASP_RX_OVERRUN); K. v) s5 o4 S- @% W
}
static void I2SDataTxRxActivate(void)% Z$ m9 s" R. j. d) X+ ]3 N2 j
{+ O7 O" `; L5 M
/* Start the clocks */
7 F4 ?: w/ S! X* H: m0 \McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);8 v% U" j3 f) i
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */
% S. D/ U* w) GEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,9 }- y* R& a% H# @& _1 C
EDMA3_TRIG_MODE_EVENT);
$ @6 s7 L& G3 }4 J3 O6 MEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
4 Y* L, v5 a, i j: T$ vEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */
+ o* ]1 r3 r2 ~+ wMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
! f5 P% l1 j) [" Q$ i: {5 f+ OMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */3 D5 C1 T1 }. W2 K* ]% Y
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */
& }% E. K- D# Y( JMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);
. S2 [4 k- _+ F% k0 O( WMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);3 G5 y# L5 R5 A: J1 z9 J+ d
}
: b, O8 K! u3 a请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
5 i) m% b# J/ B; j0 q
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |