嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,2 B; X/ m/ l( q% }6 p/ e
input mcasp_ahclkx,
4 L9 }. L9 ?7 v5 o; O1 @" ginput mcasp_aclkx,
2 F+ c9 v3 k( j4 I7 ^3 ~( vinput axr0,
8 z) v% x Z( R; r, p! O1 `! A
+ u" [5 J0 B" G' _% v( Y$ ?output mcasp_afsr,
. D! o" C! M# Moutput mcasp_ahclkr,9 V1 K: [; Y+ T
output mcasp_aclkr,( [/ o3 x5 O; X L! Y+ ]
output axr1,
2 N: z2 s8 d$ C& Q& o8 G, j
assign mcasp_afsr = mcasp_afsx;
& M5 w8 T4 l2 K) |) g9 R8 M; @7 oassign mcasp_aclkr = mcasp_aclkx;) |$ Z8 ~8 j, { c6 }
assign mcasp_ahclkr = mcasp_ahclkx;
* Q7 D4 u/ v/ L" }9 s' Z& [assign axr1 = axr0;
6 z) I5 Y6 t0 }
, h8 b8 V# d" B6 m8 H) r/ p2 x2 T在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
2 e- P3 k" {. Fstatic void McASPI2SConfigure(void)
" p4 R0 Q% M3 b{9 R' N1 \( h3 i s q! T9 U
McASPRxReset(SOC_MCASP_0_CTRL_REGS);' K" e1 r% C2 s8 E' R6 ?
McASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer *// y2 k5 |) _. N" D) p C
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
' V1 l+ S T4 X* Q# e( t6 U! M! YMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */* w( T, D. F7 T4 f0 E; L. [) Y
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,; [. }: |% u0 x/ E, D2 N9 A
MCASP_RX_MODE_DMA);% q9 ? B, Z- a/ e2 I# C* A. q
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
* _0 f9 U! S" N" O! y8 Z5 KMCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */ K) o. n7 X1 w- r7 e) `' P
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, ( X! ~+ Z0 o% R# B% R! |
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);3 V ]3 b! }2 M+ h
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, 4 d6 C/ H5 U ?3 U+ n
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */
, c6 u* N5 H( \0 c. C$ uMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
- j0 H+ L: A- Q0 L( F$ E# A" {- ]McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
) ^' l( _# j, p8 wMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,' D& ?2 p* b' D0 e7 q0 ^
0x00, 0xFF);
/* configure the clock for transmitter */( N8 G4 e$ d" g8 O. q% ~0 @6 X& {
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
. x* C' {' O' ?8 T1 `* oMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
& |& x1 w- H; E4 l* ?McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32," p! j! I% T: D1 V9 T
0x00, 0xFF);1 v* k6 ]. V: ~8 J! x2 I' H @# T
; e# K5 C; O% B* f: N T/ m. B/* Enable synchronization of RX and TX sections */ & E1 c& Y3 O5 W5 H$ r, D
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */
6 M; V2 p. x1 MMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);* w& T g% K" _' a9 s- M
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*
8 {' }# _! v2 P7 U& K** Set the serializers, Currently only one serializer is set as0 t% a4 _+ }2 a& t* U% y! ~& i
** transmitter and one serializer as receiver.+ ` p7 ^. S I" ?
*/
2 o! H+ l" V( `! ]1 Q% QMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
% w8 _: y. j# Z; t0 w j2 z4 eMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*3 b! L( ^- _/ M5 \+ [
** Configure the McASP pins
! ^0 |3 ^, ?+ d* ]6 M+ Y** Input - Frame Sync, Clock and Serializer Rx
( z: f' |9 T+ U- ?** Output - Serializer Tx is connected to the input of the codec 2 b/ X* c) k) t. S
*/
' x+ a1 O1 r- d. E% [& sMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);! E; k* I0 n" S% W- B
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));6 |/ S c a" |
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
: i) N! ^# C+ \| MCASP_PIN_ACLKX
6 k, d7 W$ H. H# _6 K, b9 i" J7 s| MCASP_PIN_AHCLKX3 n9 z% h, {1 z" ]! y B; \2 K
| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */
" d+ e K/ q* V! F8 s- ?6 v/ n: qMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
( E# D: a( E# c2 |/ r2 X| MCASP_TX_CLKFAIL
0 m9 `* C! `8 U. m0 s# O$ L| MCASP_TX_SYNCERROR4 ?, y+ @( Y% I; j) {/ x P
| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR * \8 e2 X2 L8 k. `: _
| MCASP_RX_CLKFAIL& G9 ^, V6 t6 f5 D
| MCASP_RX_SYNCERROR ) A- r% B# B4 F
| MCASP_RX_OVERRUN);! _8 \' I9 O* s. c
}
static void I2SDataTxRxActivate(void)+ `8 v$ Y7 ~) @8 v; C
{
5 c/ o5 E! f% t; @& p/* Start the clocks */
. A3 b% a) K: v1 c* d. JMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);, D3 Y. w, v' }% t& a5 ]4 D5 A- l
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */
+ D' @2 Z X: I2 z. a8 C( S! `EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
7 \/ r! y/ }0 h. AEDMA3_TRIG_MODE_EVENT);. \3 g1 S; ]- I; a3 J0 A
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
; c2 [, l/ E# w+ N9 I; w+ OEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */
! e' Q! V: c. g. QMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
) t7 H- w( b- m! Z% D$ _McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */
" ^) q+ ~* d4 ]2 W" y! z4 I/ g, q; Jwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */% K s7 E6 g) z5 W4 q$ y4 \/ i
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
1 f2 s3 k9 B( m) @& k" VMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);0 O( _) ]- P7 n) O% e; }
}
* {7 \* L! y4 O, Y
请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
" T" E0 T) y% p$ K/ c
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |