嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,- r. p3 N7 q% n" ~
input mcasp_ahclkx,
" N% \1 g3 t0 [input mcasp_aclkx,+ o& {. Y. I# Z# V
input axr0,$ T) }, x# E3 Y' g0 d7 n4 O, [' Z
) e% o/ I7 Z) {+ Y7 | J
output mcasp_afsr,! ~" I! \: u; Z. [
output mcasp_ahclkr,/ E# e4 @6 v8 f1 I1 ?
output mcasp_aclkr,
, a/ K# C% V& poutput axr1,
# W4 _# M7 W1 }' N7 f
assign mcasp_afsr = mcasp_afsx;2 Y7 v* o; {- F
assign mcasp_aclkr = mcasp_aclkx;3 n. ~4 Q" u* x; \
assign mcasp_ahclkr = mcasp_ahclkx;
: c) m9 O% B6 massign axr1 = axr0;
, n4 h& O+ B- X# j$ u8 B( I8 r; E9 U0 o% {5 \
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
1 n4 b! J9 ]5 @0 G astatic void McASPI2SConfigure(void)
0 A) c4 l! Q) u{
8 _. @% q8 ?* G& @8 |5 K4 NMcASPRxReset(SOC_MCASP_0_CTRL_REGS);0 l2 l% h, L3 u' e, V' X" T: N& f
McASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */
: U" i0 L/ f8 zMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
: J& m ]& _$ _+ v' ?McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */
8 }$ D* m8 Q8 c+ z7 p8 PMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,- D' E8 r; e' g& g
MCASP_RX_MODE_DMA);
7 l! j; t5 Y8 A* u/ z! Y: D+ n9 CMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
8 h. H% c2 O# ?4 B$ B! J2 eMCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */
/ a* ^5 L- L: V3 mMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, 6 @: ^' J5 v& B- A" p# i) [/ g; b/ }
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);, P; c# l# {7 l9 U
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, / b/ f) [% {" ]% c
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */- _. [8 s1 V! U
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
! u9 [, K# }0 s4 t, n2 L0 \7 aMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
" a3 `9 H3 b- H( nMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,. c& M+ F( v; G( }
0x00, 0xFF);
/* configure the clock for transmitter */
a! t: R! E* D' d0 HMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
, m# o5 v. I; U8 C* `& YMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
B7 Z* [7 b) ?' u# M4 iMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
0 S1 r% O" t& M/ i/ ~' Z, E% w0x00, 0xFF);) _$ ]4 v% E0 q0 I6 ?
; s; D. q- j) W; O' @ G, V! z
/* Enable synchronization of RX and TX sections */
: g" R' n, G8 QMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */1 O4 l7 x8 q; A# K& X) ?
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);; {% X$ t" [( }8 L& ]) \/ Y' l
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*( z: F6 e; D( y! R! W) U
** Set the serializers, Currently only one serializer is set as
7 {. J2 M- I& L: ?- H** transmitter and one serializer as receiver.' a; k5 Z) f; l
*/
! |; W, u5 A/ S$ VMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
/ H; q2 c) P( s+ JMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*
! J* T. Q" z* H7 f+ O** Configure the McASP pins * @8 k2 Z: d& t( C/ |! M0 h3 N6 M
** Input - Frame Sync, Clock and Serializer Rx9 \+ K0 ]2 j" e. f5 `
** Output - Serializer Tx is connected to the input of the codec
) P! i1 Y8 ]6 `1 I+ P. q2 I8 A*/" ]: }4 v4 _0 V, ?1 B6 n7 @; D
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
- b1 u7 H7 ~$ `0 T5 aMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
# n( x1 i; O8 ?2 }5 h8 \! KMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
- |' Q' Y# L( F. P' X t, C| MCASP_PIN_ACLKX
+ O- w k- P9 T# y7 H| MCASP_PIN_AHCLKX! [* R1 Z$ |9 ~: f" `
| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */6 x6 u* P' d3 ~6 F- C
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR 1 x7 m. {7 T8 x! m. Q: U! g
| MCASP_TX_CLKFAIL
! B+ v4 W& I/ d| MCASP_TX_SYNCERROR4 @2 L/ @5 `( C: a" V9 v0 n4 @" J
| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
- C9 Z. Z- ^4 J7 {) `, x| MCASP_RX_CLKFAIL
. R5 |) P' C6 x- {7 N7 U4 I| MCASP_RX_SYNCERROR % k8 m( A- ?6 r$ }3 p( {
| MCASP_RX_OVERRUN);
) ~7 A! o: ^( ]3 ^$ j% [6 T2 b}
static void I2SDataTxRxActivate(void)' p: _# J: {0 p8 W* t B1 w) q
{! O' X4 \3 k& f+ ~* S4 _
/* Start the clocks */
) }) h9 C& i9 o* W. o, bMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
5 L/ ?2 L! x( sMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */2 T T% J8 U/ Z2 m
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
: S+ o9 O2 e; S' f, AEDMA3_TRIG_MODE_EVENT);; ^6 `6 |" x1 ^6 Y& {+ L: w
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, 7 V, W3 `9 g/ x
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */
. p$ |! z, C! a" PMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);" V a8 V' u9 F F$ C4 c0 q' e; n
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */
f+ X3 X! I% @' L3 {7 _5 C. mwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */
7 L( ~/ z( q8 d+ ~/ f" iMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);
4 K1 s0 H& s2 n8 |1 d6 kMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);) I( v# X5 B1 u( O
}
8 f, l5 i, c1 Q8 A, {& | T请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
( A" w0 n+ I- ?, N1 Z9 E+ `9 A/ V
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |