嵌入式开发者社区

标题: MCASP自环配置。 [打印本页]

作者: wapdasta    时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,
- p' S- D  P" a+ W: einput mcasp_ahclkx,
) r, {# t: o% t; b& A% @, r; D( Sinput mcasp_aclkx,( P' P5 C. t6 _" I" g; ]
input axr0,
3 Z  f* ^: M9 D% \7 \  L6 z0 n) \' X) q. C
output mcasp_afsr,
; ]! @# {" j$ ~+ {/ {( xoutput mcasp_ahclkr,
) n9 S8 E- _3 b' H5 Ioutput mcasp_aclkr,* \$ w9 ~: J  V2 c! k7 h9 |3 L
output axr1,
1 f. b* w' K, [2 F8 v
assign mcasp_afsr = mcasp_afsx;8 G2 C. e: z1 e; X* i# d' ?: w
assign mcasp_aclkr = mcasp_aclkx;. w/ c" I- ?  d9 X0 U$ }" E
assign mcasp_ahclkr = mcasp_ahclkx;
  m/ T( Q, P( G& V8 b9 _4 `4 Wassign axr1 = axr0;

' X6 \7 I2 q4 ]* f" N- k  W8 _
3 P8 h+ N, T- [
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
6 v, K" A% \% m0 Z- I% O
static void McASPI2SConfigure(void)
& |2 D# L! w9 m! P{
% O! C- C; G. d4 w3 R1 ?1 \McASPRxReset(SOC_MCASP_0_CTRL_REGS);/ F& v3 Z1 w* g" v  ?* G
McASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */
& N6 p# p9 c) y# J  D( sMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
' R' c) Y) i3 c9 ^2 U8 P: UMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units *// T, p9 r2 T. A- [: u3 L+ R
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
+ W8 e2 w5 D& @- l& g5 v, C+ |MCASP_RX_MODE_DMA);
, Q- I2 x( u' G+ a9 sMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
# P! L, ^' U& J- SMCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */: f( J5 P- |5 r* Q& x
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, ) T+ v+ t5 I8 u/ O
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);: T6 d* I9 N" X7 P
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
7 i( ^& s" P6 Z/ E( N. ?3 i0 ~MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */1 z5 `4 K; I2 v- I/ a! z
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
! ^1 V* a, W6 ~& b9 o1 {McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
0 o" K% Q: A. y2 KMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
2 l) G& w5 }/ g  V) g5 U  v& {0x00, 0xFF);
/* configure the clock for transmitter */
- T4 ^# B# o4 C8 BMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
+ L& S: X+ T$ bMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); : A. F" A# f/ W; `2 s: h$ [" L
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
' G7 A, U8 k; e- G8 f/ {* _7 T' }0x00, 0xFF);
. j3 p8 m6 J; h0 i5 L2 |2 c1 F2 K0 X% P, V# r$ ~0 y0 D  H
/* Enable synchronization of RX and TX sections */ ! q. u5 e7 a4 O+ M: H9 l8 }
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */
3 u/ [7 n7 Y$ C5 _6 DMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);! s# e( \* x; O' `1 e8 h* i
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*. a" l6 @: l# X+ L( }" S2 S
** Set the serializers, Currently only one serializer is set as
- i! c2 K: q) [0 m4 j& N6 o; J1 t** transmitter and one serializer as receiver.: Y- \' X& E$ o! {
*/2 I# E" Q2 q) R
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);' F5 u1 o' f: D9 m- O
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*( X: X7 ^8 M: k* O  ?: f
** Configure the McASP pins
6 d' s3 X7 t4 ^** Input - Frame Sync, Clock and Serializer Rx2 R' h0 q0 u$ M: {/ g. V6 d1 `
** Output - Serializer Tx is connected to the input of the codec / Y/ P& [" g6 ]% t6 s( _1 j* F
*/
, d' F, j. U' E7 LMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);. R1 m3 n  R* L; h! A
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));- ~6 j* X0 R8 k
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
1 v8 l2 ?8 k' F4 D+ T| MCASP_PIN_ACLKX, P5 k! [$ B4 H! `
| MCASP_PIN_AHCLKX& _; [, l3 C5 |( {
| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */8 k8 E/ I+ Y8 s4 Z3 g, k
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR 3 J6 }0 b* M4 E
| MCASP_TX_CLKFAIL " n# H, }- g# A" K2 T
| MCASP_TX_SYNCERROR
, p1 C  t. ^7 S2 O) }" o1 _| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
! Q- E  E8 R8 e# @- L- v& F| MCASP_RX_CLKFAIL
0 ~' B; `9 U, s9 ~( m| MCASP_RX_SYNCERROR
9 m" b( W, r4 |2 j/ S| MCASP_RX_OVERRUN);7 J+ o  d: L% H1 g
}
static void I2SDataTxRxActivate(void)$ @1 l7 h$ f9 f0 J$ ^* O4 v) e
{9 n2 G# _/ m- a" B. a0 a; n9 u& f
/* Start the clocks */6 U1 G  c  D" {- g" ~6 r
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);5 N4 M/ d. \- I% \" ~  u/ j
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */
6 N0 R  s. ~6 n& \: a; m7 ]8 zEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
% K) |8 P6 w0 O* uEDMA3_TRIG_MODE_EVENT);: z# b3 s- [6 s$ ]3 {1 v+ t
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, ) j9 o: R! _$ |( l0 e
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */6 D. }: T( U" e7 A
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);% ~, h6 a# _4 Y8 w8 s* `( Q0 w
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */' j2 m- W" O; n0 k4 w2 g
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */
4 N+ ^: Y) f2 ~/ b0 A) L; M. pMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);
% l2 R" t) I( q; V; L1 AMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);
* ?* s0 f- ^2 l}

0 ~& X0 {( M1 C3 c  h
请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.

( {6 t9 C" o/ A




欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) Powered by Discuz! X3.4