嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,* h: ^7 b# E. n1 L3 H' H# w q; Q$ m' w
input mcasp_ahclkx,
1 F; s9 T0 Q" v/ r7 G4 Ninput mcasp_aclkx, P% J9 S$ \/ O/ \$ D9 x& r& C
input axr0,9 R6 e1 P2 ?! z9 X7 e- d% N8 y- f8 P. j% i
7 A2 y& j7 t+ o% `. d: l' p" {
output mcasp_afsr,7 \# W* Z3 c; R9 D9 d R6 x6 v
output mcasp_ahclkr,
: U) Y ~( q" B% aoutput mcasp_aclkr,0 t3 c# \/ j% T
output axr1,9 J8 | t1 r. k- U9 l5 C! X; B
assign mcasp_afsr = mcasp_afsx;
9 S0 R" [0 |) m, @+ S% m& j! o& x* g- Xassign mcasp_aclkr = mcasp_aclkx;
8 |0 f6 O0 q' Rassign mcasp_ahclkr = mcasp_ahclkx;
$ u/ w z$ |2 [) N4 w \4 {assign axr1 = axr0;
0 \0 r1 K0 i! ?% @! ~9 j6 f! b( S# t& X. [8 w8 {4 C$ N' q8 H
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
; I* }$ f( j ]2 Nstatic void McASPI2SConfigure(void)) S6 ?( W* {+ p) c# C" U
{% A. n7 @: k8 w9 B
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
$ c$ D F: F: E) kMcASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */2 q# R( O7 S$ C! F! c
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);3 B/ O2 K9 a2 [+ V6 h9 f
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */, Q1 c; T) q2 S+ ~- E w1 h) v
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
[# C: `; d3 o9 r; M2 c( AMCASP_RX_MODE_DMA);
4 K I* U8 s2 p( b& G" ]McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
" m# x5 {0 Y6 k- d, e% ^MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */
% o. S8 x; t! n. n4 z- IMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
) q3 L5 x% T7 Q' L* @MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);! `' Q( Q ?7 e) I3 w. d
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, 2 z9 Z; r% j$ U$ S+ w
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver *// G8 H! U* \3 w8 I# f( d
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);6 ~7 x/ o! b: n7 U& N+ a
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
; `& B: ?3 o5 z4 T& aMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,; A3 @7 {4 Y7 G- z
0x00, 0xFF);
/* configure the clock for transmitter */
3 V0 B- j y& rMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1); E6 x: u# p* I: X2 k
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
- B' `+ o4 J" l% h" E9 H9 YMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,. m( i f5 L H8 R+ m
0x00, 0xFF);" M7 r0 g1 c" M# R7 Y9 C( K$ m& V
9 ]- q r7 G# @$ I0 Y6 a, L
/* Enable synchronization of RX and TX sections */
' V {4 X! y0 j7 o0 `3 fMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */
* q0 k Y' K0 y9 Y: |: I) GMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
% W* Q+ u4 S# g l' R0 X3 |, dMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*
/ `4 m# w3 A1 c& Y+ J** Set the serializers, Currently only one serializer is set as" b$ Y1 W$ T( d7 a$ G# U$ p
** transmitter and one serializer as receiver.
8 r* R5 P4 E7 g# O4 w2 Y9 j*/
( y* C3 h% g c. S( o5 bMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
9 s. Z |2 c. J( B, GMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*6 Q- W& t2 v7 W
** Configure the McASP pins
) l& H* M$ U# ]** Input - Frame Sync, Clock and Serializer Rx8 G+ u2 Y, q- y; |
** Output - Serializer Tx is connected to the input of the codec 8 X* _/ M- z* q4 k2 A1 H
*// c" N6 l3 O5 i; @3 h
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);, W4 j! ]( [3 L, Q9 R4 l6 {
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));6 z0 k" t! e Q& D3 ]/ ?: u% F9 S7 w2 L
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX5 e( T- i, N8 h
| MCASP_PIN_ACLKX
r7 x7 c3 e. I) D1 H- k$ M| MCASP_PIN_AHCLKX
4 `6 p! f$ X' s6 }5 p" J| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */: i0 c' l) ~$ N( l# ]0 K9 Q0 |5 n
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
& s" t& n. [4 P( S8 v| MCASP_TX_CLKFAIL
' T- T) T- f# ]# c/ d3 \$ w5 S| MCASP_TX_SYNCERROR
4 R# @1 j' J; a: }$ d& t8 u| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
& K* B4 E: @7 T9 n| MCASP_RX_CLKFAIL: M- w/ K {9 d( B) t8 n/ r* _1 r
| MCASP_RX_SYNCERROR
1 X* K( N O- {& W| MCASP_RX_OVERRUN);
# D1 U$ f0 ~' [. Q2 n7 Z8 \}
static void I2SDataTxRxActivate(void)
0 t1 v0 C1 V8 M7 r{( r) H8 ^2 i$ D7 a2 N
/* Start the clocks */' G" |- r7 X* y9 h* r
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);. X. w% o/ M! }# {9 ?
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */
7 c: q4 d j; {$ QEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,: w! R; {* N' c5 `1 x/ O
EDMA3_TRIG_MODE_EVENT);
6 ^% P( A" S, d- g+ S) @: q) fEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
1 f& D. T" S9 Z. Z7 N7 n& yEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */5 I8 T! @' z& g' _3 f( m, p
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
7 k: d5 R# O" ^& M2 C% r# UMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */
4 ?% T S i5 owhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */; b/ i: E7 g+ G1 g/ w: Q
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
& B. k1 g4 i( u; mMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);
9 h3 Q# S5 p5 `}
( J3 u8 P8 m, i+ x& }7 H4 j3 v请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
# C. l4 N% e! x/ C: a
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |