嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,
) c7 V1 f8 B0 K Z; K% g H9 S8 cinput mcasp_ahclkx,
# {1 b: @8 H$ v2 b6 ainput mcasp_aclkx,
, g& A4 q) g3 k) Z9 s/ Vinput axr0,) [1 _1 G4 [/ C4 [" x u
7 Z) @6 J5 L% b8 W; A
output mcasp_afsr,
2 C: i; J/ d; Youtput mcasp_ahclkr,8 R c* @1 } M Q) N
output mcasp_aclkr,8 z D: l- Q9 u1 {2 C
output axr1,& P! o% o* A( b; N# v$ g; b% g# a$ N
assign mcasp_afsr = mcasp_afsx;
7 d. Z( ?9 N* Z1 V; b$ S) a d. vassign mcasp_aclkr = mcasp_aclkx;) e$ N5 z9 Z" u3 ?/ f1 Z. z0 f3 Q
assign mcasp_ahclkr = mcasp_ahclkx;7 U* h5 B7 a D
assign axr1 = axr0;
7 |, o4 r: V# i! E* h+ ?4 b/ `
# f0 D, k- a* n+ X" N在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
+ u* I$ B( m; u- k- S7 Vstatic void McASPI2SConfigure(void)
4 ^. H( @$ W) h{
% |. Y; `, f! r$ U* dMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
- ~; s$ B! f: R9 ^( XMcASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */( {% Q0 \- q+ K1 s) d
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
7 Q. g! j" I2 q' YMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */
# v* |6 U9 R! o5 N( jMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
/ Q: _+ E. W* d' |6 Z5 bMCASP_RX_MODE_DMA);7 j2 l) b$ I; d+ B( e
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
. g N& h& V' T- g. d& tMCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */
, g$ j+ _% v7 \/ K1 J2 cMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, 5 l! l' x+ X* G6 j
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);: A& e1 n \1 t6 i7 f* @
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
& F. j. q: t7 @. yMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */
# s9 B* y7 q( fMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);1 M3 w2 [" d. f* l. Z4 A% S+ l
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
& |3 N* y8 a, \McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
% a& j- N* H& a6 ^5 l# U- |0 x0x00, 0xFF);
/* configure the clock for transmitter */
5 Q1 Z9 L/ T# \5 _McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);4 K/ m/ P& q7 `9 N% U6 Z+ V
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); / Q$ ~; [" N- t* ~9 i, k% W
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,+ H: {! W. p; c+ _8 S) K# F) A7 S: @. x
0x00, 0xFF);1 e. `6 ~3 V4 j8 T
; r, K. t, Q( X" I8 ^
/* Enable synchronization of RX and TX sections */ 1 o" U* ~3 s9 @4 a' q- y9 I
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */
2 ?# x$ _! Y' ^8 e; C4 p. w qMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
* n% L! b$ L" j. V" Y$ Z8 _4 g# bMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*
& G( D4 y% n' E0 w0 p** Set the serializers, Currently only one serializer is set as
& t4 _. C4 ^1 d( c** transmitter and one serializer as receiver.9 O O7 }8 K1 _$ E
*/
7 {$ H- Q* N1 D( `. ]# N) GMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
( B4 p7 Z2 h# EMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*' @6 I7 g2 U4 M
** Configure the McASP pins 1 w8 I* t) q" L4 d/ d
** Input - Frame Sync, Clock and Serializer Rx+ s6 [; i; h( f( w* K' _
** Output - Serializer Tx is connected to the input of the codec
% F% h/ ~4 U! A. ? y4 ]*/2 M% r ^: E5 {6 `8 q8 I
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);( h4 D2 T: y i2 x. U
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
- K' ~: N8 D" O. ~McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
# z O+ ]+ U7 \/ U9 z. A! b| MCASP_PIN_ACLKX" l+ Y b4 F. z ]$ C3 c
| MCASP_PIN_AHCLKX& ?5 G8 X' y: |6 G: j: s6 O
| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */& K& V) U/ P# v; N
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR 6 e! z" `* X, N8 p
| MCASP_TX_CLKFAIL
0 X6 b0 h& y% `7 w, h: H| MCASP_TX_SYNCERROR4 ]1 I6 F8 j1 C* n0 c9 u9 ]2 d4 j
| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR : i# T- D1 n5 H7 Q, t
| MCASP_RX_CLKFAIL
# D* k: [8 \" T6 R5 || MCASP_RX_SYNCERROR 6 U. J9 t. Z7 s9 w+ ?. E, c: s/ W S! P
| MCASP_RX_OVERRUN);7 X3 _/ T5 `- N& @1 X. j2 _, u
}
static void I2SDataTxRxActivate(void)- d/ H8 d( [, X6 d0 H7 j4 g% U" n" k
{
Y% u6 d/ Y9 o, p+ b4 ?6 ~/* Start the clocks */
+ l7 j5 ~/ V$ d- MMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
0 i, h: |7 n2 X# y4 Z* m# RMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */
0 V' ]7 O" F1 Q" K2 SEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
?) o, e N8 `EDMA3_TRIG_MODE_EVENT);% @4 @+ a0 |1 N% [7 O
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
b( W; g) @2 G' M) X5 c& [+ JEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */3 E+ {( Q! N7 W) ^3 b; I4 {* |
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);# p3 Q4 p# v- @1 ]. Z+ H' N
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */& U) M- O& z3 x0 @1 }- \
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */
; z8 K) Y/ C0 I7 K, _- H' a, j: Y) VMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);
3 M% B" f* C0 D8 e. B" nMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);. g- Y/ y' K1 N# T$ y( ?+ E/ a
}
4 }; o# G/ X2 {# B
请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
1 _ X# N3 _" n8 [% F4 _8 G
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |