嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
- `( f- x( V" r. q9 t6 b; B
#define PING_PONG_ACNT 1
, Z: C+ d) U0 L8 G
#define PING_PONG_BCNT 8*32*40
- ?( j } e; f& ]$ A
//#define PING_PONG_BCNT 1
) s% V5 ]1 \+ u
#define PING_PONG_CCNT 1
0 t& X9 a& k, l
#define MCASP_BASEADDR 0x01D00000
7 ? D( g5 u, }4 `( s
#define Mcasp_RXEVENTQUE (0u)
# t: i4 S, V2 G( x
9 [6 L, d9 ~* g ~$ ^
/* OPT Field specific defines */
) [+ N" _( v$ W2 l3 j1 R7 c
#define OPT_SYNCDIM_SHIFT (0x00000002u)
( U8 K) ~0 j; ^
#define OPT_TCC_MASK (0x0003F000u)
3 A2 N2 X5 `3 v6 _- \1 m j
#define OPT_TCC_SHIFT (0x0000000Cu)
8 p6 T) E2 {8 R! Y: {
#define OPT_ITCINTEN_SHIFT (0x00000015u)
9 n% {- M2 j9 H8 p. I
#define OPT_TCINTEN_SHIFT (0x00000014u)
) W* g4 R1 F9 U7 M( G
3 ~. S1 Y3 Y, O( m1 @% Z
char ping_buffer[PING_PONG_BCNT];
3 {2 g) W1 X& _
char pong_buffer[PING_PONG_BCNT];
/ m) f$ ]5 h; G% W1 e( |# y
0 I; h- E# j$ s9 K
2 N1 z: i7 f7 K6 \1 |# [5 u, y
( F4 d+ R: {; t) J; ` W
]3 ?) s% c4 C) s
static void ys_edma3_init()
0 X* b8 [ J" P5 J+ S: [" ?
{
( d& V! P# c9 J# e" t( f( @
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
8 A% i( `0 ?( t2 E2 e- t" c& U0 g
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
5 l8 F' G# I8 N, G+ B
EDMA3_DRV_Handle hEdma;
( _1 u# `! i' O$ }7 }1 @4 V
uint32_t chId = 0;
: \9 J" \! ]! w( s0 q
uint32_t tcc = 0;
: g6 D* [. V: G; N
% i: g8 S8 U2 e5 w3 j; R! |
print2arm("edma3 driver init...",0);
. }& b" }9 c# R# ~" f. X
0 y8 t5 w, T" u+ Q
hEdma = edma3init(0,&result);
$ o1 _$ b) n6 G2 k( H
if(hEdma)
, j; y2 S% ^* f6 S& G
{
- e0 |, x" x, r: D# Q* R) [
print2arm("edma3init() Passed.",0);
. @) p% t5 | [* C" k
}
+ G4 R1 N% J0 N9 ]& q/ f! m/ `
else
E: |2 v8 G A, k6 y8 l
{
! _2 ], o, O+ k0 ]
print2arm("edma3init() Failed.",0);
9 _1 s% i- H) G l2 X* X" i" L
}
b3 c; T. C" U* a, }! T1 n
, _9 Q; H( R: t( N+ s! n
if (result == EDMA3_DRV_SOK)
7 S' Z3 P. F6 G/ p: M( D2 v$ {
{
; B1 I. _2 |& I/ Y6 s% A \. ~
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
( t: U# ~6 K8 J6 h$ Q2 ?9 q2 M
(EDMA3_RM_EventQueue)0,
) W# w8 `7 z' l* ^$ f9 Q- P
&edma3_isr, NULL);
+ K( X- @& n, k4 c v
}
! } s! k+ d+ @* R
/ m" _0 j/ H2 S# l' i1 Q6 G5 J
if(result == EDMA3_DRV_SOK)
! c' Q" S6 B; }! m+ T& i* h. r" X
{
& d# ]: T0 B _7 L' Y1 u
paramSet.srcBIdx = 0;
9 x6 R1 w* x7 q" J
paramSet.destBIdx = 1;
. ^' I( ^) O+ Y% o
paramSet.srcCIdx = 0;
. }) i" W$ d& P( ^; a
paramSet.destCIdx = 0;
+ W% H* ^& b6 P3 A
paramSet.aCnt = PING_PONG_ACNT;
- k# J+ e/ V! y
paramSet.bCnt = PING_PONG_BCNT;
! s+ p5 C( l3 T- [9 E, a
paramSet.cCnt = PING_PONG_CCNT;
8 K/ d5 ]( _9 F5 }1 J/ u: t1 |, [
+ S" D9 {- @' q; T: T6 d& n3 j
/* For AB-synchronized transfers, BCNTRLD is not used. */
+ M: l+ d! t1 U% b. \- C8 y
paramSet.bCntReload = PING_PONG_BCNT;
- d, l& ?* q* z2 _9 i7 r
+ ^3 B' Z) q5 k0 [
/* Src in constant mode Dest in INCR modes */
8 t+ `/ Z/ d' ?' `4 {/ q
paramSet.opt &= 0xFFFFFFFDu;
3 R9 j' S0 Z0 i/ _9 L* j7 Y
//paramSet.opt &= 0xFFFFFFFCu;
; g: R4 |+ T1 Z
5 ^# l; Y8 o: j. v5 ^
/* Program the TCC */
8 i* v: x$ C4 K* q- e
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
: O) J& [7 H+ J: F4 u: f
- C' y+ f! `4 T2 t: e" i( l
/* Enable Intermediate & Final transfer completion interrupt */
! a6 E- _6 l- V! j' ~, y
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
6 P7 }. i5 N" v7 O4 E; D: t9 ^
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
8 |7 E- h( o. K1 O
8 i, p. [1 P1 H" p" a: \/ e
/* AB Sync Transfer Mode */
6 J- R8 K( u5 N& n* t
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
, k/ M9 i; t( Q* n
0 d3 H1 g/ L4 {" @- M( ]* K B
/* Program the source and dest addresses for master DMA channel */
5 j# a" Q# k# C8 C
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
: P( \/ P9 }8 D0 j
paramSet.destAddr = (uint32_t)(ping_buffer);
8 ?9 R8 L8 k- Q j0 A
7 r7 w: a, o7 h: U0 T6 Q: r
/* Write to the master DMA channel first. */
0 F7 V0 t; W4 o
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
+ i6 f- i7 A" a8 @, s
}
0 n9 p) N x1 \. m
, A3 y7 Q# V3 P, U0 P% z% \8 f
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
! P' s2 b! n! R. D
a& c3 N3 B7 g2 {& x- U2 B
if(result == EDMA3_DRV_SOK)
2 ^# _5 j1 }: I w4 Z1 P" o7 U0 j
{
/ a* m: G, v+ N
print2arm("edma3 driver init success.",0);
* K% h! |9 `+ _0 J5 ~6 W
}
* _' x& L( k$ e' A
}
1 Q3 U; H3 {. n: G" O k' ~' ]: I( t" F5 \
# o# K4 S; j/ B1 B2 E
0 b3 H3 P! ^6 W7 Y, d
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
& g- a ]9 `( g& A& r1 r3 R
8 Q! c! ~, l% ]- j2 _5 v1 R
m6 F9 H9 X: [/ G$ t, k# X
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
* V, O* x7 R* u7 E
每次DMA传输完成后都要再次使能传输
" ^4 a, S# Q0 |) F/ }
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4