嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,+ A( S3 q. L6 s
input mcasp_ahclkx,3 n1 V" ?; i4 X+ i3 R
input mcasp_aclkx," J: H3 k' L' X3 D7 j" S ]
input axr0,' y) _- I2 ~& G: N. \) K9 _2 Q) _+ s
7 n% `9 p* w$ c1 g" woutput mcasp_afsr,! E( g! G0 B0 H5 Z# E+ {. }
output mcasp_ahclkr,
, @& W* n9 R% Q0 t% e$ `( youtput mcasp_aclkr,
* L! Q. C, [; h5 H' S: Loutput axr1,0 c% T9 e }; u7 F
assign mcasp_afsr = mcasp_afsx;
& t$ [3 |& }& v7 [$ X' ^assign mcasp_aclkr = mcasp_aclkx;- Y' {" y5 h+ y/ t1 d5 y( l3 r
assign mcasp_ahclkr = mcasp_ahclkx;) v8 P$ J: E" p7 H) @
assign axr1 = axr0;
" \* k; F, k; h+ K1 x+ Z# U/ v2 x+ m: t' v
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
. Z9 C# e3 p0 G! [ }- ^static void McASPI2SConfigure(void)
/ V# B( n; h# g9 u2 u{4 H% f# ]6 @1 _% a+ c
McASPRxReset(SOC_MCASP_0_CTRL_REGS);( Y5 s8 j& w( y3 l8 g! n K
McASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */* L( L0 v2 I/ {0 q1 b; s
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
4 Y- F! u5 H* O7 AMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */
2 \0 G+ Y) c5 p" m- R% ^McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
& {' h0 a7 v* g6 N# }MCASP_RX_MODE_DMA);9 R$ |5 H; {0 o5 i0 E; B. \9 \
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
9 H7 M! R% q! p- eMCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */; X# s. q. m/ ]7 v. L
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, 7 ]" h* p9 Y5 r3 b
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);9 i( `$ C% ?' Q* |# d- ?) r, F9 n
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
* d9 g5 |$ `' f4 wMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */1 c( N6 t2 ^6 F* N; K2 H
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);* k( d$ W/ i) E* z( r! Y; m
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
3 T- C N' T, }+ \/ O) kMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
1 l4 q0 E4 G" _) k ^( J$ B8 Q0x00, 0xFF);
/* configure the clock for transmitter */: \/ z+ C" ~0 N# ]
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
1 r5 L0 ^1 E0 g2 `+ JMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); . M# J7 L' Z- P W& F
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
' F! q8 I! O5 z6 L0x00, 0xFF);' Y0 U$ H* D o* F
0 l+ Q% `' O ]/* Enable synchronization of RX and TX sections */ 8 E+ s! t8 p6 a) I
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */
# { w, n) Z; g. vMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
) W: [7 d( k O( |% z( i+ OMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*# [$ r: @) d3 u: r
** Set the serializers, Currently only one serializer is set as) [/ j1 G) T- d. J+ @# g9 r
** transmitter and one serializer as receiver.8 U% v- G: F, U
*/: m/ T; \- T; v/ R
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
. d0 b) ?/ b( ?; Y9 `/ D$ dMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*
( X; |9 M' o; Q9 z9 @** Configure the McASP pins 6 t5 O- y! _5 I1 U' G3 I# V
** Input - Frame Sync, Clock and Serializer Rx* g3 c: C2 t6 m5 z0 E
** Output - Serializer Tx is connected to the input of the codec
5 A4 o! }' u1 b; \* ]0 Q* u*/1 s G' p2 T6 _% j* f5 k+ p
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
" d6 }$ p \0 U5 X% a5 |McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
; ^9 U2 m. Z c/ a& @McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX/ T" s! {" P5 t( B
| MCASP_PIN_ACLKX5 o) J5 R* d+ F# X9 ~
| MCASP_PIN_AHCLKX* Q5 J: o; ~) j" X% r: w. ]5 s% }
| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */
& F3 V, _4 U( J* ] r1 C* uMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR , l; {; {' v+ ?: Z2 U7 n
| MCASP_TX_CLKFAIL + E' W# {+ U+ S# ~' ?6 K& }
| MCASP_TX_SYNCERROR" [8 d$ z% b5 f
| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
( r! ]7 a8 X& d& C% K% u8 L* c| MCASP_RX_CLKFAIL
" g0 K5 G; n2 B# @) v$ T| MCASP_RX_SYNCERROR . S$ L+ }" l. \* F) d" F
| MCASP_RX_OVERRUN);7 o! C& J- p. ^/ L: R6 l) E
}
static void I2SDataTxRxActivate(void)8 ~8 f; |9 J5 C4 O2 C
{
* O* O' T% l6 V/ q& a; b/* Start the clocks */; _3 M7 T' ]+ b6 c4 P" J; v
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);' _5 y/ N# p# S6 ^8 f& {# A# p
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */2 O2 p2 z. k& a6 r3 f8 j
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
- ]9 t" y! D) ?1 @EDMA3_TRIG_MODE_EVENT);
, C9 |; H8 i7 W" C" xEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, 4 B! ]! t% C& {" p" V
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */
4 b4 k; t, a+ S9 g, P: aMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
6 _; D, A- V- |1 |# D) BMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */
) }5 p( Z/ ?1 `& f& h$ Q8 Zwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */
+ j \/ x- {& M0 H) vMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);1 v S3 f0 m) N3 k
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
& @' N; i% z; s% e, g- j, \2 V}
" T! e4 x2 I) Z! _) ^请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
5 |+ Y6 t$ e& X( L* s4 r! _
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |