嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,) A! W6 T& g9 u# e1 V2 {; l
input mcasp_ahclkx,6 b( Z5 b v# j3 u' c
input mcasp_aclkx,# `- O* F. G% |0 \8 D; ^5 U
input axr0,
' O* ^; W: h* \' ?% J8 Z6 G, w
' p. V& L# z# v, n& V: E! s1 Voutput mcasp_afsr,% Z' c" [/ [5 A+ C; U* G0 }5 K* j
output mcasp_ahclkr,
* m9 [8 |3 F% N* S% G. Foutput mcasp_aclkr,& J0 b8 ^& f3 j7 y: B: E
output axr1,
$ ~) Y) ^6 Z5 N. q5 w
assign mcasp_afsr = mcasp_afsx;3 N4 q$ V; B! ~! q* V
assign mcasp_aclkr = mcasp_aclkx;
4 q h4 ^8 p8 ?6 f9 e$ }assign mcasp_ahclkr = mcasp_ahclkx;( [% B9 Z4 x% z: V! O
assign axr1 = axr0;
- x: J+ g- n) \5 @' x. X, z$ ^
6 V9 _ ^1 f) S2 }% N' E7 A) S7 {: S在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
& \. _7 w% j: W) Ostatic void McASPI2SConfigure(void)* V) w" h0 g# I2 |) W- b7 n+ {
{
; E& l% ]7 e W( n- r$ V* uMcASPRxReset(SOC_MCASP_0_CTRL_REGS);9 N6 e, M* ^9 p" `0 |: X. i! t6 C
McASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */6 n/ x8 ?4 B z1 ?
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);5 U) |0 \3 k3 w! i4 t2 o8 [! t
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */
8 A2 x+ Z4 w+ a( \! ^McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
! \' T/ _; R) T$ M# q7 a* |MCASP_RX_MODE_DMA);# ?6 n4 B/ _/ l# }' w' v) q
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,: _! b( w: H- B
MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */2 |( M3 ]2 y c8 [2 G
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
* m+ D3 ^& s, M3 C9 V8 b# m+ _MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
, T' F- G% D4 w; B: H1 EMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
: _5 o% b4 F# l6 `& I6 x5 U2 ^/ p ]MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */
# K9 A% N) t& ~2 d& XMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
9 S$ W+ K) e6 L3 qMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); + R: ]' `# e! _( v4 m
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
! z) B. l# b3 ~" r: I( |9 l0x00, 0xFF);
/* configure the clock for transmitter */
5 J" T1 S( I# f$ }2 D: |McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);& h5 U' i l1 j; p% u0 p
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
+ J2 M# b' J; d0 { uMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,7 R$ i ]% c* P/ I4 ]7 Z) O3 R* j
0x00, 0xFF);% e9 c) i% B+ I& s% p% W- V
, \/ K5 o. j ?1 o
/* Enable synchronization of RX and TX sections */ : g& O' M% q* L- E1 k
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */
! v! U- o5 n4 |) \4 nMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);: F3 A% @7 n' n, Z
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*/ b P" {* {% u( e) G: u
** Set the serializers, Currently only one serializer is set as% o$ |! G. o5 ~1 h1 C! _& T
** transmitter and one serializer as receiver.
/ f; k* `( {" i P*/# |0 H1 O% F" E
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
; T" E! H U9 B0 S# O9 bMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*1 S7 z! \* b1 L
** Configure the McASP pins # d* h; n- k, F+ ^6 G1 B5 ~. x
** Input - Frame Sync, Clock and Serializer Rx
/ O; z, t+ k: I" S9 B+ f** Output - Serializer Tx is connected to the input of the codec 6 u: m/ r% O! H; h
*/
: s% I( Q+ ^ Z$ _McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
% f* t# r& s+ tMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
) @7 i. ^2 s% CMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX; W ?. d) t' g9 k" n% E! s9 K
| MCASP_PIN_ACLKX3 g! X, Y4 Z- Z- m8 a! d* h
| MCASP_PIN_AHCLKX4 q+ u$ v$ X5 d Z6 u
| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */
% R; Q% o- t( B; k, L; qMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR ; F( o/ Y# K4 I1 Y
| MCASP_TX_CLKFAIL 0 U* [3 {( l1 t# r
| MCASP_TX_SYNCERROR. Q8 K& c* z6 u n" Y' z5 V
| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR 6 U1 j' N" k5 U( O- R
| MCASP_RX_CLKFAIL- ]1 p# {# C+ O8 H$ B) ~& c
| MCASP_RX_SYNCERROR
) h8 m: B8 e ~4 B, b+ N| MCASP_RX_OVERRUN);
& G: Q* X( y; U% Y}
static void I2SDataTxRxActivate(void)
; Z+ U1 M' p# F{$ p. ~7 A8 } h1 n1 T& o9 ?
/* Start the clocks */
% w& K2 g; F0 z5 O% Z# F" S* Y7 UMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
6 Z- L4 b# M, Y* j9 X' yMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */4 m) k$ p$ h+ l
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,; K: [- V o& U' a, ~
EDMA3_TRIG_MODE_EVENT);6 ^" k, c" d. O0 ~
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
# U: H, Z e+ i0 A4 w$ Z% {EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */* A7 W/ ?% F _+ q/ }
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);2 n9 q( h' T5 J* ], a
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */
2 u( s' k F8 kwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */) g4 m/ a. p( Z
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
$ U1 Z) g* b' n3 zMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);
8 \4 F3 \9 T f: \}
) V; l7 N- R5 M$ R; ]' j
请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
* {7 F& r& @# W& u- P4 h
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |