嵌入式开发者社区

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

作者: wapdasta    时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,9 d6 A8 T0 e+ T5 ^8 U) P
input mcasp_ahclkx,8 E7 c) Q* _5 l) \; ~
input mcasp_aclkx,
2 W- ]) ?+ U6 D& G# V5 cinput axr0,
2 ?4 \! ~6 U' N& C0 r! [0 r( Z% r* A
output mcasp_afsr,) z5 C4 r  H$ F, Z
output mcasp_ahclkr,' E# W( G3 s; Q' _; `3 B$ v
output mcasp_aclkr,
4 g) l9 [/ {* @9 H" foutput axr1,$ ]8 W0 c" t* }2 d
assign mcasp_afsr = mcasp_afsx;4 x0 j: b5 @( u; {  Y/ e
assign mcasp_aclkr = mcasp_aclkx;+ Y5 [. `& {8 }' R0 ~% s: l
assign mcasp_ahclkr = mcasp_ahclkx;
3 {; p% w) d3 V. R& y9 j0 _assign axr1 = axr0;

5 _3 @' W0 p2 I: |' b2 n& K. b- ?; N9 t+ V
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
/ B& n* z* \+ f7 J! m7 C7 l
static void McASPI2SConfigure(void)
; `# D% j- C) _* H, N{
9 R6 h  q0 h' E/ ^McASPRxReset(SOC_MCASP_0_CTRL_REGS);
2 q8 ~9 }# |3 o5 IMcASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */7 Q- p# ^: V# g) s
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);6 M! {% h& k3 d' s
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */" A6 u$ t! U9 M! X9 Y2 @
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,! t; m- ^; B) A; |) J" h3 c
MCASP_RX_MODE_DMA);
  r, R& |8 f# a& WMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
, F8 a! l  S! _/ R# Y% iMCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */% h( o" G4 E/ _% A5 b% o
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, ' _' o6 Z$ c; o& \+ W$ h. \# b! p
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
. G% ?4 r: k+ w& N8 H* ?McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, ; D; |  \; s% C+ S$ ^7 x& V8 A
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */
5 F: Y* A& r5 U9 T3 T; N* e9 G& X" M8 OMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);- L7 Y. {# g8 H; Y2 r
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
$ `, w. }0 W& Z9 `! jMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,& T" }8 k0 q8 c) X: O, a
0x00, 0xFF);
/* configure the clock for transmitter */9 [; ^' M- W) H. R' @1 ~7 `# F/ O
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
& q) i' G' ]0 JMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); - x& [0 s8 Y4 P- B
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
) l6 D# H0 Y. F9 k0x00, 0xFF);
7 l% Z, m4 i2 [: H0 a( O3 p, [5 Y; U! t
/* Enable synchronization of RX and TX sections */
" K% a$ _9 P8 _& h" m; z! h2 ~McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */
( H7 [$ d2 e( u" A! L: hMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
5 ~! Z! H- H0 g* t0 a+ OMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*
! y; p- F$ P* y% \" ]. F** Set the serializers, Currently only one serializer is set as) |; _# B( _7 G4 Z, m
** transmitter and one serializer as receiver.
8 y/ {/ g. J7 U6 y. [: y8 B*/1 S4 ?  a+ g% c
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);' a9 @! V4 V! T6 b
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*
* `( o$ U3 I/ C5 c$ \3 A** Configure the McASP pins
* k% |) g, M% o9 f** Input - Frame Sync, Clock and Serializer Rx: c: R$ E7 S- j, G/ Z
** Output - Serializer Tx is connected to the input of the codec
& g7 f+ _9 E# }7 `*/% ^& L' E1 H. w6 R2 _' y  @
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);6 F$ z; D0 j9 f! _; a7 o( e
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));0 a) s3 E* Y+ z
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
( S1 J  x- I* Y8 W9 B; f| MCASP_PIN_ACLKX
, U" ]; w' N3 G| MCASP_PIN_AHCLKX; l' F* D0 j  T6 d! J' N
| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */
: Z. p) X9 E/ k+ F; ^0 lMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR & Y" G, E" U; Q. O
| MCASP_TX_CLKFAIL ; F) ^% j, r/ q% h8 w
| MCASP_TX_SYNCERROR. \2 Z% @( x' o+ G# v
| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
( E: z  d$ H* {( C| MCASP_RX_CLKFAIL, o# \; }) k- N
| MCASP_RX_SYNCERROR , ~. V8 g) p: s
| MCASP_RX_OVERRUN);2 ^& S  H8 c3 X0 T: k
}
static void I2SDataTxRxActivate(void)
5 w" t. k! r0 p# k6 ~+ m{& Z) S, N3 J1 P4 e; S; j4 _3 S
/* Start the clocks */9 a2 K+ t- v% V) \3 s
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);6 u. v1 V; Q* e. s: }1 M  D
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */+ T. P- c0 d0 R7 R1 y4 v4 ?5 o3 _
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
9 P. G, L: g* QEDMA3_TRIG_MODE_EVENT);6 O' k& b; I- {  r5 F0 k
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
0 I7 y; Y4 ]9 AEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */; g4 T. C- R2 U% C% N
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);* a4 R& G' S0 x& n2 H1 L  O. O
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */+ X  q  i4 M( T$ O$ K: Q4 {
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */+ V; C/ V% \" Q+ b3 d( x% d% U
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
6 Y! L# }/ {" _" C5 s, g$ @& JMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);
9 T" Y8 \0 h/ {* u6 I/ r: p( G}
+ [! A8 Q) D* \9 K
请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
. g  H% t! R4 P





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