嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,
' ?8 R: [4 G* h2 jinput mcasp_ahclkx," z/ S& n8 K: W# V# O/ S
input mcasp_aclkx,+ i' s' q) z5 l9 W1 {5 i- j# y: g
input axr0,
& b1 P! L4 ?; Z% h$ V& a' y2 j. A+ m/ x# m7 O) L/ B4 r5 E4 C$ K# C
output mcasp_afsr,
! z" g$ O1 [/ N. M) w' G; D4 P' i* q% Eoutput mcasp_ahclkr,
f1 p, Q/ ~( r; ~# |, r. houtput mcasp_aclkr,
' J; m0 l6 f/ m0 d. y; ^output axr1,
3 J0 Z* i+ y4 Z7 \
assign mcasp_afsr = mcasp_afsx;
7 V# Q5 m3 w f" @) C' c+ |assign mcasp_aclkr = mcasp_aclkx;
1 ]3 I! `2 W: B1 I* l6 fassign mcasp_ahclkr = mcasp_ahclkx;
) m4 u U$ b" i2 yassign axr1 = axr0;
1 T/ B' |$ i' v, _2 B# h( @7 l; [+ q: L7 i/ y8 O
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
" f5 Q) s2 H, W' rstatic void McASPI2SConfigure(void)
) Y2 a; B6 c% v9 B{
7 v4 K- v7 I& ~1 DMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
! w! s5 P. j- E0 E0 b/ N3 k4 T% |McASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */
# o4 f3 y2 p) \% \: b( gMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);3 u5 `2 |: ~7 G( M4 V
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */! Q7 o0 T a% }2 p! {
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
& A) o7 ~$ Y* i" w8 wMCASP_RX_MODE_DMA);
- Z" v7 ~6 O) M! q" w: DMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE, ?* |0 o; D& i8 l9 X7 S
MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots *// Q$ r3 U8 ~& o: _3 X8 w
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, : b8 ?& }: o: S6 g# W' I1 [
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);. t: n B+ z7 f1 |: j
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
/ g# ~ f1 e3 c; FMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */$ e% C$ P* s ?; L2 J% s4 G
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
3 _# z4 X; Y! M$ DMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
- r% v& i/ J4 k* s: @* f$ x* l! OMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
" E9 i9 `; b4 s0x00, 0xFF);
/* configure the clock for transmitter */
, U7 q6 d) T, ?$ G }) ^McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);) S) k7 M0 |: _ L2 i
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
# S- @ Z7 ^/ `9 h3 V. N% VMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,) }2 i6 L. U) T6 E4 l2 ?# d$ E
0x00, 0xFF);2 k b% T. w- _/ |( v- u
' }; f6 R& H+ F5 G+ G; Y0 A/* Enable synchronization of RX and TX sections */ " \9 g, u1 H0 Y9 `
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */
$ O# w [3 ]: {8 HMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);2 M$ p0 ~* M' Y: l4 ~1 v( B
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*9 f3 S; I; N3 n) R2 \1 i6 }
** Set the serializers, Currently only one serializer is set as. B! a' H5 j. ~" n/ ?
** transmitter and one serializer as receiver.
! |! K& I. R5 i" Z: T*/
b$ d/ }! v5 Y5 v$ R& U+ IMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);5 t9 ?. N( o8 V& {0 }, x; Z
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*- Z* V9 ?) k- J2 e; N
** Configure the McASP pins
3 c" N. C) U6 D" O) Z& ]** Input - Frame Sync, Clock and Serializer Rx
- G+ i6 b$ h* f4 a, b** Output - Serializer Tx is connected to the input of the codec
. A0 [) {) d/ V7 }*/2 V1 H% z0 ], v
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
3 d2 I) {+ G" ~3 B2 T2 VMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));, p; M- N1 ]" c8 c/ \4 v1 W
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX) s5 j2 Z9 V! K2 Q6 y
| MCASP_PIN_ACLKX0 H; O8 S O9 [1 l# m# v
| MCASP_PIN_AHCLKX
( n% w8 I2 I; S. Q5 l0 G| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */
2 l4 K W2 q2 b. R& K2 A nMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR ' @8 w X m0 |$ E3 k. i
| MCASP_TX_CLKFAIL 6 b+ c2 ~" U/ h# P E( U; d
| MCASP_TX_SYNCERROR
- B- O5 M6 |9 O4 Z; d+ f2 H* k| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR 3 s3 Z+ x+ S- c- G
| MCASP_RX_CLKFAIL& @3 _$ l# Q% j, d' K3 [
| MCASP_RX_SYNCERROR 4 \( v6 l. x# v" i" u: k4 p9 F/ C% [
| MCASP_RX_OVERRUN);
6 f+ W* W4 R0 t# B% H}
static void I2SDataTxRxActivate(void)
$ q }! ~; k3 s3 } U5 ~{
* }2 c" ^3 s9 G3 F) i# A) x/* Start the clocks */
; o, f' P3 Q0 W% U1 T: }McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);: v: ]+ s" }! k2 C! b
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */
# j9 n2 n: A0 Z: z- P9 H% B u' FEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
, {1 V' }4 i; d/ s" o9 E: MEDMA3_TRIG_MODE_EVENT);( `: r' L* C1 `& J
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, " ]% e4 k9 {" Q* Q6 E: n
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */% F8 Q4 f% n5 o- u/ l
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
/ d. a, Q: ] \6 B7 SMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */0 @$ _2 c/ h8 }% M: y7 j8 n
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */) x( ]) F6 V3 C( _, z* d
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
/ n8 r2 v8 y, d, A$ i. U; [7 W$ sMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);, {( e' p# x4 |9 P
}
8 z) ?, e- ?' c, f, d9 p请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
% E/ S% W# i e1 j
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |