嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,. k6 v# o0 `$ l. b: i& s y( X
input mcasp_ahclkx,
2 a; U, }+ [# Minput mcasp_aclkx,
! T% d' ~! h" G5 D% b+ m5 A9 Cinput axr0,
1 B5 O* G6 p1 p7 W. Q; K7 s( F' b% A+ z
output mcasp_afsr,* u/ E2 s9 t; ?' H" O7 F& @( |
output mcasp_ahclkr,9 z% o* a* c2 o
output mcasp_aclkr,- X7 M" k3 G! U
output axr1,
9 [! w9 d" Q, O' r! O; _' r& c
assign mcasp_afsr = mcasp_afsx;/ z5 k8 E7 L' |5 r1 p( s u7 W. F, T3 {
assign mcasp_aclkr = mcasp_aclkx;9 N2 Z' A- h3 L: n& l' }1 y9 E3 }
assign mcasp_ahclkr = mcasp_ahclkx;- r! t$ K, t. P( l$ \
assign axr1 = axr0;
7 r' P! k6 {5 m( P5 B* K$ |
; y' u5 M/ E# g3 {3 u' X; C
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
& z9 [+ ^1 F. o2 \
static void McASPI2SConfigure(void)
$ U7 ]% _: q5 U) G1 E8 Q{
5 x& [9 U$ j- M; R4 q3 q; ~, eMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
6 _8 L1 L9 y6 g0 M( d% i0 }$ HMcASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */
$ }8 M. L5 e( j' q; o2 d5 v( pMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);4 e3 h9 H# B2 I2 W2 |
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */
9 z) h( \# X4 ~McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
7 R; Y# U7 h- E' j h& bMCASP_RX_MODE_DMA);
6 p0 J$ O( r$ J1 W% }, }McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,8 M$ ?/ Y; g* j% P/ D3 h3 A
MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */- w# M- E+ L% M% q; R" h
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
( V9 [1 p; Q1 D, i' RMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
, A; M% r- s' U6 m0 ^! ^McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, ) G, S3 @& I; V; h' H
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver *// h, |# @; e k2 l
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);1 D2 S% T/ d/ w7 j2 B: H% e3 U' x
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); 7 E4 W0 a" D* E0 V, ~3 U9 _% z
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,0 E# j2 i; C8 z7 Z9 M
0x00, 0xFF);
/* configure the clock for transmitter */- f; X; L! B0 m
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
; I( T: A: `8 t" {, k5 M" yMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); ( s6 \5 ?8 u: _) q0 D9 r4 Z, E
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
" u* m# x1 ?3 _: X; G O0x00, 0xFF);
2 \" H3 x! r" z0 W$ p1 n" b! p
, y3 |1 L& |8 Q5 j S5 B* T, k/* Enable synchronization of RX and TX sections */ % J1 V1 f+ O1 U! ~+ l
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */7 f) v% t- P0 E+ Z* F
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
5 f! b; u5 H( t% p5 o% MMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*" x @5 {# j+ T5 _3 a5 m$ @
** Set the serializers, Currently only one serializer is set as
, A b5 e) _' Y8 z. ^4 J4 F3 a** transmitter and one serializer as receiver.) U L) _. {; C! S
*/* Z2 n4 V$ G! [- j1 O6 o9 C$ F! m
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
& y) G1 e2 q6 T+ NMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*
) P* t, o( \/ u7 T/ P** Configure the McASP pins 2 W; l4 _3 `9 v% N5 O
** Input - Frame Sync, Clock and Serializer Rx
$ Z! y8 r2 Y) e; e4 b** Output - Serializer Tx is connected to the input of the codec
6 N( i- g8 b% M4 W2 T- y*/) ]) S% a3 B2 D! P
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
$ Z+ A- j; e r7 @0 I8 r, C1 `% pMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
! s9 W& H6 K# L% d) U% G2 zMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
A) `. ~2 r' l; \8 T/ r| MCASP_PIN_ACLKX, u! x6 h" C5 W# I! ^
| MCASP_PIN_AHCLKX8 _6 j6 V4 q8 A5 q# E
| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */6 `6 N8 _6 o1 L8 c: a) p# W
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR 8 l1 y- n% u3 J3 a+ L# K) h
| MCASP_TX_CLKFAIL
' C3 m& `& E3 \& m. a| MCASP_TX_SYNCERROR3 t9 H6 E8 z* y6 u) ^& T
| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
V4 k& t3 E: Z5 I( N- l8 _| MCASP_RX_CLKFAIL
# |$ C: E6 d( b. \| MCASP_RX_SYNCERROR
! M3 \( \2 h; U8 g" t' J! a+ j| MCASP_RX_OVERRUN);
* H3 e3 X# z& @$ Y}
static void I2SDataTxRxActivate(void)! L: _+ o; Z Z2 C" {: W. t w
{
0 I' `3 Y; A4 K: h/ S/* Start the clocks */
6 ^, m" Q: c! s/ T& C+ T! \ W# vMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
7 E/ N! }' }& k& n, Q) oMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */! ~2 r9 O/ {9 Q: r
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
2 X- F2 ?" |& p8 TEDMA3_TRIG_MODE_EVENT);
+ d! W2 b) W OEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, , {. m0 j% L3 i, T# g
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */; f. s f7 W% O
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
0 L+ ? m2 i+ N/ XMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */
) q# g8 }4 [) d; v! pwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */3 E/ e2 L5 G8 M( {
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
) w2 M D/ ~; S) I$ R3 ?" F. |McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
. Z( O4 g" x, d3 ]}
6 ]' ?* |0 K% E; j
请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
, T/ E9 J1 W; C4 O4 f! ?3 j9 Q0 p& O
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |