嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,5 w/ d7 W# A+ m; w/ Y/ e4 X
input mcasp_ahclkx,% b8 d- Y" s' ?" F% ^2 j6 O: L m
input mcasp_aclkx,: p9 F2 j! r. S, v }1 O
input axr0,
! t6 ]0 V" f" M5 ]" M2 s' ^9 N
* O! W: Y. N# ioutput mcasp_afsr,
( o* D1 X5 F- \/ goutput mcasp_ahclkr,; f' j. f: a7 _7 S
output mcasp_aclkr,! S: o& u% V3 `( Z9 }9 V
output axr1,. G) [, k ^. j W% @9 ^
assign mcasp_afsr = mcasp_afsx;% ?/ p! J2 {; E( L, n7 Y ^2 g, E
assign mcasp_aclkr = mcasp_aclkx;
8 {( a1 `, K8 J# T j0 F2 Massign mcasp_ahclkr = mcasp_ahclkx;# G* a6 c% l7 m1 ~' m6 n+ M
assign axr1 = axr0;
9 }$ Y4 ]( k" R: r
! B+ X8 s9 b/ l8 d
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
2 [+ p! n- J0 [ L3 y: e6 Fstatic void McASPI2SConfigure(void)
; _2 ]* n/ B* ]0 p3 J{
9 D5 `6 f5 d) H/ d& zMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
: T/ B- L) w) q8 x- yMcASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */
/ t: Y- O+ r5 V: a) JMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);; x. G3 I! a0 E$ `5 H* `
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */5 {# W$ Y6 l( t+ P* W, G
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,: [4 C7 e! C7 U& D1 Q, Q$ q E/ s
MCASP_RX_MODE_DMA);# _" R: F, `5 q) m
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE, c' Z$ U7 @1 W- c9 Z! v
MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */
+ s [6 [* S# CMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
. W. J$ L; K$ \$ B: J5 Y5 b) @MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);: q0 o/ p- V. l" ~/ R) }( u
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
d) j- ?/ o+ m; R0 Y; y; ?/ eMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */: x) |$ H. u& v4 K1 K
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
" A0 v+ z3 g$ ?9 }1 @$ tMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); 4 ~7 g7 f+ m! K) j; N
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,- |5 c$ t" R9 l! Q9 c
0x00, 0xFF);
/* configure the clock for transmitter */
* ^ o& p' A0 JMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);: F" |) k$ k x9 b
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
" e( R& w2 l) vMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
j: K7 v+ E. L0 N) y" n1 X* p& v0x00, 0xFF);
0 F- J1 K7 V& T. Y+ n/ L) |8 k* M- K7 R$ B! K. m% T
/* Enable synchronization of RX and TX sections */ $ z' M+ c" C7 }
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */
7 Q) K/ s% L( w) u) n) ^McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);6 T# }: b( ?, ~6 Q/ ?3 v0 x
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*
$ j/ l7 j4 [, e2 D** Set the serializers, Currently only one serializer is set as6 H' f; v4 P- c& ~: k
** transmitter and one serializer as receiver.& U1 x% t' U7 y0 J9 t* P; r
*/
9 t0 M' p6 U# w/ dMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);6 T6 G) v9 z) f1 S2 I) M+ S
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*
V7 p% Y' O( d/ g7 ]** Configure the McASP pins
1 C8 d$ V- [6 }% R** Input - Frame Sync, Clock and Serializer Rx4 l( V% ]' D- y/ d: \
** Output - Serializer Tx is connected to the input of the codec 9 Y9 o2 C( S, B. S1 m4 h
*/
5 ~1 ~9 l4 e$ I% | FMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
: ^& T$ s1 {+ r2 `. c9 F8 YMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));9 w$ T7 ~4 C9 b! t3 w! W3 \
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX6 ~ k8 f$ v1 J/ [0 s4 Z6 X% N6 o
| MCASP_PIN_ACLKX
6 ?; n, I! b, ~/ v U2 _9 k% d| MCASP_PIN_AHCLKX: V3 G) {* f: s5 h
| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */
. {- v( m2 R0 @, KMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR & ?( w- N* m9 r) o- ~& k
| MCASP_TX_CLKFAIL 0 R; W0 }' p; }1 i* P* U
| MCASP_TX_SYNCERROR
3 ^: U: d+ L r! t: W| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR 9 R/ z6 U# ~2 v! H
| MCASP_RX_CLKFAIL! E$ K3 w6 t+ t* ~; O2 b
| MCASP_RX_SYNCERROR
3 k) E; ^' J* q$ h| MCASP_RX_OVERRUN);
* \, r7 z9 a" q, W" r4 H* V5 B. J}
static void I2SDataTxRxActivate(void)
+ L4 c1 a: t: {! F, T) W{
* L# X1 k; ^7 E: t7 |/* Start the clocks */
( y& R1 _: ]$ T! d* HMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);" ^7 a8 Q& y; f$ S0 V2 T9 U5 F! B
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */- i+ L7 v0 K0 j$ |. F0 z
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX," C' ^' }( ~8 S9 F
EDMA3_TRIG_MODE_EVENT);3 Y9 V5 p: Y: u/ f! R( ?
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, ; k4 u/ N3 ]% b X) _$ M; {
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */) o/ n" _7 O" J0 x, C h
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);$ m g: G {6 P& \. o, ]( F
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */& C; J" e5 s1 Z) v9 c& t% h& W
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */3 \# c! K" i7 F8 T! B- O
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
, c' @/ |7 v) O. M1 jMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);
3 E7 V$ ^+ \5 Z" w1 s) Z! K* K* q& h2 x}
3 e& D$ h# I; e2 b1 C, ?. `
请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
# I$ y5 w: ?: x! f2 [0 p h
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |