嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
& p# H" S/ L: [3 g) C* S
#define PING_PONG_ACNT 1
: S. ~$ ]5 k( x; \3 Q4 ^8 f
#define PING_PONG_BCNT 8*32*40
3 F( L* H% K7 T* p
//#define PING_PONG_BCNT 1
8 o( ]7 m0 d! L3 ~
#define PING_PONG_CCNT 1
; M, ^0 Q2 _) o
#define MCASP_BASEADDR 0x01D00000
# Y6 e7 g3 Y/ _: K5 ? N+ m
#define Mcasp_RXEVENTQUE (0u)
: M) q B4 k9 I5 F# c. Z- {
, L% F I8 l6 `7 b! \9 b- s
/* OPT Field specific defines */
4 i2 U( d! S% @8 ?3 M" C
#define OPT_SYNCDIM_SHIFT (0x00000002u)
$ m! d; I3 A% _0 F
#define OPT_TCC_MASK (0x0003F000u)
) W0 s. K: k0 ?5 I( ?4 p! t
#define OPT_TCC_SHIFT (0x0000000Cu)
. s' Z, ~8 D) ]+ @# C8 `/ ?
#define OPT_ITCINTEN_SHIFT (0x00000015u)
; T; U+ V7 v: z3 W& Q
#define OPT_TCINTEN_SHIFT (0x00000014u)
! v$ a5 \7 \, \2 m5 _% O6 p
$ d0 N& H: W/ A; S r5 p/ |
char ping_buffer[PING_PONG_BCNT];
% ~7 O' P8 [9 o: h1 { S6 h' R
char pong_buffer[PING_PONG_BCNT];
! C% H# n: g0 e! j" U
+ x; ]- {4 ?2 ]5 Z0 N
; k. i/ H- o+ D5 J( f
- F+ |" o- L! r: t5 z4 V- U1 J' {
8 W5 F0 U' H7 n7 s
static void ys_edma3_init()
/ Y, G( B* r c( u6 \: d
{
/ M7 Q1 w1 j m, E0 P; Z
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
2 B- ?/ Z& I5 i( [. y( h6 b0 n
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
- w, B' k7 q7 U5 v) Z- Z
EDMA3_DRV_Handle hEdma;
4 P+ P$ }' K, k. s, X% ?
uint32_t chId = 0;
5 Z3 P: N0 u' ~$ S$ B6 k
uint32_t tcc = 0;
1 }3 O1 e) s" T) W R/ @9 F7 ~* T
w6 ?/ n* {- j# f. i+ ~
print2arm("edma3 driver init...",0);
2 p5 U4 `' r' n0 x& y# n8 x
- Z% \1 V4 a8 F( u
hEdma = edma3init(0,&result);
8 I/ r% ~9 p9 R3 a& v0 j
if(hEdma)
. V1 c: d3 I( a' Q+ W
{
( K: G; u; m( v0 v" [/ @' W
print2arm("edma3init() Passed.",0);
9 O" \) ?7 a6 G+ t: Z/ g2 W- `
}
' Q/ D. F, ]" X/ M @' I! H* k" B5 @) v
else
3 S0 ?9 ]5 B' A" j, O2 i
{
- Y8 l, \: O5 V9 r! D+ m
print2arm("edma3init() Failed.",0);
: g1 q( a& z2 j1 N
}
( W5 L3 {. c1 z0 T
# B( |/ O# a. t& D% R s \
if (result == EDMA3_DRV_SOK)
+ ]. D* A, q1 `" C: h# k9 o! s3 [
{
6 H, ?3 f0 |; F& e) ^
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
' F) u& ?% ~" K3 ]4 k% ^, O
(EDMA3_RM_EventQueue)0,
8 m& c7 T- p }' Q( o
&edma3_isr, NULL);
{( p( ?0 \8 A/ U# @; ?6 y
}
; u2 \6 `# f6 C; B
& ^0 B6 H3 r Y% _5 j
if(result == EDMA3_DRV_SOK)
) H, n: C8 l/ ~& H' I
{
4 U' Z' r9 Q$ y4 [& H: {$ Y
paramSet.srcBIdx = 0;
5 y0 y% m/ t; ^, X5 O' F, B
paramSet.destBIdx = 1;
4 M, B4 Y; ^* E- L
paramSet.srcCIdx = 0;
* v) f5 A t0 ]5 E
paramSet.destCIdx = 0;
: O! ?! S1 W4 M& i. c
paramSet.aCnt = PING_PONG_ACNT;
* p" ?6 I( D6 R$ P, a
paramSet.bCnt = PING_PONG_BCNT;
! u* ^* ?, e; Y3 |
paramSet.cCnt = PING_PONG_CCNT;
9 H' ~% T' _* b; P8 k" |/ L% E
) J3 v7 k6 m C5 ^- D3 |
/* For AB-synchronized transfers, BCNTRLD is not used. */
2 ?) v* M; w. f
paramSet.bCntReload = PING_PONG_BCNT;
9 o% l8 X9 i3 F
' r* B: _. w" v) o- C
/* Src in constant mode Dest in INCR modes */
& g1 `/ X4 |9 d7 C; Q% V: {
paramSet.opt &= 0xFFFFFFFDu;
6 ]) z. j8 g) | A- s9 d/ |' }0 o( X2 v6 t
//paramSet.opt &= 0xFFFFFFFCu;
1 L, F9 W) c4 g7 ^8 |9 T1 ?7 ]7 J
' Z- B4 q" B! h- v
/* Program the TCC */
9 B" I+ Q+ B ]! F$ M# z
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
" x: O) }3 i* m( l: ?# Z7 C* w
7 B" y* w4 G5 j7 e) e1 \
/* Enable Intermediate & Final transfer completion interrupt */
% Z- U, m( ]4 c) L6 p+ [2 `& N6 I
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
$ v9 R, y: d9 N6 Z* P
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
: ]3 l. |. a# O* R \ D/ I2 O/ |
" {* e" ^* e) Q/ E( s& K8 a
/* AB Sync Transfer Mode */
: s) p8 J" |/ o
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
* j# H7 R' V* x: a- o$ J. I
6 u" F0 h. h6 @
/* Program the source and dest addresses for master DMA channel */
$ W. r8 E+ O) h9 L9 H
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
. e3 C7 ~* v; ?( m8 i# O0 U
paramSet.destAddr = (uint32_t)(ping_buffer);
! I7 Q8 G) l# r/ B0 Z# x
5 X- ]# W5 s P2 D7 M5 \
/* Write to the master DMA channel first. */
" b/ G: S5 C" M- M2 r- ?
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
4 F ^) n* J0 {2 e8 j* Y- [
}
4 G6 j* O; |4 r: p7 Z/ }
8 i$ j& |/ ]) E6 m( W9 I
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
$ ^/ U \/ H& n; d
9 S9 u3 e- P9 p+ G" `3 x9 o6 ~' b8 m
if(result == EDMA3_DRV_SOK)
4 ~, |. [5 b+ H5 z y
{
+ e7 ?7 {/ H& U
print2arm("edma3 driver init success.",0);
2 @/ i% y% l) r& L% ]: m
}
( r& j3 A- W( U4 d" }
}
8 e: \& y& ^( ?# `5 o
D. a0 L' v( W3 Z# Y8 S
7 |# z" p7 e* l+ J
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
" ~& u" {( P5 n7 V; _
& }# M& F0 D. z) k2 t0 E4 j( \- ~4 |
1 D% O) G Z7 d" i, r
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
9 Q: M5 M7 B7 z8 m
每次DMA传输完成后都要再次使能传输
: E3 C/ u9 M; w( [4 d# v6 E) e
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4