嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,& q8 a0 \/ {9 m2 ]9 c4 |
input mcasp_ahclkx,
$ i3 c- s. p# m9 I5 H. ~, binput mcasp_aclkx,& Y0 `0 e& ?, n# g- P% h" b/ q- O
input axr0,
& I5 {# I L; h* Y; d$ S$ z$ U* d* ` L; ^, J, s7 J4 O; L# W
output mcasp_afsr,
1 @: f& K; F# @! y: v! [' _/ _3 zoutput mcasp_ahclkr,
. R5 U$ ^5 a% X# d' Soutput mcasp_aclkr,8 N3 B R/ _" k8 [
output axr1,3 ?: h2 a v' u6 g
assign mcasp_afsr = mcasp_afsx;
$ @; P |1 z; z2 u% c' ^" Xassign mcasp_aclkr = mcasp_aclkx;
8 z- r/ J7 e: S+ ~5 t2 passign mcasp_ahclkr = mcasp_ahclkx;* H1 w/ p; Q4 [
assign axr1 = axr0;
) n8 ]( L+ m$ X2 m$ v- B( N6 j* }2 O* I. n" \0 _4 E% w/ F9 Q$ E
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
u7 ]! G+ p8 ^5 @3 `static void McASPI2SConfigure(void)& U! @ K) ]$ r8 F! ~1 O7 Z
{
7 \4 m1 @; H1 p" x$ OMcASPRxReset(SOC_MCASP_0_CTRL_REGS);% m b+ y+ s* `, n9 }& z( J3 m
McASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */) K; f6 f! J, {: m
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);7 ?$ e- Y7 T/ N: b
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */
. W/ ]8 U: E1 Y% f r3 K, a1 d5 _McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
- M2 S6 s' Y! m# R6 z5 @MCASP_RX_MODE_DMA);+ r4 _, g7 k& m1 u: |. e
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,1 j; F( e: p4 d
MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */
. _' N" u5 y9 c rMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
9 n. t4 J, e% V- rMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
) I# t( q1 z- f& ~) L k" Q+ F/ lMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
- F( b1 `6 A7 r! W) WMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */. A+ b g# Z: P
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
) I+ _# X2 U# ~& x; D: h$ ~1 uMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
" r& _1 J- w+ n/ |2 Z) sMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
' Y1 k) L( s& L% H0x00, 0xFF);
/* configure the clock for transmitter */
! W2 }* w6 g1 @- D$ _, b, gMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);8 V- ]% w5 x. N2 T
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); ) S9 e. V: a/ q/ W
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,% `+ N- r1 F2 T
0x00, 0xFF);- F) `6 E, d: i5 {6 Y6 r' u
4 a, h7 _& U. g; i+ h* i
/* Enable synchronization of RX and TX sections */ + [% a1 l, l) r+ I
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */1 @ c. ?- r" L. Q; O; q
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);! x7 t3 d: u# G& o& ^
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*: m7 N' _0 {: O- f+ D' A
** Set the serializers, Currently only one serializer is set as
& C* _' \( V y; o** transmitter and one serializer as receiver.+ Y9 a7 O4 T a, m' ]9 _
*/* X) E$ b" V) q* a* @: [5 Q9 q( j
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);* k3 ~! ^" \0 D9 t; X
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*
, `$ b8 W- R1 E" N0 f2 ~** Configure the McASP pins 4 F6 I7 h- n7 @& |1 b S1 |
** Input - Frame Sync, Clock and Serializer Rx
! ?4 ^! D. k5 X: N** Output - Serializer Tx is connected to the input of the codec
- W$ X" S: j- V# Y) `7 D T*/
1 J5 `+ b, M1 V% EMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
' |, x5 S0 B1 q; d: ?McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
. t" w8 V4 X- M' ]% hMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
) _6 f% o5 k) J: l4 f/ |# p5 g' d| MCASP_PIN_ACLKX+ a/ U3 F8 B! g
| MCASP_PIN_AHCLKX1 r8 A6 @( ?& U2 w2 |5 M. L
| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP *// p l" C) b* ?9 E E8 q/ k/ b
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR 5 w6 L5 }7 t2 v! r# ^0 P) G6 w
| MCASP_TX_CLKFAIL % @! f9 ]5 n, r" A
| MCASP_TX_SYNCERROR
* e v, l7 N' v: b& ]4 A| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
, f- q" Y5 a0 a% F; A2 j| MCASP_RX_CLKFAIL
* s9 T% r0 P7 D4 U% t% I| MCASP_RX_SYNCERROR 7 I& ?* d* F& B; l5 r9 B4 }5 ?4 ^
| MCASP_RX_OVERRUN);$ m& Y8 [+ D. M% a. @- s$ Q
}
static void I2SDataTxRxActivate(void)
; n( E. u) X& P G{
* n1 W& k) r; m7 @9 f/* Start the clocks */, t. p- S) j! |: C ]& h3 Q
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);$ @% T8 c( u. ^9 _; ?0 X& X
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */" e' n- F* A3 \" d
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
; e/ Y- i# D1 ^$ {3 u" K* F; F- oEDMA3_TRIG_MODE_EVENT);1 {; I6 J0 r+ b9 p, ?2 n4 R/ s
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, ' a! |6 f: l- c/ d5 Z u
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */
- b) ]: q ?- b# |: D: y: q! N3 \McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);0 g; h' r6 q/ f1 \6 k; f- f
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */
& |7 z5 F5 C; D( ?while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */
$ E/ H& P' z) TMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);
0 H) d7 u3 i! v$ X3 `3 L$ ^$ Y; u% ]McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
% @6 m/ o9 A1 k9 g7 w7 m% W ^}
# P( Q3 s) J( h
请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
J1 {" ?1 k, F5 b, w
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |