嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,
& V0 p5 ?* t1 B( u* w, ^input mcasp_ahclkx,
$ u$ I& d, V1 z: S' ~ hinput mcasp_aclkx,
$ f. B2 P3 N3 {3 [4 @" }0 z3 _input axr0,
7 ]8 B) M" f' b# P( H- u1 c: i2 n/ W( J, s8 v! v
output mcasp_afsr,- E7 w: D" k3 t$ [- \; Q% R
output mcasp_ahclkr,
: I$ T ]6 B% Zoutput mcasp_aclkr,8 ]/ g d3 v6 ^" f. `6 n
output axr1,
9 M, N9 M/ B& @
assign mcasp_afsr = mcasp_afsx;2 A0 \2 ]3 d2 d. T+ I$ _
assign mcasp_aclkr = mcasp_aclkx;5 ~" e! N7 k5 A% ]% J8 j
assign mcasp_ahclkr = mcasp_ahclkx;
+ ?! O5 U& w9 h- w/ p0 v* |0 wassign axr1 = axr0;
+ d. Q/ }' Z Z& M1 @8 Y$ x- C) \! l" \7 r9 ^2 `% i
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
( z/ H" _; ?5 ^% ^static void McASPI2SConfigure(void). y M3 r. W2 y
{
; K9 S! b8 |7 a% l" P, K) hMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
2 G9 X% [% l3 r8 v' f3 e/ b( u/ hMcASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */" {. V; |' p3 I+ O0 E
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
5 C- G+ h% _9 l C$ ^, J- l1 GMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */' h0 [7 } L: @$ C. _0 @
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
/ R* G9 D1 c+ a, R* PMCASP_RX_MODE_DMA);* [5 [3 Y; u! ~; q2 M; C; N
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
* o6 V/ B6 Q* F+ R: O* L$ I" I5 XMCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */
" F$ r) Q- E. V. g$ m0 k$ ZMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
g/ w" x" j+ c# y5 R* p* B4 fMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
! Y0 ]! j0 N0 P& pMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, . e3 F7 a- L- u$ p) [
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */
- Y* W$ P; V; L4 _' NMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
9 e# x# W; h+ Q# a8 n+ fMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); & x/ R. d V" ^4 [" U, C
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,* a( f" u/ \' h1 H% w2 }2 l) A: ~
0x00, 0xFF);
/* configure the clock for transmitter */! w4 L- e" E1 `. y# I+ K) d9 q
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);) s) _, J; \" z! r6 K
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
0 S8 {0 A1 l! H) F2 D- SMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
* F# V9 @+ O' e* k0 t0x00, 0xFF);( M u }5 [+ j( D) b, G9 Y2 F
) e4 ~& a9 E. U/ m0 ^) g! b$ a
/* Enable synchronization of RX and TX sections */ 9 K! {9 L9 O2 K
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */
$ E+ P6 e* H" p, c8 U0 h9 @# f) z, BMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
7 k3 o' f/ X2 e) y7 I* HMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*
% i R0 @0 Q0 ? f I! t9 s7 T** Set the serializers, Currently only one serializer is set as0 [3 c0 }* |5 W
** transmitter and one serializer as receiver./ X f1 [* f( l+ v% f1 K
*/2 S z, K$ N z: s0 n- q$ @
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);( ^/ \5 z/ G0 f/ I" }
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*
+ d9 p! q3 k& Y; L** Configure the McASP pins 7 J+ B# G7 Y8 a: N' l" f
** Input - Frame Sync, Clock and Serializer Rx
: u; q+ j6 U8 `- F# M5 i# i** Output - Serializer Tx is connected to the input of the codec
/ y: } o6 V; o5 L: Q2 O*/
7 }7 A8 h @/ _McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);! i2 m& t) X$ c4 B+ G$ p: N
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));' A3 |9 C0 m$ Y+ C' {" d
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
! G: G7 H( Z- N' a| MCASP_PIN_ACLKX6 ^) f$ z& O" l ~+ g( f, |
| MCASP_PIN_AHCLKX) V l6 X) `8 _. h+ ?7 U
| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */
" ?* v* d/ l& b P% `: vMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR % H/ |6 N+ H: E
| MCASP_TX_CLKFAIL / x" @' ^+ T% Z$ f# f
| MCASP_TX_SYNCERROR4 S* d; P; F. _
| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
3 j8 a1 z& u0 N9 o! o5 W3 K0 w5 C' e| MCASP_RX_CLKFAIL
* u+ O- x6 C- z9 r% e3 ]| MCASP_RX_SYNCERROR 7 l( K9 V7 j& n, t4 K, o
| MCASP_RX_OVERRUN);/ U/ Y5 e* d0 k6 b9 I' d
}
static void I2SDataTxRxActivate(void)2 C6 ^$ d/ t" ^4 e# v' M
{
' w ~9 t9 e$ p% j* S1 e' F& V. |! U/* Start the clocks */
3 B* e# F8 J4 T- z3 sMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);# C* N; P# Z7 x" ]- L) k' M
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */
& v& n/ }/ T* s! H( UEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
! b }9 ~7 P9 C1 d( P YEDMA3_TRIG_MODE_EVENT);: M; k* V) M! C' W6 J6 _4 G' k
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
" f5 X% K; | GEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */
3 b- n$ X, G {4 Y! zMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
6 X. ~7 D" M. x- T% b: v6 i% TMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */
) b! q: K- D1 |' A3 hwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */( [! V& W Y9 W- p9 i# I m; A
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
! C" {" U' s0 s' _McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
+ {6 W0 @: U$ ?9 h* K6 }$ X}
8 R1 x1 U# D! X5 b) l4 X
请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
# ]% T' l' Y+ L! d) O2 ]
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |