嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
* [0 \. `1 e& B- Q6 i
#define PING_PONG_ACNT 1
" J) a0 N9 c Q. s& b# E4 X. T u
#define PING_PONG_BCNT 8*32*40
) w3 G, |( B2 O; g' ^; J* p
//#define PING_PONG_BCNT 1
0 f2 o& _5 s) M& _0 f
#define PING_PONG_CCNT 1
, e# i$ n$ ]: L; ?1 Y
#define MCASP_BASEADDR 0x01D00000
* v4 L- q6 E; J5 c+ P
#define Mcasp_RXEVENTQUE (0u)
4 ?3 h2 H* `% r V
8 U W, j: A, r6 x7 J9 |1 L
/* OPT Field specific defines */
7 E6 @* C L7 S5 k+ i% }# D6 O
#define OPT_SYNCDIM_SHIFT (0x00000002u)
3 U9 t3 t v; N
#define OPT_TCC_MASK (0x0003F000u)
) P1 O8 y2 h: v5 ^9 b1 M9 m
#define OPT_TCC_SHIFT (0x0000000Cu)
, K- H2 y" R* q5 e' s
#define OPT_ITCINTEN_SHIFT (0x00000015u)
6 l) [# }7 c! c( c) q$ q5 Z, ^
#define OPT_TCINTEN_SHIFT (0x00000014u)
8 v. h' o- p) `9 y
' P! a. d3 Q( n
char ping_buffer[PING_PONG_BCNT];
+ W, V$ S, M2 E2 T, o" G
char pong_buffer[PING_PONG_BCNT];
* l! i# Y7 f0 d9 T! u
E. Y+ Y* Y# r4 @ X- g) r
3 ~4 @, `0 }6 d
) I4 M# R2 J. I" J+ m
4 ~) p# D+ m7 t( i9 N/ p' S
static void ys_edma3_init()
$ l; ^0 E2 Q3 [7 I: D# X" f9 A
{
& y7 l9 U0 m+ S
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
8 q( [7 G; a/ d( g! o6 _; O0 a
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
9 U4 G$ }" X; G) Z
EDMA3_DRV_Handle hEdma;
" L7 z: T2 `. Y# F; w% x. G
uint32_t chId = 0;
& l1 z$ a) G# |
uint32_t tcc = 0;
0 E* T8 D6 s- e7 r, |+ w9 L
1 O! {, G% [9 F1 @0 B
print2arm("edma3 driver init...",0);
3 ], C: w/ J) A; }) a" n
0 G$ \0 [# B! e+ E
hEdma = edma3init(0,&result);
4 V, D5 {; Q$ T
if(hEdma)
/ P3 {" X2 [' C$ E4 ]) c* r' H+ Q& A
{
9 P* W4 ]7 S w. o4 `; e+ I
print2arm("edma3init() Passed.",0);
9 f5 C5 F: H* O' G8 g$ X
}
2 p% V v+ t( V6 e- j
else
! h4 @+ Y, r9 `, z; W8 R7 f4 L, j/ j
{
" n$ K* e0 E$ y! [5 d# p) R
print2arm("edma3init() Failed.",0);
8 {5 K; t* |) D& G* b& [
}
* P) l7 v6 E$ @8 i+ R
a# R6 r g4 d
if (result == EDMA3_DRV_SOK)
( D( X0 I" d$ d1 q
{
6 l' ?5 [& M- y% O/ _3 R
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
0 _4 W. ?, X/ x5 y
(EDMA3_RM_EventQueue)0,
" @* n# Z) q4 H/ H0 {
&edma3_isr, NULL);
& C" Q7 w" B# M( a: V8 q% M3 @6 ~
}
|' M4 L3 O' z; Q5 _ P8 Y5 o" y, d
* @- j& w- t% w& z
if(result == EDMA3_DRV_SOK)
; c) t k8 i/ V5 v& a. w+ D
{
# Z ^3 b. |6 b& L* E% ?' Q
paramSet.srcBIdx = 0;
& L$ }# B; e# g8 J( a
paramSet.destBIdx = 1;
4 M* Y) ^0 J, U& J" o
paramSet.srcCIdx = 0;
: `, v- N; y9 T: ^# E% {
paramSet.destCIdx = 0;
' }" y$ @8 f+ A( L, R5 U" [
paramSet.aCnt = PING_PONG_ACNT;
" P0 Y* s! u5 x6 \. |% @
paramSet.bCnt = PING_PONG_BCNT;
6 L4 b' i9 I& a+ \; i' J
paramSet.cCnt = PING_PONG_CCNT;
0 O1 j4 Y- H# _3 u: f
: c2 O/ [ k/ f3 ^1 A
/* For AB-synchronized transfers, BCNTRLD is not used. */
% X1 f2 ~: N) u( Q- d# I
paramSet.bCntReload = PING_PONG_BCNT;
: u9 O6 ~- |) n
; \, j, P% l8 I7 r# l
/* Src in constant mode Dest in INCR modes */
) x6 [, q* K! R& i0 Y
paramSet.opt &= 0xFFFFFFFDu;
' I+ J" n3 I( u- g
//paramSet.opt &= 0xFFFFFFFCu;
- L/ y3 X/ W+ J+ c$ C2 l' ]
Z8 J- N7 ? j
/* Program the TCC */
6 ~, g$ a k% ?& ?
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
' o1 }6 d' s9 u; Q, q
, C+ Z1 o/ ]4 f1 A- T8 j9 u
/* Enable Intermediate & Final transfer completion interrupt */
( U" v5 S, |, a8 m+ U/ w8 b
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
* ^/ P/ i2 o: g8 A4 D
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
4 W9 W/ z: v* x+ v5 N. ^8 |
F7 r7 ~; B. E8 M e
/* AB Sync Transfer Mode */
9 Q, | `# E; c1 X; X/ T
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
* t _2 V2 r+ `2 T
0 I- \! s' X+ O
/* Program the source and dest addresses for master DMA channel */
. E$ f/ F. n& K* m$ g x
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
2 G3 Q0 J, B1 z8 a" E* B
paramSet.destAddr = (uint32_t)(ping_buffer);
. q5 b- l8 K% L, V
4 z+ k1 [- [( N F& |
/* Write to the master DMA channel first. */
+ j' y! R- n) ]6 p
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
" B0 F# c# ~$ G5 y' F6 q9 |6 a
}
: K3 \ C+ L. r5 }& E
0 _6 k; H5 j& ~
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
# M- O7 |* r5 m: ~( }8 [8 u
7 S. t4 p) ~) O% p
if(result == EDMA3_DRV_SOK)
. V, h) N1 R) I# r, J" M d
{
$ _/ P7 S! n6 `% M
print2arm("edma3 driver init success.",0);
7 l+ W4 y8 ~ x: l! `5 q- r9 O! j
}
1 a& d: _" o, E0 j- x
}
& b9 @3 ^# ~- f i* ]* f6 W# E! t; ?; S
7 s6 z3 m, B* Z( X) I: N$ Y" F- y
% j1 w* |) }8 r6 U2 m- u2 V; K
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
/ G/ l- s2 @6 _# y8 |" O3 r
" k7 E3 H* E1 n1 M6 |: \
0 |6 e3 R( b* Z& a
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
2 ?' r% y. B) F3 f8 ~8 I
每次DMA传输完成后都要再次使能传输
) D+ M4 V; G4 N, M: j9 B2 j/ }
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4