嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,
3 O+ i$ W, j8 A( }2 ^input mcasp_ahclkx,4 A( [ p3 L$ z8 Y$ q
input mcasp_aclkx,
0 O2 y/ _7 M4 |) a! I. e- j a; J7 V' t8 Dinput axr0,) `; S8 Q! x1 F6 Y
* O6 ^4 y2 ^( B) b2 c
output mcasp_afsr,
: m4 I: ~# l6 A) Q8 ]6 @- O2 ^* Houtput mcasp_ahclkr,( y2 s8 u3 Q& j2 m) q ^3 H
output mcasp_aclkr,( r# z/ k" y' [
output axr1,
2 h% ?* u: E2 G" _$ b
assign mcasp_afsr = mcasp_afsx;
4 m% S- b1 B/ Qassign mcasp_aclkr = mcasp_aclkx;: d2 [! r6 }! ~
assign mcasp_ahclkr = mcasp_ahclkx;
: S8 a- Q' d. S$ G! ~/ t6 R3 ~assign axr1 = axr0;
3 B A6 J2 i D. c: Q, m
. S5 o+ `# q* L# T& i在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
# \( _6 R2 ]6 F# C9 ?( L
static void McASPI2SConfigure(void)
; r0 d$ v9 s2 t4 u8 Q+ o: A{- ~7 x2 T, A# x J
McASPRxReset(SOC_MCASP_0_CTRL_REGS);/ Q0 |- X; u3 D; s3 }
McASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */
% Y7 i6 N5 F9 L+ L; aMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
6 C5 [( D! `- l' mMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */
2 Y& p7 j) x9 t* ~McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,/ [ G# Z# [3 K: R* g: |* D1 q
MCASP_RX_MODE_DMA);3 o* O/ T. @/ @, C3 I
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,0 u% N2 n+ A/ c, b9 ?
MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */& {( |' {) g& x' v& b* D4 w( P
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, * a7 M5 O. L# M9 h" o
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
/ S& c9 j5 ?. F6 g. A% GMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
1 F9 k$ Y6 d: q" QMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */; M6 \6 E4 h2 d, z
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);. E. |+ s& ?. D* j! C5 \
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
1 g9 j, X6 V! O7 e" n1 ?5 ?McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,/ j& M* D- i: _
0x00, 0xFF);
/* configure the clock for transmitter */
4 [% ?3 o* ]1 pMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
' ^" ~/ y( V( M; ?, SMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
: U+ c/ ^! u. {McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
* a) O }1 \4 r5 s0 s0x00, 0xFF);
6 f* V4 C1 N5 d M1 T7 u: \! q. _3 g0 e
/* Enable synchronization of RX and TX sections */
, v9 `1 y% \+ y" D6 ~4 IMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */9 }6 X; f5 p6 C$ B4 p$ X3 D
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
! F) M. z+ ?( {7 ]McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*; h/ |$ v' k$ P5 h5 N9 a- g1 G H& w* D
** Set the serializers, Currently only one serializer is set as3 D3 m& b, D$ }0 ?/ r7 m
** transmitter and one serializer as receiver.+ B# `, e3 Z- \) `- I6 D" O% n
*/% l8 E# @& I- `0 @: ^
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
$ u5 j& |4 ~7 v0 ]/ R) J8 DMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*3 t# X8 b2 O X) r8 }
** Configure the McASP pins
: p+ R: R/ w3 ~5 P# f7 S** Input - Frame Sync, Clock and Serializer Rx* }9 u& s- c! {! E2 i% q+ n/ F
** Output - Serializer Tx is connected to the input of the codec * Q' C/ d' x! q. U& {& O4 X4 ?
*/
4 D$ b% {* W! }1 U; Q% @2 zMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
+ [/ A. O$ | F! ?/ E2 [6 Y7 WMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
& ?2 Y, Z" D5 u; h6 g) qMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX7 l/ R% C3 v( Z9 l7 P
| MCASP_PIN_ACLKX& s% f" n. C, p9 j- V
| MCASP_PIN_AHCLKX
* t6 T: y* p% a: s/ s2 c5 a# r2 W| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */
" R7 T7 o8 l- f4 A% N9 b" i L8 tMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
* t4 I. ~2 K, w' V; s| MCASP_TX_CLKFAIL
. d/ I' c4 T/ W| MCASP_TX_SYNCERROR
/ [: _/ t# v: B! \0 G| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR " {2 O7 Q" [3 ?; l2 Q+ d
| MCASP_RX_CLKFAIL8 {( S: c+ y2 m* M* ?
| MCASP_RX_SYNCERROR 9 v$ J# b" C1 c& `1 {" z# l
| MCASP_RX_OVERRUN);
# B" Q9 M; V+ Z. G" B: l. U}
static void I2SDataTxRxActivate(void)- ?7 b: u) l# e+ Q/ w
{
9 n* |& c9 R5 _/* Start the clocks */
* j% C9 e6 s/ a, a1 H& {. VMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
% G7 S1 H" z% D: lMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */& B6 c! W& K |0 n8 K7 P
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
8 `. W& b x; Q) N* E4 KEDMA3_TRIG_MODE_EVENT);! K* j" T! `) \
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, % ~1 P- n" v+ E q
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */( ?" Q+ @% I; u# S
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);/ Z$ f4 k! `; h7 b* s- |+ j
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */
, H Q9 ?2 r$ e3 A' }" Y) _while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */
) `' L* w& V5 Z( ZMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);* B: P5 s5 r" C, T
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);# W/ P! d8 z+ j( Y9 m( N7 B
}
& C1 ^+ x* h& `2 E. d- q7 z' F/ p9 L3 j请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
: \/ Y- b' r% `/ l% d( z6 |
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |