嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,! W) B% @7 B" Z9 B! `* Y
input mcasp_ahclkx,7 D7 v" O" }5 A# V5 }. N
input mcasp_aclkx,
8 {" L0 L( e5 _: r* c$ Yinput axr0," n3 c) h8 G( L3 n
+ f" }- I: m. f7 v& R ~2 R5 R
output mcasp_afsr,( |+ E F& l1 {" U& m
output mcasp_ahclkr,
7 E; K, z% m3 P, j# H6 Voutput mcasp_aclkr,
# s+ u" W. e$ m6 ^, `: u! Eoutput axr1,
9 O2 O: a) U! M8 @# z$ i; e _" M
assign mcasp_afsr = mcasp_afsx;
# D9 I5 M! }$ l3 a7 Yassign mcasp_aclkr = mcasp_aclkx;
5 L t' t1 n: c; zassign mcasp_ahclkr = mcasp_ahclkx;! Y ?$ W! ^ }" `. j. \4 }% i& M
assign axr1 = axr0;
! P2 \) d: Q1 T( L
' I; w/ N* A/ z/ ^% W在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
0 E' T& R* M" N, w( L5 N5 `$ k
static void McASPI2SConfigure(void)
" j, I1 f$ M8 w m8 C1 G{
. ?" P8 X. \7 ZMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
: z4 R; J4 |- r, nMcASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */
: @. r8 @# d9 q/ L; {* LMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
' o0 x* F, y9 R- O" J0 ?McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */# Q# p8 L5 C0 Y7 L1 @
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
1 U( G4 o: ]+ d' ~0 F. L6 b' GMCASP_RX_MODE_DMA);
' j2 V0 I+ P6 a3 s% X% iMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,: i1 B5 \+ \* \, U! E- L7 ~
MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */+ W. ^ Z. W5 C; Z
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, % ^3 ]; k6 @: w% i) r, j4 h; }4 t
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
/ H; c; d- h& g' i4 sMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
' z& G& E( {5 ]- |( o- M jMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */# W2 r8 T4 v! G
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
9 l) n1 |/ h7 w) oMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); + Z1 g" L, _7 s! G& m, {) y
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
( }% I' m" M- Q2 _6 u0x00, 0xFF);
/* configure the clock for transmitter */
+ f7 l& F/ j- {* @" y4 s' PMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
9 \+ l2 S/ g4 i x5 ?7 X- iMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
. W* U/ R0 e, Y# r8 NMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,9 _' s# l- j9 N1 g. }! Q$ O
0x00, 0xFF);
5 o& O/ S* p7 ?% K( m3 ]/ n4 N* c) j8 D2 ^/ p
/* Enable synchronization of RX and TX sections */
- p3 h- B% I' K8 E* w2 S- P! zMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */" c9 S' k; [, t5 G
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);" j/ I- }: Y$ u* s8 q8 x
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*" ^( u( _' ^ {, U! m0 d" q3 f) N+ }
** Set the serializers, Currently only one serializer is set as
- e# H) I7 h+ E/ F/ G$ x3 o8 }- W2 M** transmitter and one serializer as receiver.
4 O ]; U9 i2 @. e+ i*/" m* x9 D2 I6 P* x2 ?& d" Z
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);) t& ^9 D2 P) P' \( t8 P8 N) h
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*
9 F }% n, U. L: ?5 c- E1 i** Configure the McASP pins
/ H! k9 U( W/ \# W6 _2 N** Input - Frame Sync, Clock and Serializer Rx: d2 e' Q. }6 w+ O* d
** Output - Serializer Tx is connected to the input of the codec
1 J) ^$ F2 `, b3 [3 X*/5 f4 X* V+ L5 I- b# }% N9 G' B9 G
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
' `# Q: `: o( _) h9 S* ~2 n/ WMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));" z" X9 L, t# d d
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
$ s) M/ p* `5 W. E c& O| MCASP_PIN_ACLKX
5 y( {# x7 P8 Y6 Q| MCASP_PIN_AHCLKX
3 r$ Q! N& X6 V$ d3 u| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */
4 K3 P( H8 E5 P Z$ u Z- zMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR 6 Z" {. j4 g/ ]6 s: @9 F5 A8 [
| MCASP_TX_CLKFAIL
+ `1 @' g+ m/ a2 ]. J| MCASP_TX_SYNCERROR0 ?* U4 W6 ]. n" o
| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR & H; S7 D* z- E7 @! i: G
| MCASP_RX_CLKFAIL
1 W) H4 L1 U6 }5 G1 ^3 [. d| MCASP_RX_SYNCERROR
. Z$ u3 y5 t$ |; v| MCASP_RX_OVERRUN);# V1 `6 M3 o/ U6 c. W5 l2 B
}
static void I2SDataTxRxActivate(void)
- p; x9 K! v) @# x, P& f{
' [* D+ ^2 y/ ]/* Start the clocks */4 c5 g$ q' F: L- A
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
9 p: h( G5 q: f7 B7 U B6 Z+ wMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */
, q% K8 u* g2 {1 x$ X4 pEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,/ _5 ~- O7 D% r1 D
EDMA3_TRIG_MODE_EVENT);7 ~. Q5 b6 |* \/ N* p( |; @, }
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, + K$ `4 @- |6 E$ _6 Q$ a; o
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */
4 h/ y, W% L: j; i8 IMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);/ x) ?7 |* Y f
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */
4 R, a$ X# [0 n0 m8 C) O5 w0 ewhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */6 I! X+ ^/ q2 q! Q2 S! u% I
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);/ P: R' I: m- \8 i$ A# [! D
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
" R/ d! \0 c; ]! R6 G1 I# u}
8 P8 Y( O" |6 c' N, ~4 [请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
' p6 ~0 O$ v% h. f9 f% F
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |