嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,
2 C) ^0 H5 H* e; S2 [- einput mcasp_ahclkx,
+ x5 ~% I0 Q- o; ainput mcasp_aclkx,
- [# x7 ?6 E8 z# F0 v) ainput axr0,
6 u: S1 ~- U1 e3 ? n6 _9 q$ z, s' { t [& ~
output mcasp_afsr,5 I4 H" ?3 \3 z/ t- U/ w
output mcasp_ahclkr,5 `1 C9 z! g6 B0 F9 p
output mcasp_aclkr,
. C2 O, X v# q* w# Houtput axr1,* o$ p& u5 }& U) w, K$ z
assign mcasp_afsr = mcasp_afsx;
$ `1 P" e7 A- t8 S2 Lassign mcasp_aclkr = mcasp_aclkx;* g2 p4 Y1 V, O( Y
assign mcasp_ahclkr = mcasp_ahclkx;
- i' R/ i O, G5 q5 u& tassign axr1 = axr0;
+ D3 H" |' \2 w4 i/ U( \( m
* J+ {( g; |5 J# }: `( M" w+ F在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
" f- S" ]5 a& w! d1 w
static void McASPI2SConfigure(void)
' J& D2 b* Q' p& Q* e, o& E5 f4 ?: D{- k( h: n/ k: ^* W
McASPRxReset(SOC_MCASP_0_CTRL_REGS);7 ~0 f9 _) i8 g6 H3 h
McASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */9 ~0 B( [* r7 G- P, b/ v
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);1 q" Q$ T9 h F0 A. D8 e
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */
2 f1 _' M* K& r+ k0 kMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
9 x5 ~; x# \8 h6 ]. pMCASP_RX_MODE_DMA);
# ^- w( ?5 ~7 hMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
- R5 Q! T' `. T' J5 s# p- }, ?MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */
, r4 z9 a4 o' ~$ G1 b" G4 tMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
; S) t3 g; w8 G7 QMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
1 {- L/ B/ u4 ?) U% pMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
: ?4 s3 y' q0 D3 | t. I' J ?% G1 {2 cMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */
. X5 M# }3 `* L$ C0 Y. W; x qMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);, Z; j; c, w; k, z9 |$ D) ^
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
" u' C/ r" ~" q2 L9 t y, l$ tMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,. K, [- D1 n) h* g( c9 D
0x00, 0xFF);
/* configure the clock for transmitter */" @# K" u- p ?
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
1 P7 Q4 x$ j3 e* U4 r; P7 ^McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
" }2 n) @9 z2 t; |: kMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,( v" E7 V# u" u7 ?
0x00, 0xFF);, I0 @: i- B$ W. p+ u. k4 L7 M
3 a6 `$ o" g/ [+ a7 o X/* Enable synchronization of RX and TX sections */
- D- w8 X; K/ R4 t$ lMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */6 X6 n/ U, c+ o5 y# A3 ?0 g b+ p+ X
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
% m! e6 V1 @* e0 xMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*
% X. i$ G1 p2 `9 {( q9 b$ [** Set the serializers, Currently only one serializer is set as7 m# e& d I. {: }, p
** transmitter and one serializer as receiver.: Q" T+ M% h* V& G7 l$ d% E9 `
*/ ? W5 y# e$ Q8 m, D# y6 p h4 J
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
1 r) V% S' W, j+ r; @, OMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*
6 I1 m! } \) P& P. `** Configure the McASP pins
8 p* a5 v' f, d3 r: c, i/ G** Input - Frame Sync, Clock and Serializer Rx! p7 H: Q& @6 `0 k
** Output - Serializer Tx is connected to the input of the codec
2 O. |; i! E+ |, b) d) e*/
& a7 i* @ P# \: \0 MMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
3 D0 {* {" N8 J. l" }' qMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
: A5 r+ d0 J" A/ E. E1 @McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
( m0 X0 c9 S8 _| MCASP_PIN_ACLKX& e$ x, A7 r; s9 z' s$ {5 h' g
| MCASP_PIN_AHCLKX
; j3 F9 l q. O$ n: j| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */
, I. R; a9 @2 tMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR & T9 |3 l/ N5 {% w' ?8 ~
| MCASP_TX_CLKFAIL 5 Y+ I1 S, G# K0 e
| MCASP_TX_SYNCERROR/ e& V7 V) r E4 _5 z
| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR ; a% a: ^) s' ~+ O
| MCASP_RX_CLKFAIL
* I% L( d( ?2 T4 P* a% I| MCASP_RX_SYNCERROR 4 H4 L6 N J y9 y+ H0 H& E* g
| MCASP_RX_OVERRUN);
# {3 M! S6 q" P}
static void I2SDataTxRxActivate(void)
' ~! E/ g) N3 e, V{
+ F$ c) `* u8 \. j/* Start the clocks */, u3 e3 w3 Q7 M0 C: G
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);) z) c6 ]1 @ Z6 f
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */
8 ?. ^, l J/ i. xEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
, y6 J7 x7 g% F! B& M1 T2 TEDMA3_TRIG_MODE_EVENT);; O1 k0 v7 M. x, q2 b# `. I
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
@' A; S4 \7 U: ~4 B$ E0 XEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */) `5 `+ x+ {3 N5 }, `
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
1 E1 |5 y8 Q0 k' k0 B1 MMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */3 g7 r9 Q- ]. t5 |
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */; O' g' a9 g& R2 h8 r1 [7 P
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
: K3 k8 g9 d% y7 Y; g' `, N, {McASPTxEnable(SOC_MCASP_0_CTRL_REGS);) m; {9 p: i2 U! K+ g( E$ r
}
9 d& L, @) O0 {. @请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
% D- n9 N; N$ p2 {9 V- P- X
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |