嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,
. D& u1 t2 V2 @9 X& V" D! J* xinput mcasp_ahclkx,
/ j( [7 \+ K- O% vinput mcasp_aclkx,( l+ d' R5 [5 O% j. R7 o
input axr0,
) v; L3 _( N/ V, P, ~8 X* P5 d& i' i' [( ^9 H3 e5 @% q6 M
output mcasp_afsr,: O- q7 }2 g' f: E* \
output mcasp_ahclkr,: Q% d2 ~" {0 @$ T; E5 _
output mcasp_aclkr,
0 `+ M& _- _0 I4 B* N' c3 c) F5 |8 {+ goutput axr1,
, o9 Y$ ?1 A4 |6 U: _# ?
assign mcasp_afsr = mcasp_afsx;5 w$ t' A, N3 t. O3 |+ ?
assign mcasp_aclkr = mcasp_aclkx;1 u' `9 m2 ^0 L8 l1 k$ v7 t
assign mcasp_ahclkr = mcasp_ahclkx;
" K9 d( F) \5 Q) j9 n1 C9 Wassign axr1 = axr0;
) r4 r2 C. Y$ T) X
; P0 s0 ?$ [7 w在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
: q$ V- p2 r! V" k" j5 Cstatic void McASPI2SConfigure(void)/ X( h: ] i, z9 R
{
' z4 b, Z& L+ A% r) k# nMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
/ g9 ^ S( J$ Y. v& N& f0 {* [McASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */
* M7 U) i& P7 }4 V5 t- m( }: ]McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);! G5 E) ?( T: w" T+ r
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */7 B; J5 f6 h$ ^
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
1 s. A. `; h- _- v( y- B" c9 YMCASP_RX_MODE_DMA);* p! ?1 K. i0 v6 q# N
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
3 B/ c" G+ f/ p) JMCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */
$ r) S2 b( S# r8 Q! |McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, ; K5 L$ X( c) @1 g
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
; }+ p, O: C% L0 T& `9 oMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
. p" a! B1 S$ D1 PMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */1 M9 R: d3 v4 F
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
3 O' ]. z8 y7 _( \6 XMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); % G; q- t4 a$ n* z+ A
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
' u' a# Z! S2 f' a; @4 i7 i4 d% K2 ^0x00, 0xFF);
/* configure the clock for transmitter */
0 k; d1 x4 h a; @9 DMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);: `6 ]) G: n6 ?: f4 F7 A
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); ' S7 `& U- }6 R3 C) w v
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
1 P+ v. F7 O) Z/ ?% r2 A0x00, 0xFF);# S7 o8 e3 ?; _7 p7 }
6 L' |9 D8 n0 N/* Enable synchronization of RX and TX sections */ 0 Z3 y8 E. h# ~9 G r3 c7 n4 U
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */
I: g) j. w1 _3 eMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
2 N6 X6 e( A( b t: V/ cMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*. n1 K3 D% B/ {% [* R9 f
** Set the serializers, Currently only one serializer is set as
+ ]& K9 e W6 [* a' T** transmitter and one serializer as receiver.
' j: r" n6 {) C/ R( n T; o*/
/ z2 ?/ J# B3 ^7 T7 FMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
! [, d& ]) ^4 J1 j6 eMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*1 G) X& p- l: v x& ~: l
** Configure the McASP pins
5 z7 \! N+ a" Z** Input - Frame Sync, Clock and Serializer Rx
# k u$ |' [% t/ B6 z% r* j** Output - Serializer Tx is connected to the input of the codec
) X9 k5 X8 F) ]*/
6 M6 j# f, l* QMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);' E' X* S6 J* I) ]# O
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));8 s8 g* g! C% T$ |: n
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
, [/ Z# R- P( {+ B5 `8 M; s| MCASP_PIN_ACLKX2 g& S- p5 V$ @4 W; e3 S+ Y+ ~, Z
| MCASP_PIN_AHCLKX
( A" E" u3 S8 h3 f1 @' S0 a4 s0 O| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */# S% w2 K- t) G: k/ |2 X+ d3 o' F6 s/ U; K
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
- u7 [$ `4 e' R0 F, d% H| MCASP_TX_CLKFAIL & d) j# Q8 S6 S% [5 V1 m0 P
| MCASP_TX_SYNCERROR
. Y1 U8 ?* ~0 D| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR 6 B! X W1 N6 ]2 v% H' U
| MCASP_RX_CLKFAIL
[, j% ?" |! o) m, E6 s| MCASP_RX_SYNCERROR # Q8 S: s1 l0 [2 x; w _' K6 U
| MCASP_RX_OVERRUN);2 m( Q2 [- v. m; [: ?
}
static void I2SDataTxRxActivate(void)" t. k, w( y! j( C
{
. K/ m7 D( v+ Z8 G/* Start the clocks */ U2 D) \" B& ]) q# ^4 A
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);% ]4 |. d, `- I9 i' J7 C1 o
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */
5 Y0 n, d$ |4 r* `7 z# @EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
% |; Y8 u; M6 N: _+ \6 w4 DEDMA3_TRIG_MODE_EVENT);
2 x. M6 `* H4 x7 N; P5 V0 SEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
0 q& t! i( {1 J; L9 o6 O% |3 C9 QEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */7 B9 J$ h" o: Q$ u/ w% P
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);+ e* M2 j I4 _. c
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */# X& ?, ?+ w3 l. v; h) R8 ?0 w8 a* e
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */3 V. J' f: @: f' i5 F
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);" E$ G$ L) l p% H" ^/ R
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
) P2 s; h8 ?6 K5 h j5 [}
3 z9 C5 y& ? H; b请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
: y) i8 e$ E% ^( h) E7 g* |* r
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |