嵌入式开发者社区

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

作者: wapdasta    时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,
. H" h- v/ y  k5 |input mcasp_ahclkx,; b* V8 s& w0 k  Y6 q
input mcasp_aclkx,
! E& q& s2 |( i! }% s4 H' _input axr0,0 l; h$ f% H" S/ P/ E: P) C

2 V; A2 o: [/ Moutput mcasp_afsr,5 ]1 ~5 M5 \, x
output mcasp_ahclkr,
  v0 D$ o+ |. @9 toutput mcasp_aclkr,
8 u! H; Z5 N. M! Y# I7 ]1 {; routput axr1,
! K/ e3 z. \$ r
assign mcasp_afsr = mcasp_afsx;
' F9 r4 L: H  {. b; d# yassign mcasp_aclkr = mcasp_aclkx;% [, E9 I3 q( c# {4 O
assign mcasp_ahclkr = mcasp_ahclkx;
5 t6 @, O; n2 d) ~assign axr1 = axr0;
5 @7 X  _4 Y8 v

  x) N( K$ H. e4 d$ Z* `
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。

0 [9 N. V! |2 w( t- `
static void McASPI2SConfigure(void)
$ I9 Z& \( e: H; D0 g' @{) C0 I! y4 U. h
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
/ Z4 X& ?) [0 q  A5 F) GMcASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */6 d# |) e/ O0 r. Y& M' {* I8 D1 Z* s
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);( {. Q+ b) h5 y
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */& `  M8 n9 {- Y2 B$ d& U
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,' Z9 \* s( K$ d! Z) o. l( k. l
MCASP_RX_MODE_DMA);$ C0 V  T' }4 U: ^6 `/ {. q& M
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,6 Y) s  n5 P' |; c0 d' O7 T
MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */
5 S$ i. P' g" U# V% b, F/ ?McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
: h9 F+ T2 M% Q9 k3 fMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);- K' M; Q3 \  T- ]
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, ( R" q/ v; {$ ?
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */( Z% \$ H# m$ K4 {& B2 i. S: ?
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);9 p) S1 w1 [# [3 Y( O) s
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
  Y0 I+ h; ]8 Q- NMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
$ Q  f) Y. |# W. Q0x00, 0xFF);
/* configure the clock for transmitter */
6 R9 X: l+ g3 }: f4 }McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
7 Z. E/ k( k4 Z3 X# g, JMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); " D# P( P) B3 W8 S+ C
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,. O/ c6 ?: J- r/ J# H1 L
0x00, 0xFF);7 j$ q; e0 @; ~. r- J0 z

! z9 F: r& ~$ \- B& Z9 C2 P9 ]# L/* Enable synchronization of RX and TX sections */ 1 V  Y, P/ V9 X( g- k
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */2 v8 p: g3 A& ?* F9 z
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
* S2 g9 s4 M4 I2 y: D# FMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*
* A* i  R: p. a6 J6 u** Set the serializers, Currently only one serializer is set as
7 ~, h0 e2 B/ [& J6 ~** transmitter and one serializer as receiver.5 B6 Q; G; r* }* W% s
*/. w8 ?! e& |1 T: l. z
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);. n$ F9 @6 R& \! V5 d" H2 _% n
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*
  T. E0 B" d) _- j** Configure the McASP pins
) r8 V$ u- P4 P3 R) M# T. H** Input - Frame Sync, Clock and Serializer Rx
0 v! r9 h8 b/ R6 \7 n* e+ V3 p** Output - Serializer Tx is connected to the input of the codec
) G4 ?& D  i8 E# z0 L- L3 |*// K" C3 L' F& G8 i
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
* u4 w) C+ K5 e& O2 l! }* a1 K) IMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));8 h% o4 p6 k. G8 ^3 u/ Y
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX. w( \4 I3 d9 ~6 j. i, c
| MCASP_PIN_ACLKX
8 V8 O0 ~, [$ s$ n3 [! |" ]; g| MCASP_PIN_AHCLKX* B, {1 F, l9 q8 h
| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */
4 o* a7 p' L3 i$ AMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
3 F( y6 N! Z1 V; w$ q| MCASP_TX_CLKFAIL
! F6 r0 g' s2 s: G; ~! W# M0 Y  `# J| MCASP_TX_SYNCERROR  a) [- E  u/ `5 A, i# h2 \, n
| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR 0 v. |; L4 U3 ^% D
| MCASP_RX_CLKFAIL8 n: H2 ^0 K9 C' k5 ^1 _2 g& G
| MCASP_RX_SYNCERROR
! o" l4 L4 t4 ~9 C. d. l- e% @| MCASP_RX_OVERRUN);  G% b) [2 r2 k$ l$ c7 m9 z
}
static void I2SDataTxRxActivate(void)
9 [8 O# x; d) T8 X% ~9 n. [. [& _{
2 l. a: A& K0 ^$ x7 ^/* Start the clocks */
2 m, k8 q  C" I# f3 O( Z2 p" }4 [McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
- H3 }* T( e& N! ]3 B) K+ Y: FMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */
% X, d+ y+ K% d4 Q# u3 V8 NEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,! b; P, \7 ]$ S- @6 u; v$ F8 p
EDMA3_TRIG_MODE_EVENT);
- O1 x  r; ^9 UEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, 1 \8 K& x5 O! |& ]: `; m3 q; Z
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */0 ?2 T3 N& Q; b$ ]; w0 j& g# b( t6 y
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);3 `7 e9 @3 d6 K5 u( z
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */
" j7 W+ x- [' Q. M6 I" o. J4 R1 dwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */$ k) l, C( i& l
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
; z1 c, H/ W7 i9 qMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);
% v5 F8 Z. ]6 ?( v% L}

& O, a. j7 Z, M3 }
请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.

& m$ Q7 s2 p" o- o" b




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