嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,
7 s* s6 j# G |2 ]9 ainput mcasp_ahclkx,
; d6 r# Y! g @2 }( i" k* B& Dinput mcasp_aclkx,
" x! D% x% D4 u) t7 c4 ~: Xinput axr0,
' w9 L4 ~% B; T# r- `& [: v2 n |1 p3 h2 h. r
output mcasp_afsr,
0 O7 K4 b7 A$ H; d' j2 Routput mcasp_ahclkr,
$ n+ @' M4 ]2 N$ R4 G. voutput mcasp_aclkr,( p) n+ f: J1 w
output axr1,2 m: l" Z: m% r1 w( s
assign mcasp_afsr = mcasp_afsx;
& @) L2 E l0 E( z% G- Eassign mcasp_aclkr = mcasp_aclkx;
! u: q1 w$ B0 Y+ G% Rassign mcasp_ahclkr = mcasp_ahclkx;
9 N% f s$ O; x" ?assign axr1 = axr0;
5 R+ `1 F" f( z" Z; X# G" i, G% }; y& c
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
! w& k- {, V, N- b$ C. m) T
static void McASPI2SConfigure(void)
; B& N: t. \: \% K4 S& T{' c/ `% ?2 }0 Y0 {6 N
McASPRxReset(SOC_MCASP_0_CTRL_REGS);5 X! ~4 \' C* f5 i4 D; A& X
McASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */
5 \" E/ G: N) XMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);6 e# m, e( m ?, o( |8 p
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */1 h, M- v# Q* l( V' ?7 u
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,9 I* V m$ `) t1 l* M# V6 u
MCASP_RX_MODE_DMA);' h. _( a/ d0 N$ i a* b
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,6 ^) J5 H" [/ a3 z" S
MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */1 S; }- b! _+ m& W, _# g( g
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
7 h2 {' @; {1 k) g4 eMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);: d; e- s0 i1 n" N, g2 _3 s, F
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, ; `8 b$ `( q2 q( z- A
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */
7 C, ]: m4 P# |: R0 }McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);* S. ~, g) C }& I( N7 } T
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); $ u4 f! h) W3 @
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
) O5 z" ^4 `0 n& a0 @+ B; c0x00, 0xFF);
/* configure the clock for transmitter */
- X0 m5 e( s+ r/ i& nMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
$ ^* `- {, L) V: _, MMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); 6 l( [' E5 N6 n& k
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,- P8 `/ M( j1 d# `
0x00, 0xFF);
$ W6 P% C% }. R# e
' Q# N" E* q& c4 j! q) |/* Enable synchronization of RX and TX sections */ , h5 G' t& _. e' V% ~9 X, k
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */- h% Y2 {9 Q1 c6 s, a. k& D6 C) w7 J
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
" @ I! d5 P7 V. n: w5 QMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*
1 o% Q1 h# f" |5 f! i** Set the serializers, Currently only one serializer is set as
( [( n1 T- J! ~$ G$ o** transmitter and one serializer as receiver.
3 _+ G. m+ L/ ^* j2 |' |8 D2 g*/
0 ?4 \2 c5 o$ K L9 }6 nMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
, Z# f3 Z5 T* ^' X3 H' Z3 O% iMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*3 r' m* ]) {6 Y
** Configure the McASP pins ; c6 {6 Y" A [8 I9 Q' F4 J2 x0 L
** Input - Frame Sync, Clock and Serializer Rx% t5 K# I8 Z3 E1 l2 j
** Output - Serializer Tx is connected to the input of the codec ' H3 l* Z# _$ b2 {- |
*/3 h+ a. A9 K5 t/ u
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
+ }+ o0 J& e; j6 g: [McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));: I; G' p6 W' r# z
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
8 [+ |4 y. c' E. k6 x| MCASP_PIN_ACLKX
4 }( K# X6 b5 y& X9 Y| MCASP_PIN_AHCLKX1 r2 R, Y& j4 _( [
| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */% a2 D' ~! F2 T; R. i/ i3 Q+ t8 ^
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR 8 i! [" p7 g: Y A6 R
| MCASP_TX_CLKFAIL
1 r* e% T+ l3 C6 d6 K6 C| MCASP_TX_SYNCERROR
" s, A+ \9 w/ S: Q) {8 T0 Q| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
9 i/ [. a# |! a7 I) M| MCASP_RX_CLKFAIL' O) \; P7 b4 R, ^' [2 r/ O
| MCASP_RX_SYNCERROR
% [& ^# X1 T1 h1 P| MCASP_RX_OVERRUN);* w/ x) i; u- J5 h P
}
static void I2SDataTxRxActivate(void)
, R# O3 h1 z8 C2 N4 B3 T{
# H9 T1 W! C8 V1 a& K. O+ d/* Start the clocks */
0 R3 a( M, V; h6 L: j& b# I/ [McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);6 v$ n" C1 z# c4 ]) |1 N5 t" |
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */! J. j* d8 e5 L9 T
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
( c. @0 W& I: X' FEDMA3_TRIG_MODE_EVENT);& q% I1 q! F9 h: m2 }
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, 7 P& z% [& n* O0 m
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */
; s( v: U4 v1 j' Z$ x7 }( p1 n! JMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);# D: G1 W" e) @: \; D- Y
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */- [0 w- P7 y; C" r- I
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */! d2 n6 X/ W4 E# X7 `
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
4 G/ R+ t h" c7 n& x8 K- c- ?McASPTxEnable(SOC_MCASP_0_CTRL_REGS);7 o7 O3 ^6 M6 D( G1 L- R" O4 F; O; G
}
7 p( n( C7 {; T# Y4 z" `
请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
' N: A8 |; @- ~: m! m. {2 T0 c
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |