嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,! T- l& K2 ~; I5 m! Q! C# J
input mcasp_ahclkx,
7 W# q9 O) t3 N! Cinput mcasp_aclkx,: d. q: o4 N( y, L
input axr0,6 O! Y/ A' Y- f7 q* ]# z
% _" H/ U3 s3 }1 Foutput mcasp_afsr,
2 ^: K7 D+ S2 }4 @4 U q8 loutput mcasp_ahclkr,
2 k9 s6 l& H( E' w. @0 woutput mcasp_aclkr,5 o, N9 h$ u$ N$ ^: ^( _
output axr1,# M& ?+ k U4 w/ f
assign mcasp_afsr = mcasp_afsx;. O. L, i) r) E* J: t4 O1 E8 d
assign mcasp_aclkr = mcasp_aclkx;
" O8 x* L' o& o% C1 z1 xassign mcasp_ahclkr = mcasp_ahclkx;
8 j* n8 x( e, uassign axr1 = axr0;
7 z* n5 m0 n" d- R" h/ O* j: e. u
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
$ n5 m, R& k1 j2 z7 a/ O" R
static void McASPI2SConfigure(void)
; K; W: j' W9 F7 }5 o. b{
( f% a% k3 _/ n5 S, B+ dMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
9 D# D6 G/ H3 JMcASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */
. u$ \) n7 X n. X7 ^/ m% _McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
- G& D+ d, v J1 ^McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */
* x9 [7 _, [+ x6 \$ b |McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,2 Y4 w/ j+ G# \3 L b
MCASP_RX_MODE_DMA);
, X0 K1 i2 P" i9 L0 UMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,+ m5 e8 J+ {9 u2 q+ ~0 X
MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */7 u; d. Z4 L) j
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
" x. y- v- C# ^) zMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
) ^0 ?9 [! Z( Y5 P0 ?6 cMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
, Y _ v9 H) A3 Z) r2 UMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */5 C# H. q" l L
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
, {+ _' F0 m; E+ k- K/ M0 AMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); 3 ]8 g0 K/ a3 g' _5 q: _- n2 G5 U7 B
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,6 r( q6 E' x2 E" o. J
0x00, 0xFF);
/* configure the clock for transmitter */0 Q1 W7 ]" H6 u. |8 e
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);) x$ z6 b" ]8 G3 E
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); 8 m& t V* O4 X) ?6 b/ E
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
+ ~1 q; R/ X4 `* j7 R0x00, 0xFF);* x6 o% e: t& Y
9 n. |8 J; R6 p, ]4 i" B
/* Enable synchronization of RX and TX sections */ 9 \) V& @' W/ O6 t0 @5 w
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */, |3 L. s' u N1 V. N J
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);; f1 e0 X3 F8 O( ]" b$ A$ c
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*
! D( y f0 T7 @' d** Set the serializers, Currently only one serializer is set as' b9 R) l6 j# @8 j& S3 e! o
** transmitter and one serializer as receiver.
( H% ?9 o/ [- r$ Y*/
/ c* C: T' N; }4 ]- _/ E5 u) \McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
6 s" e5 ?7 Q6 s% L* C0 @: LMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*& o. E4 B; ?& M1 n, g1 [6 N0 B8 `! {0 V, ?
** Configure the McASP pins 0 ^" Z3 P4 k/ |* z& |2 J! g
** Input - Frame Sync, Clock and Serializer Rx" P& Z( ?2 f. o) I
** Output - Serializer Tx is connected to the input of the codec 6 z( B8 B& B$ J m# s$ c
*/
5 C* a+ t) [7 f) fMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);$ ^- ?3 X; j& ], q9 F- ^
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));4 n% v o9 A3 Z7 M& D/ u h: a
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX2 O' ^, `2 j& {# D" J
| MCASP_PIN_ACLKX
6 ]' ^& r, F6 N1 K% M| MCASP_PIN_AHCLKX A9 z/ ?1 T, N# M# H
| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */
7 o; x& i$ ~4 F5 V# O# LMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
C p/ Y' c6 D% V& \| MCASP_TX_CLKFAIL ' e7 v) I, n3 P9 w
| MCASP_TX_SYNCERROR
; ?) R2 r, F# g3 g9 b: @2 l| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
0 L3 H+ `& R. \| MCASP_RX_CLKFAIL4 p% Z, j1 \, I k3 o
| MCASP_RX_SYNCERROR
5 B' b: H G+ O/ G7 s| MCASP_RX_OVERRUN);
" ?2 o9 @" W0 O" k( D}
static void I2SDataTxRxActivate(void)+ f2 Q1 d; h p( K8 c
{
6 h2 A& k3 B! _2 Q$ F7 T6 t1 U! e/* Start the clocks */4 u" b- X# _' p& j5 e
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);, o# n3 a! r$ A u
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */
+ k) w8 P; ^0 cEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
# O' F* Z+ k3 X4 z2 `* HEDMA3_TRIG_MODE_EVENT);9 D) ^8 f/ h7 ?% I h7 s
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, 7 V8 i+ q; T; G
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */, B% {/ N U9 d* k8 C" u2 N
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
{& J" F, e1 GMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */, X$ \$ A) {0 i! F" ^5 t
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */
* y+ _* U: |% d: i; kMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);
7 H7 U. b# {9 l- K/ ~0 VMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);# A; H, @8 j/ o( U( f7 V
}
$ u0 f! I$ L) t, t" u: T4 @请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
# A% m1 v; n& B9 }0 O
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |