嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,
+ G6 G2 L A, o% y9 ]* Finput mcasp_ahclkx,
( p! W' P9 N, R$ W( r: v. r" h& dinput mcasp_aclkx,
, t0 M' R# z3 n/ C/ \input axr0,1 K8 Z& @' Y, |* T
& A! Z$ S1 O& S/ Koutput mcasp_afsr,
! a- W' c4 o T, Y. v) f1 Eoutput mcasp_ahclkr,
+ ^( b: N9 r, zoutput mcasp_aclkr,
5 I( L" f; G" F- S* T! f- K+ W( O/ ~output axr1,3 \6 D' B% h6 ^5 t ?4 ^2 Z, Q
assign mcasp_afsr = mcasp_afsx;5 o9 K5 k: I9 i! y9 {" Q/ J% [
assign mcasp_aclkr = mcasp_aclkx; ? w+ o7 u8 E
assign mcasp_ahclkr = mcasp_ahclkx; Y8 n) ?8 B8 G( i4 E) ?
assign axr1 = axr0;
0 k: H# j+ u7 W. ?
$ F6 t H: w) U5 h; S- `
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
. P9 k! T$ `% j2 e" t# S) X. S8 n
static void McASPI2SConfigure(void)! A* q! D3 J) A1 M
{
1 E, b3 _2 w- Z9 s' \McASPRxReset(SOC_MCASP_0_CTRL_REGS);3 X: ]+ u6 Y% [( V: @, U
McASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */
. D) z9 U; ^# K1 M, w" CMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);. [7 A* m' F7 T0 V2 ?
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */% o5 L, ^/ Q: G1 P
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
s1 K) m' p& C( hMCASP_RX_MODE_DMA);9 B: E8 Y+ W: U: c. r4 J8 f! M
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,9 s% n8 p, C) |
MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */9 R+ o' i2 N/ j' z5 i
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
7 ~* ]% E: W* e# g5 DMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);* t) r0 U+ s3 M5 ^
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, / h1 {# n* a, }6 f8 O4 Z
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */% N; W7 |) X1 |7 [
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
0 h4 h1 j# p1 |: t, [ ~McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); - T1 q) I- Z. T. H$ l
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
0 l7 p& p9 z& v4 ~0x00, 0xFF);
/* configure the clock for transmitter */0 d0 O( T, Y8 ?* s# @
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);4 U$ K# P# q F; e7 v9 ?
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); 4 W) [, k9 P1 \( o+ |. ^# X! @6 X
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,# C+ X, x, F: k+ _" E. o
0x00, 0xFF);7 y/ s/ v7 n2 v- N, c8 D8 z
0 w! r* N# W% P5 L
/* Enable synchronization of RX and TX sections */ 0 C, I1 L; w% G
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */- ]4 ^2 v M8 ^3 g4 z/ B
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);0 |, @1 P5 k7 B- u' C
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*4 H0 U, N) _; ?4 T
** Set the serializers, Currently only one serializer is set as
+ W1 d8 T( ~& n5 p' [6 P** transmitter and one serializer as receiver.
( a& A( z, [8 `*/8 W8 `1 Y; @/ [) j$ h
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
+ }( G1 q9 A- {, b7 F8 d/ pMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*
& J7 z. _" x# Q. h7 C# y- J5 l** Configure the McASP pins
+ O! o& x0 [% E0 I$ M** Input - Frame Sync, Clock and Serializer Rx& i6 f4 C( L; g) g# a" @
** Output - Serializer Tx is connected to the input of the codec & f C3 Q- f) }" [3 M
*/
% @2 z. a" h; |' I& hMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);8 @) l' t' }( ~- A: J$ t3 v" b5 y
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
9 o, c- @! [9 q# q" V( z) I- g+ HMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX- i% _7 j/ }# \0 a9 [
| MCASP_PIN_ACLKX8 R1 i7 I j: g
| MCASP_PIN_AHCLKX0 M: i* h4 j$ D% K9 z
| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */+ F* C+ k4 f, Y0 Y
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR . O/ f# ^1 w" Q2 k* q
| MCASP_TX_CLKFAIL 8 y H, w& t& t8 X
| MCASP_TX_SYNCERROR
4 s1 V0 t- r$ P& q. Q| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR ! X/ Z) C( p$ i* G) O* [
| MCASP_RX_CLKFAIL' \2 C- `5 p8 ~' S5 K
| MCASP_RX_SYNCERROR
# k3 f( [1 E# b| MCASP_RX_OVERRUN);& `7 T3 d; |$ _0 L) l/ v
}
static void I2SDataTxRxActivate(void)9 {% x6 Z9 @1 w7 i
{
/ ~1 s* o3 N( S {5 n/* Start the clocks */
7 U1 u5 h0 S$ l' vMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);% X$ M6 t6 C: \; f# @ p* }
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */
/ Q; X9 w) e6 e2 P5 w M8 z3 PEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
+ f. y% |' o: A" [( D4 `* K- zEDMA3_TRIG_MODE_EVENT);
j5 _9 c# a/ J5 E+ L* ^6 vEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, : i% E+ q0 b8 \3 ^! E" B/ x
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */
9 q: o; [, o0 E& Z8 T" ?8 @/ @McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
5 c! N$ B: x0 \2 v2 W5 y5 zMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */
+ J# L" l% v: R) lwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */
" N5 P6 f7 [3 s% y& O* QMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);( ?) B9 w% e7 t" n3 }
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);; I" z. O7 i1 c1 J
}
6 o5 p8 q. x1 m7 O: C请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
& ^+ s/ b; d/ I% j. g& K( P
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |