嵌入式开发者社区

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

作者: wapdasta    时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,
% C! f! o/ ~* ainput mcasp_ahclkx,
* Z! d4 S9 Q) D* qinput mcasp_aclkx,
$ B5 z- e* s) C$ ?8 U7 pinput axr0,
) ]: W; F% ?# q# T) N2 Y3 f* }+ H1 X  O, ?7 A$ S3 U3 y5 n
output mcasp_afsr,
# {) q9 F9 i- x, y1 h: Z+ Moutput mcasp_ahclkr,
7 h/ J. w8 [5 `' u* G" foutput mcasp_aclkr,$ b9 |. ]% q0 a/ X0 N( G+ J- P
output axr1,; M/ y/ D( b# x. L4 u- N
assign mcasp_afsr = mcasp_afsx;
& L( R4 P* ]" w0 O: o$ o: Passign mcasp_aclkr = mcasp_aclkx;+ ]2 _. T* u; J& x
assign mcasp_ahclkr = mcasp_ahclkx;# j8 L  r$ |  H# x
assign axr1 = axr0;

8 ?7 O$ l* x4 A' y9 f: V; K4 ^$ d. S3 |) I% @, Z" q# H4 z. g. D. ^. q  a
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。

- @. d9 ]' j- D$ L6 J: X& W# J
static void McASPI2SConfigure(void)& f2 _- r. `& f, U
{! T4 h, r0 T" g- ?0 ~' j9 R2 w
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
5 ], J9 D/ [" M- C' {McASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */
* c  u" g& {' p+ aMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);4 P8 S$ k* y4 b3 v
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */9 b/ j1 R5 _/ @( N; D1 m+ z8 ?9 [
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
0 Q5 l, f- o& DMCASP_RX_MODE_DMA);
% a9 u6 E! Z1 V. @' v& |McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
; V4 V- U5 H( G4 A. j) aMCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */
' ?) I- M# C/ sMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
" `, Y6 `3 M; Y3 S4 NMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);6 l, ]5 y9 E2 X3 O7 S' f2 J
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, # Z  T3 u) v) Z
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */
0 I0 F; X; P8 T5 X* j9 dMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);; m" M% s) Y2 s$ b
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
- V: U8 M5 Z# z& TMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
6 z5 m& F+ {& |  q+ Z/ V+ D0x00, 0xFF);
/* configure the clock for transmitter */6 ]* `" f0 |4 j: ?4 B' f2 W+ ?2 ]
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);  T; c, l/ b4 \7 h3 Q
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); 9 V0 `; S9 z) S# X
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,* q$ X# V* x1 I
0x00, 0xFF);- B% S) j( a* h) Q- ^$ b+ n
1 e; M- [0 x& X' N3 Q
/* Enable synchronization of RX and TX sections */
/ T% u: G* O5 m+ wMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */
( r* `/ e# J  c4 y3 K& ^# w; J8 IMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
: u0 i9 i: O2 `5 i$ u8 r5 n( SMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*# r- d8 E3 A3 d! R% v
** Set the serializers, Currently only one serializer is set as6 ^& U' |: `7 t8 g3 \/ e, G
** transmitter and one serializer as receiver.
  Y; G4 M2 Q3 j7 E*/
* S% K( J4 X! ^# U# z7 w/ lMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
% n; z1 h/ `5 j, I9 w5 }5 kMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*: ^) \# x9 N( I% D; A
** Configure the McASP pins
. ]  |: W- h& f! e** Input - Frame Sync, Clock and Serializer Rx
2 J& L( [2 x+ n2 s/ H! u** Output - Serializer Tx is connected to the input of the codec ! _7 T# i! n; h+ Z- Z7 I+ c& S
*/
1 W1 ~% `  Y4 d: y9 KMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);& _8 Y# z( l, a, |( P
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));) y2 I) K' P) T9 _+ x  W  R# B! W; e
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
: v5 c! `4 w" s2 h* N8 m0 M+ [6 q| MCASP_PIN_ACLKX
& b+ u" \/ n9 u* _) w( q& T| MCASP_PIN_AHCLKX
* h4 y2 f* Y- f| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */
( H! E/ }7 u# ^. D9 RMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
* m$ K  _: F# B7 ?' |7 D9 G| MCASP_TX_CLKFAIL % U* V$ |5 O  u' A& m) B
| MCASP_TX_SYNCERROR3 f1 T6 Q1 b, X0 I6 @
| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR 2 l) h, \6 ]9 V" S
| MCASP_RX_CLKFAIL$ n8 [( [5 _8 a! N( ?4 N; K
| MCASP_RX_SYNCERROR ) F) \! H- y$ ~" Y: u
| MCASP_RX_OVERRUN);
5 _3 ^. P; Q' l- R}
static void I2SDataTxRxActivate(void)' y* t1 }) x& g, u9 o
{" t3 M% c4 t6 f) g3 F4 _1 P
/* Start the clocks */
. V6 W( d# Z3 o( [1 G9 |McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);, z/ {4 a$ \. F, A+ ~
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */
6 S+ p; L# h  k. s; T" q0 c, G  Z% p; w  xEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,. U& n( r( B2 P7 U* h8 o2 [; K
EDMA3_TRIG_MODE_EVENT);( b2 {, g& T9 a9 p1 p! w: C
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, # m0 C# R0 X1 H* O8 e  L
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */
# d* J7 G( q* Q8 _3 `: PMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
3 o) Z7 N: Q! g8 x1 y: l6 ?McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */1 x. Y  p: m8 V% K/ c& h+ ^
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */
" H' Z' L: ~; Q( o- b5 ~8 x! DMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);
! _& ?) b1 |7 {McASPTxEnable(SOC_MCASP_0_CTRL_REGS);2 l; ]5 b; s7 K& P$ I$ m8 p3 f
}
  ?* |3 p8 D. G3 v$ Z
请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
4 @1 k* {) s, d3 U





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