嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
8 u( a ]0 @8 Y+ f
#define PING_PONG_ACNT 1
. d( b1 _9 i% k+ F" o5 L. T
#define PING_PONG_BCNT 8*32*40
5 v# d2 V' S- B9 a0 }
//#define PING_PONG_BCNT 1
1 B% l2 F1 [# ^- w
#define PING_PONG_CCNT 1
3 \" a6 \2 @$ F
#define MCASP_BASEADDR 0x01D00000
" T3 b1 P% R" o# |
#define Mcasp_RXEVENTQUE (0u)
6 o8 [, B1 h8 D5 x$ Z6 H
0 H4 s2 q4 R1 p9 z. m. R) M/ s
/* OPT Field specific defines */
! S9 |1 Q- b+ t" C g/ R
#define OPT_SYNCDIM_SHIFT (0x00000002u)
3 m7 ^( G9 y* J0 }: o$ o/ |0 H9 ?
#define OPT_TCC_MASK (0x0003F000u)
8 l: k$ P4 I/ u0 |8 J7 _+ r$ F
#define OPT_TCC_SHIFT (0x0000000Cu)
" j& q2 B0 n) c4 `
#define OPT_ITCINTEN_SHIFT (0x00000015u)
/ Y$ j3 j7 G" X( `8 S, _! v
#define OPT_TCINTEN_SHIFT (0x00000014u)
" V9 G! n. `! c5 Z1 A& Q3 l
; B1 u; S7 I+ [8 v& Z" B/ M
char ping_buffer[PING_PONG_BCNT];
! }* U, y# Q; ^- D+ A! J
char pong_buffer[PING_PONG_BCNT];
" A2 n7 _9 H9 X1 z8 r) g$ t( G; o) L
! X. n5 b0 F; t
7 [3 L3 _1 h: U. U/ Q9 O# [/ m: K
7 B6 }0 x6 N# e& B* _
/ Q$ @: B7 F P! _) o, p
static void ys_edma3_init()
, F2 L! ?; d" G5 T% W, ]
{
2 i) I+ b; o' v- u3 e
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
( L/ K$ C1 ^5 k* X/ G! E- Z
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
+ n$ z/ i4 q, U8 s* k! O$ ^) T
EDMA3_DRV_Handle hEdma;
- i7 n; _* Z4 @7 r9 ?
uint32_t chId = 0;
$ O3 C/ S) Z' C# b9 l$ c
uint32_t tcc = 0;
/ A2 n7 z' q9 {1 S. H% P
2 l$ x& @$ F7 U: e5 \
print2arm("edma3 driver init...",0);
* e/ w# ^6 V% k+ e
5 i5 X/ o5 k+ G) K( b
hEdma = edma3init(0,&result);
) P% X; r% o3 o, l$ C. _! T2 M
if(hEdma)
! W5 |2 _; j. ]7 Z2 `( h7 M$ `
{
5 p W. ^9 J: `% U, g
print2arm("edma3init() Passed.",0);
9 r* T* h' a. {% a( U9 U, u
}
5 d4 R$ Z1 J0 q4 a" R8 Y6 R' Z
else
- \; [$ a0 q8 f# L0 U% a+ K7 l
{
) W* w7 s& U$ ~, L
print2arm("edma3init() Failed.",0);
! ^& Z. W) V4 O& Y1 h: c( `! a
}
" D$ o5 i8 z) P0 W6 [4 t \
/ h. N; A3 ~& ]
if (result == EDMA3_DRV_SOK)
s- u4 S0 D: f9 ` J
{
- B' ~/ d9 m" C: N8 T
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
0 z6 Q ]% a( S, q. i
(EDMA3_RM_EventQueue)0,
1 S: C% v$ Y+ p+ u6 H
&edma3_isr, NULL);
" n% W) z; a' C
}
1 d# y! t/ e4 u5 A5 J7 a2 `9 r* b' |5 d
7 ?: v R8 ?; m
if(result == EDMA3_DRV_SOK)
: G I& G c) S" Z6 F
{
9 A6 b$ Z, y+ o! ^( K& ]1 y
paramSet.srcBIdx = 0;
- C+ q; f- ^8 c9 P
paramSet.destBIdx = 1;
; r' \* y8 U0 e8 A
paramSet.srcCIdx = 0;
5 Z9 q' k% C) }
paramSet.destCIdx = 0;
6 d* P- {5 h+ Q
paramSet.aCnt = PING_PONG_ACNT;
$ y; F% Y! f# k; Z3 I
paramSet.bCnt = PING_PONG_BCNT;
$ z- G3 H9 G% y# E# P7 @: v' Z
paramSet.cCnt = PING_PONG_CCNT;
: p. N% h. p8 U& }
" j8 s5 |4 z$ n4 x* {' `! p
/* For AB-synchronized transfers, BCNTRLD is not used. */
. P$ a/ X! i2 Q
paramSet.bCntReload = PING_PONG_BCNT;
0 {; z& N, O3 [& y2 w
+ f% c# @* V( n
/* Src in constant mode Dest in INCR modes */
1 ~5 u# U$ o; s4 a7 k8 i# k
paramSet.opt &= 0xFFFFFFFDu;
# G) v% C, \1 X/ r U
//paramSet.opt &= 0xFFFFFFFCu;
1 M( L& ]% d: h4 q; x
: w4 B* V" x" f6 J# M: Z4 J# X+ x
/* Program the TCC */
1 S+ v8 s* d* x: x5 S* J% T
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
" ?3 V' V: W9 x" [- n/ v1 k$ \
/ W; J- d) U9 |. {4 p3 t5 n$ r
/* Enable Intermediate & Final transfer completion interrupt */
7 ~5 c& \4 t1 ]
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
! x5 H' z8 A( l A0 F! M1 [& Y6 ?
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
/ ~" J" @3 y. ~1 g( `+ i, _5 ]
: R) m3 {- g# e1 t- Z# M8 j
/* AB Sync Transfer Mode */
3 A2 Y) f/ T1 ]4 e. o' v% w
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
& J2 D3 C- W: C+ h" N9 t) L
3 {, g' y/ @3 J( B% h
/* Program the source and dest addresses for master DMA channel */
+ {. x7 E2 t& E* X9 V$ H
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
7 m$ E% n8 W y/ v
paramSet.destAddr = (uint32_t)(ping_buffer);
, Q) k4 z5 O( L( C% ?& y0 F# \
( T' f, `" o3 v/ W
/* Write to the master DMA channel first. */
5 e5 x" j9 Q. F2 s2 S$ h/ K
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
- O! R: B( d* e& `. E- w! c
}
7 g: V. z# ^" s6 k& }# B% w
) n2 {2 @# r: d) S
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
2 z, _5 \7 \9 `) F$ g4 s& Y
: [$ i8 r, `$ {# {* o8 B
if(result == EDMA3_DRV_SOK)
0 ^2 t9 U. U& ]; m- n, ]* @
{
2 W" e, X) L( j/ D
print2arm("edma3 driver init success.",0);
, w8 X A3 Z3 x1 l. W
}
8 y+ ?' O4 L/ G& c
}
& X& L- P7 l* B- {) e/ i* I
+ D8 X0 ]: x* n8 M. l! v: S
" T; u$ A4 P7 x7 ^. b' [# x$ Y
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
, X4 v" i- p: ?, D6 ~* f9 d' a8 U
+ G4 Y# D8 @# R0 \3 U1 C3 N' f
6 a h* V8 e) N
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
, u! H3 J( e/ b8 p! [5 T* @" H
每次DMA传输完成后都要再次使能传输
" m- e" i/ u# y# P- q
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4