嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
* X4 B% i! [+ x9 q" R' {
#define PING_PONG_ACNT 1
- a5 G: g8 c$ |
#define PING_PONG_BCNT 8*32*40
! B; t6 C8 }# r Q
//#define PING_PONG_BCNT 1
& a& n0 S9 Y% e8 G: o# ]
#define PING_PONG_CCNT 1
& x2 {4 G, L' L! c
#define MCASP_BASEADDR 0x01D00000
h* ?. J* m7 F9 U) @
#define Mcasp_RXEVENTQUE (0u)
4 x8 Q# s2 v2 `/ T! D
6 l6 _% B6 K! O, i/ Z$ q- w) m
/* OPT Field specific defines */
% S% n6 H4 J" ]$ M5 B! ?
#define OPT_SYNCDIM_SHIFT (0x00000002u)
* r- P3 |7 Y& e, S
#define OPT_TCC_MASK (0x0003F000u)
- q P8 F& D# N% J7 M" p; @
#define OPT_TCC_SHIFT (0x0000000Cu)
5 N9 T% K" J5 X7 V4 t
#define OPT_ITCINTEN_SHIFT (0x00000015u)
0 D S& C5 Y2 P |9 k, V
#define OPT_TCINTEN_SHIFT (0x00000014u)
: M5 j8 Z6 [+ U9 h. b/ s
7 X4 @4 v6 A$ }+ D0 \* l7 a: B! X
char ping_buffer[PING_PONG_BCNT];
( | }+ _( \* S* l6 c8 Z
char pong_buffer[PING_PONG_BCNT];
% N5 O1 Z4 h0 ^0 x" e# Z& U8 z/ k
# E# o& h9 Z, E1 v% s7 T4 e
" F, g3 A" ^) M
& F5 d4 ^8 }- W! }
! @* o; y7 r6 s3 o& V3 y* M2 J0 l
static void ys_edma3_init()
2 @: `5 n0 r4 k+ b/ n
{
2 ]3 ^9 i% B- u9 Y
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
0 `3 {; F8 W6 v
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
0 H9 Y- r) H1 O3 r9 `
EDMA3_DRV_Handle hEdma;
3 v7 e6 [& U B, }+ @
uint32_t chId = 0;
, |7 Q" T1 P# t* Z) z! @( Q* t
uint32_t tcc = 0;
7 l4 m2 k$ Y# I% d6 T# u2 I' a: H5 }1 B
+ X, y/ r) k& \* ?. ~& q& S" u
print2arm("edma3 driver init...",0);
5 X& x8 v9 O: e0 a- x" }- ?5 z7 t
' E, o; Y# w+ k# X5 u8 R& I1 I
hEdma = edma3init(0,&result);
, _" {3 s4 U# q: }! S) D" r! t
if(hEdma)
1 o' L( L1 O) |+ b, d
{
9 w( B5 i5 ]5 e* y5 q. P* R
print2arm("edma3init() Passed.",0);
: B; w( T. z% O E; ]+ Y
}
8 W7 W# G3 i1 T4 ~6 P
else
3 t8 J) q- ^8 `+ Q1 O- F
{
y$ b3 L! y2 z- Q# R; R
print2arm("edma3init() Failed.",0);
3 N% k8 X( P% H3 c' j- ]
}
- R7 i2 P& l; A7 Z% \' K
( ^. \1 y ?: O) J, s5 B0 b
if (result == EDMA3_DRV_SOK)
. c# o/ I) @0 v7 H: C
{
4 q3 n9 f. S# p
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
, t! `4 ?) R* v* t6 H. ^
(EDMA3_RM_EventQueue)0,
: z ~# |0 t8 E2 ?
&edma3_isr, NULL);
( R' b$ Z" Z$ M# U
}
2 d6 T3 k, ^/ V3 T# | g% G) t+ y6 D
; Z' [: n+ D( z
if(result == EDMA3_DRV_SOK)
1 H" R! y# J+ Z4 [
{
+ E2 a6 a$ m' g3 N6 o
paramSet.srcBIdx = 0;
7 T/ E( `4 v+ v% N, A6 { _, ^
paramSet.destBIdx = 1;
3 O; {/ F! {* ~0 \0 z0 f6 }" V, {
paramSet.srcCIdx = 0;
: `( n- B5 a8 p/ `5 ]
paramSet.destCIdx = 0;
7 [6 }3 ^; R5 [& r! X7 v$ p+ `$ I
paramSet.aCnt = PING_PONG_ACNT;
+ _1 l: L& f- L( \. z
paramSet.bCnt = PING_PONG_BCNT;
! r6 v' x6 ^* M' k% A. w
paramSet.cCnt = PING_PONG_CCNT;
$ l% N" D% [: ^4 |& k/ \) M
! E4 A+ T. {1 H$ K- @
/* For AB-synchronized transfers, BCNTRLD is not used. */
" ]" J1 s- \ e2 ?! H! P
paramSet.bCntReload = PING_PONG_BCNT;
& R# F E' N4 @6 ?! P
, O- ~9 k. Q$ r; \
/* Src in constant mode Dest in INCR modes */
/ D$ b0 Q: n7 C& L$ y$ m
paramSet.opt &= 0xFFFFFFFDu;
3 |+ |5 N2 ~- u, i5 W& X/ S% W
//paramSet.opt &= 0xFFFFFFFCu;
$ c$ ^5 Z3 _ y- G/ x# J
1 e( k) v# ?. {8 G" B1 C7 i1 z
/* Program the TCC */
, g/ T4 p3 j, J- ~
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
& a2 k. e2 Q5 r% y9 r# ]
! f" x# x# z2 U2 f
/* Enable Intermediate & Final transfer completion interrupt */
: V) i4 {$ E) [6 Y1 v; B# ^
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
. ^) m$ k4 K8 M; Q& p
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
" f# m O. f% }+ k8 N9 f) H3 _
+ Y) s# u4 n- M! B3 y# X' d1 v
/* AB Sync Transfer Mode */
9 L' d6 n; K1 M. k* P( a
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
9 D$ h, f/ _6 ^& b9 Z
3 j0 @9 J. J$ k1 ?8 w4 k- j# h
/* Program the source and dest addresses for master DMA channel */
5 ?5 L' M) Y2 [6 Y5 d
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
- X$ X- N M) X" I" a
paramSet.destAddr = (uint32_t)(ping_buffer);
: o$ |: G, A# y5 [4 _5 F! r
9 g9 q. y- h; K$ c0 S% S# L" g# J
/* Write to the master DMA channel first. */
. n: l& T! d) |1 i7 K* f2 j
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
, _ d! @9 i: [) O" W3 ^
}
3 N( c7 K1 C; |- W
; q( Y8 X9 c5 |. `$ t6 k
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
) x( `. n5 i+ ?3 `6 \
/ v; U/ K; j. |2 F% n( b2 h3 Y
if(result == EDMA3_DRV_SOK)
/ a/ C' y" F2 Q' u% M/ W
{
5 [7 U% c" X; v& {* W* w/ N
print2arm("edma3 driver init success.",0);
0 ^4 i, Z1 I$ r
}
; \- [! @; | [- {& X
}
4 C! [' Z9 s7 C% h2 M' e
# F0 Z: w3 Q3 w- o9 m+ V' c$ J
! g: W+ k- O4 h3 j7 ^$ O! O0 i
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
- x# e6 N5 L1 t* B" s! _& V) d5 Y
5 U, H8 e, C3 ^/ K i
7 i2 r' k- `; a/ w4 L
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
4 v: m U7 p7 @( L
每次DMA传输完成后都要再次使能传输
2 N4 d$ U9 |. s# A
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4