嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,
; y$ I: @3 D( V. w- Kinput mcasp_ahclkx,5 H% T8 ^& R% b2 f( q( r v
input mcasp_aclkx,
- _% l/ Y9 S, n/ l- n7 ]( p+ Ginput axr0,
, n; ^; j; o6 P5 Z
0 I3 ?% [# J4 K8 @: E% a8 ~output mcasp_afsr,
+ U$ Q" Y# u) x6 R# J! ooutput mcasp_ahclkr,/ h* t+ I$ ^( A3 B$ r
output mcasp_aclkr,
. h) j8 }- f3 A- p9 loutput axr1,
9 A1 k9 X% Q# T8 P
assign mcasp_afsr = mcasp_afsx;
2 S: a$ M4 T2 [# @assign mcasp_aclkr = mcasp_aclkx;6 A8 ^6 q# X0 V8 V
assign mcasp_ahclkr = mcasp_ahclkx;: B# D) T7 ?2 q
assign axr1 = axr0;
6 \7 L+ e$ c$ \: a$ o% e
& W7 D' l2 ~7 d% ?9 |
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
( d) i/ |6 E* T# ^static void McASPI2SConfigure(void)4 [5 n" w/ l4 B& {6 T
{8 F1 C- f; k* t" |" x* p
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
+ d- I9 i9 X, ?McASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */: u x Q! e9 M) k3 o: L4 }
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);3 S9 d9 u5 ?5 j6 J0 z( c9 F
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */3 |3 R8 o5 w" k+ j. U+ z
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,/ r" a0 d- P1 U! ^8 u5 l
MCASP_RX_MODE_DMA);2 Q( Q) d0 C2 ^7 n( J5 e! t; H O
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
/ D0 P4 O0 j1 [2 G$ { j. lMCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */2 u7 l$ G6 I: v4 ~
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
- m& I0 U2 @/ H1 ]# fMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);7 ^1 O9 F5 _9 C/ Z$ V! I: z9 v- G1 K
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, " i, w, h' n$ R% t5 v7 A' Z. E$ C
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */
$ \" Z6 I& _* b L" \McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
, C q3 W5 o! x8 m- jMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
G- O ]- ~3 F [3 x) J1 gMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
4 A2 s/ E |7 p k) _0x00, 0xFF);
/* configure the clock for transmitter */
1 |9 i# A! Y) b" j' t N8 `McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);! q0 r# P! j" l1 ~/ W! t/ f
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); ) A% f; c3 l' X+ l- k
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,, a$ r2 Y* B8 l0 J" H
0x00, 0xFF);
5 K% b( u) t: W+ N) I0 n
# b- K* q" w/ T/* Enable synchronization of RX and TX sections */
3 {" E6 q% x; w, uMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */4 X; ?: x3 f, c# G9 T( G% N
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);4 _5 z7 B. p: a4 g' D( \) K
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*
% \! T8 [' l% `** Set the serializers, Currently only one serializer is set as
4 M9 K9 H/ V6 a5 C: {7 i9 b" B: i$ M' L** transmitter and one serializer as receiver.
L& |: V4 \3 Y2 }*/, N. I8 W! V3 i% g
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
/ [* [1 F2 x/ l. {McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*
1 j$ a% O$ r; }% d7 X9 \+ C* S/ |** Configure the McASP pins
) c9 F5 K0 R/ p% o' b5 G** Input - Frame Sync, Clock and Serializer Rx/ X. T. P3 n6 k
** Output - Serializer Tx is connected to the input of the codec
* ^! t3 h% ^0 M2 k5 n; W8 j*/
! L: Z) C$ P+ l$ S8 _McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
& @* r& l. ^, a. ]1 fMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
+ K( F5 |$ U2 S) q/ yMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX3 W7 `2 C- M4 f: A& t
| MCASP_PIN_ACLKX% [- h t+ L8 k, Z; Y
| MCASP_PIN_AHCLKX2 Y8 V5 y1 G% l7 A
| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */5 l+ i7 l+ T3 J* V
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
2 V( R+ ^) ^) q" D' n# e| MCASP_TX_CLKFAIL
) \4 y2 k1 n7 \/ _| MCASP_TX_SYNCERROR- D" j+ b! \/ T3 P& _
| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
2 _" E5 E" G6 K$ }+ Z3 \| MCASP_RX_CLKFAIL
( }2 O7 B6 f+ e/ a- J- {| MCASP_RX_SYNCERROR ; L O0 @) @7 q
| MCASP_RX_OVERRUN);+ Z& S8 K' {% W2 a) s7 ]! Y
}
static void I2SDataTxRxActivate(void)
) R; K4 A9 d+ ]. G{3 U* y$ d0 }8 j J, A8 ~* P
/* Start the clocks */# j$ G- v* N* A, e' A3 t
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);9 {6 G+ A6 D: N7 I) L( q
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */4 |8 K n% Z6 `6 t) Y( A* Y
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
* Q, h" h% d( r$ v% H; l( R9 MEDMA3_TRIG_MODE_EVENT);
: ?) H% r; X- b3 A( V# s9 J9 L+ HEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, " s- @- R3 G8 h; ~ G
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */( v7 w/ j7 M) a" z) c @5 c
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
* u* q1 k# v% l/ R! N* mMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */! Z5 W- [7 C2 Z/ k, E
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */& y6 O8 [+ I- V/ T* Z8 M: ^9 C
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
9 u+ ~3 v9 h8 P0 gMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);
. C0 r4 n; M+ A( r4 `' F}
$ J5 `5 k% `: V) d/ H5 e
请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
. q8 m: t1 o" ?- b" L
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |