嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,/ a5 K z$ }: t9 K) V
input mcasp_ahclkx,
' B$ s0 y$ ~1 winput mcasp_aclkx,
# D/ c1 k t) Vinput axr0,
0 M; R1 E/ W" w; q. A
5 w$ t( @/ v) ~1 R& foutput mcasp_afsr," O- e( x: e9 L( J/ H. m
output mcasp_ahclkr,
% j/ G+ g% x( a. q% j; e; X3 Boutput mcasp_aclkr,
' Z! b e" Y2 o; `' Q$ a9 g0 h7 } \output axr1,
3 F V ?* o) A W
assign mcasp_afsr = mcasp_afsx;8 N4 H* `7 C+ W4 n
assign mcasp_aclkr = mcasp_aclkx;
5 W$ O# D7 S6 o0 Wassign mcasp_ahclkr = mcasp_ahclkx;
# v P6 r. Y1 J* k2 `! Aassign axr1 = axr0;
4 z- ^# {( a5 V# s& H& l1 c
" ]5 ~9 N, q: l3 c' s g+ l在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
$ d# e& M* I% k$ X8 R$ Y) |
static void McASPI2SConfigure(void)
9 K! J: E8 S2 ?4 V/ b{
! K. g. U2 p: ]( A- dMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
8 p. v3 {) s+ m8 ?McASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */
% L \4 D1 L0 \ S- `McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
) j& ~+ `% n0 u% z+ j: l4 l' YMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */# j" p9 G% l5 Q3 \+ O4 |2 R
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
% K( n: R6 F" l3 a+ ZMCASP_RX_MODE_DMA);
+ ?0 ?7 Q2 R/ x3 W3 }0 hMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
- W- B7 W% m! U* PMCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */
3 l8 h( |0 \4 G! ~, l+ W4 f4 HMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, 6 w: @) S+ N' Q; ]9 R( V
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
& Q; z! ?. E2 l2 i, Y% NMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
& K9 W4 }6 y1 ]7 y* X$ O# ~MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */
! l/ M7 E4 b$ ?, ~! |8 ~5 w& P jMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
. ]9 ]& E `+ |" Z. Z$ I$ ^) NMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); 4 Y! S5 q+ p. ]3 p' T1 v; a. u
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,, j% V; Y! }/ Q7 j: d3 _- Z6 r# ^
0x00, 0xFF);
/* configure the clock for transmitter */
0 w% w9 L, z Y9 C PMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);. q# F: V+ n3 G5 t: n2 }- M
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
, b: U& W% O8 M& {" sMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
8 [- y7 U# `, ~" M* e" q8 c0x00, 0xFF);
6 S- j2 U. N# N: m) ~( ^8 ?
6 ]3 p9 @. E4 d# ]. F+ I! e* f( k: y/* Enable synchronization of RX and TX sections */
: _/ Y1 U5 S. f* b. Z2 zMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */
: |. `, y7 n2 DMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);. ]& A: D* b& v6 S% _2 r- S: T0 ]
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*
9 h2 ^; e. I. a- I5 v: }** Set the serializers, Currently only one serializer is set as6 Q M7 D$ o4 ~4 |! }! X0 v
** transmitter and one serializer as receiver.1 n6 E3 J4 b. m* D: y
*/
/ F# m$ t. S( K+ ^4 X3 R, aMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
$ b9 m5 f* s1 ]McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*
! L1 _0 u% B( |3 s3 A* r) F6 J** Configure the McASP pins
1 b8 s9 A% G+ o" [4 m** Input - Frame Sync, Clock and Serializer Rx
9 r( m2 G1 V1 b" f2 L6 S** Output - Serializer Tx is connected to the input of the codec
- s8 a, s0 u2 T5 G0 `+ _" T9 ^- e*/
0 R) M3 `5 y6 C* |* {2 x( I: v$ CMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
( Y0 |4 w3 `3 p, iMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));) P2 k* B/ U% v/ N* v2 C9 D3 y" A) v7 c
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
2 O% ]2 v, G$ |" R% n0 Q9 P# i4 k% a| MCASP_PIN_ACLKX% {1 P. d6 r! H& X) v
| MCASP_PIN_AHCLKX
, c G# W6 q! M& ]0 i| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */
) B6 \' m" _' _# e+ ?+ z) RMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR 7 ?" v2 [+ c0 i a! [. n: J1 d
| MCASP_TX_CLKFAIL N6 _) [" `4 o: C* t2 A3 }
| MCASP_TX_SYNCERROR/ q, w' l3 E! d: C
| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR ; u8 w+ ?4 W' n% v: u% T0 f; d
| MCASP_RX_CLKFAIL
9 h6 c) o/ F0 v| MCASP_RX_SYNCERROR $ g" R4 a7 v% n+ {" h+ S
| MCASP_RX_OVERRUN);
) a, k( t$ D% A7 h) b}
static void I2SDataTxRxActivate(void)
6 `( o+ O! i, T3 x' |, A{+ L. U! D+ G4 y/ \: k
/* Start the clocks */
' @: v/ i2 z5 U( `) L& b. Y7 FMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);1 I: p5 G, I5 {5 i* f2 |
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */ o% c& |+ v! M
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
- Q# c C @( ]# h5 Q( ~& N+ ^8 D& ^4 mEDMA3_TRIG_MODE_EVENT);
! K* E* { o) M) z) u2 `# d4 C1 mEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
( m5 V2 {8 e3 F8 WEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */! U6 ?, D0 ~' c/ T
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
8 T( j p; Y+ u) ^% k0 RMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */
+ H3 ^1 j5 O& K5 L. x9 \" o+ I) fwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */$ u3 w" S6 Y' D w9 M2 e
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
" t% v l' T3 ~$ eMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);
$ O; r T( z, ~( [/ Q" [( a& _) I}
" z7 S, Q e2 U8 f3 ?
请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
" L4 d( z$ ?8 [4 s! j! g
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |