嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,' `, o5 X. B8 t$ V8 ~. D5 H
input mcasp_ahclkx,
$ q- F& ]- Y) I/ ]* d% ~* w: e# qinput mcasp_aclkx,
3 T, [3 s# F, J; minput axr0,
: [6 W& b: N/ Y- n3 E: E0 p& `3 E+ R/ Z* S5 A* Q+ p, V! ]) q
output mcasp_afsr,, @/ G! r$ f$ A+ H0 I$ n) M
output mcasp_ahclkr,
y; j, T! i4 [! f% coutput mcasp_aclkr,2 h" @* w) q. ]+ m3 n/ i+ o
output axr1,
7 {2 t4 R: `$ o$ R1 L: p
assign mcasp_afsr = mcasp_afsx;
3 S4 H% w7 n( massign mcasp_aclkr = mcasp_aclkx;
0 T9 n* ?; Y9 u) E, Aassign mcasp_ahclkr = mcasp_ahclkx;
# Z) _2 `' X3 j: a1 Wassign axr1 = axr0;
, q5 j4 C2 M/ X" D( A
" c" S+ V8 _, s" Q; c0 h在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
$ U# B7 p k O [static void McASPI2SConfigure(void)
8 F2 \. }7 C- a# @6 y# j{
7 I: Y T! _) jMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
I+ W, {( T5 w! V, lMcASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */0 i) e W. F T# ]# x% _1 t
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
# ~: u1 `5 {" k6 ~9 t# l, y+ }McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */6 b7 e/ _ `+ g9 M! a* x
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
Q) r% G! e8 P9 u* LMCASP_RX_MODE_DMA);
- t0 z% |3 e# Z1 T: S6 l) _McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,9 ?) `. }- X. C) S1 w1 ^8 ^3 {3 a! p
MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */7 O- n/ M3 Z2 F
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
+ z# O, _# Q) z2 |. VMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);1 K k& F( V3 |* s
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
# U2 ^, o( O4 C' x# }; ~MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */
4 B u) I2 U8 Z$ Y0 v, K2 UMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);1 M0 P* c# w. v. f# ?
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
% V4 v4 c. F& {McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,: e- P* g6 h' e
0x00, 0xFF);
/* configure the clock for transmitter */
) S; R6 [7 J" [7 Q6 KMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);7 N6 d9 U6 a! u; Y9 o8 ]7 ?
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); 4 ?4 M0 u+ }* Q7 O" |
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
! y, y; p- Y5 j0 r; Y0x00, 0xFF);
/ d! x w- [% H5 y6 K7 O
8 J5 c' P! F/ y. {/* Enable synchronization of RX and TX sections */ 1 z4 r9 o3 j Y8 q/ h; P0 s/ z3 m! G
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */3 M: S x8 |7 S/ q1 G
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
# M- y. g) j0 p5 [" i4 Z5 dMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*7 ]5 r4 Z: v% @, l: [
** Set the serializers, Currently only one serializer is set as) k9 w/ c4 o7 x9 e. z+ P) o
** transmitter and one serializer as receiver.
; H2 T4 F7 s# K4 u `*/% O" ~0 O7 \6 C6 ?
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
# e2 g5 k, D [- d3 |0 n" l+ SMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*
# S! b& g; c i$ b1 o** Configure the McASP pins
4 h. d, F2 g. V** Input - Frame Sync, Clock and Serializer Rx- S8 D; H" U' D# d
** Output - Serializer Tx is connected to the input of the codec ?" |. n/ V5 ]! A4 |8 f. [/ [% C
*/
9 V7 h1 W I7 i" _McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
0 L/ H, E% h6 z4 I: I9 Q9 qMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
' K* S! _( c$ W, y$ a* g2 JMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX* }. t( y4 F3 D* R3 ~
| MCASP_PIN_ACLKX
/ y+ h3 m$ T2 L) k1 `: q| MCASP_PIN_AHCLKX
& o2 h. b) |$ j: W| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */
1 _# O- `8 i# ~McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR " j0 T% l1 Q; Q( [
| MCASP_TX_CLKFAIL
) W0 L1 p1 y; D6 R g9 z& ~| MCASP_TX_SYNCERROR4 n& a9 V! P# m' a/ l2 _
| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
" ?% k$ x/ n* r. Q/ || MCASP_RX_CLKFAIL Y2 x, }1 I) H0 N; z: {
| MCASP_RX_SYNCERROR " y1 A3 M* E; k2 A
| MCASP_RX_OVERRUN);7 T3 r* b$ v7 _6 z
}
static void I2SDataTxRxActivate(void)% \3 D( |4 g$ y- F
{
5 U/ R& A7 u, V z9 K/* Start the clocks */- @. T0 L, n* |. l* t
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
[0 _/ S+ f5 i1 B# t+ {* @: z; _McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */1 Y2 h! A, O. z! i
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,( P+ e/ e8 c3 ?. i) y$ {
EDMA3_TRIG_MODE_EVENT);
) p( g: B$ r# s1 j4 S, v- K+ zEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, 5 |8 ?2 ~4 z; v: `" |
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */
1 d% V& \2 w0 z+ x5 ]; u" cMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
/ x5 z7 ~6 w( m/ a( oMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */
6 \# |' \& ~9 [0 r8 J2 N/ J3 iwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */
) R. q: \2 a% {; A4 i/ AMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);
7 A& r# L* y) ]4 A% tMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);9 y+ D* R% {) U, C. u' z$ T
}
' w3 h6 V5 P/ c) h+ E
请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
8 E3 a. b8 T( s" J( [! _6 u9 ]
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |