嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
$ E# L: {0 C0 V6 m8 W( E
#define PING_PONG_ACNT 1
. F! Z, m6 `3 o+ z6 h4 H
#define PING_PONG_BCNT 8*32*40
1 q5 B7 J# E8 J1 p
//#define PING_PONG_BCNT 1
% l5 Y& y2 k( ^
#define PING_PONG_CCNT 1
3 I3 x1 @3 L" z4 f1 u/ }4 t7 T
#define MCASP_BASEADDR 0x01D00000
6 Z& A0 W5 h) Y: q9 |, x
#define Mcasp_RXEVENTQUE (0u)
; m6 Y1 A$ f- C6 v+ A
* U3 D# Z) p; F0 k
/* OPT Field specific defines */
5 S! |% a/ K6 T8 @
#define OPT_SYNCDIM_SHIFT (0x00000002u)
# K# ]( J: p) o/ H. N/ E
#define OPT_TCC_MASK (0x0003F000u)
+ f8 p& [0 j2 n4 R
#define OPT_TCC_SHIFT (0x0000000Cu)
- X# @3 F |5 b; x, l: x
#define OPT_ITCINTEN_SHIFT (0x00000015u)
" j, N% d3 O+ ]$ d2 ?& s% m0 x8 Z
#define OPT_TCINTEN_SHIFT (0x00000014u)
& a2 W8 W1 T! v7 a- t
2 Q6 J6 e- P6 ]5 U
char ping_buffer[PING_PONG_BCNT];
2 T. H8 R& s( d( x7 g8 Q6 K
char pong_buffer[PING_PONG_BCNT];
: ^% h, q% V! `. I n
% m% q, e* z. Q6 F% @/ P& v
2 p# T* O1 p z2 x+ [0 K
7 t- e( Z: Y& t' s* V3 h
" a+ S. C) k- N7 A, M
static void ys_edma3_init()
7 u# B: M! j f9 ?6 X N
{
0 ]$ c( C, N# e* O
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
8 m4 o" g( Y1 W- X2 w, s
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
9 I5 P' V/ }4 ^9 Y+ z b
EDMA3_DRV_Handle hEdma;
7 [) t& ~; D4 S& A' h9 E' I- A6 @
uint32_t chId = 0;
$ H1 R8 J3 `( L5 ]
uint32_t tcc = 0;
1 j$ k& ]2 @0 d0 {/ M3 [
/ T5 a# I' |* F7 h- v/ |5 R3 U
print2arm("edma3 driver init...",0);
# C2 L/ h; Z) F; X; e
- G- P: W, ^* {7 p9 a, R
hEdma = edma3init(0,&result);
! p( ^ N/ D' C; W+ l% f: q
if(hEdma)
3 \2 v5 h' { x4 s
{
; U/ W1 T( \7 U
print2arm("edma3init() Passed.",0);
7 U! B) M6 ?, F6 m5 f8 r) x
}
* W$ y1 E/ L+ l! O4 t9 d9 a3 ~
else
+ h/ t5 a4 \' N: b1 [5 z Z
{
; i: R- E" w# g8 p
print2arm("edma3init() Failed.",0);
* {) ?% {4 ^8 g/ ~$ h6 [
}
1 F- ~+ S* y. L5 ]" |8 H. `; H
' A0 {9 N& k* P2 ^
if (result == EDMA3_DRV_SOK)
# `* t H& D, Q
{
! ~" }' v- l5 F% M
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
; S3 w9 [ U3 l2 r
(EDMA3_RM_EventQueue)0,
, [. ?+ g+ t2 S) U+ ?) o
&edma3_isr, NULL);
/ h2 M$ C$ q' a1 z# s& I
}
0 S, T2 B! S4 z. b, d
& ]4 F- ?* b$ R! O* p3 U' W
if(result == EDMA3_DRV_SOK)
4 T, w( U& g( M; l- v- P- H+ I
{
( V5 _( x' m v. P1 K7 ^% g
paramSet.srcBIdx = 0;
, o$ `# k n- {: \3 n
paramSet.destBIdx = 1;
" O2 w' }, |: _4 F B+ _
paramSet.srcCIdx = 0;
; p+ u. Z# Q! E! l" S' B
paramSet.destCIdx = 0;
8 H2 F" T. Q; P
paramSet.aCnt = PING_PONG_ACNT;
* ?6 j- l; R' N: ?" j6 [. B6 B
paramSet.bCnt = PING_PONG_BCNT;
& i% D! K; {- G0 j; t1 K: M3 x
paramSet.cCnt = PING_PONG_CCNT;
a( e6 ]; s" ?
/ i% J' l7 c: l' @: B1 j0 x3 t+ G
/* For AB-synchronized transfers, BCNTRLD is not used. */
1 t$ Y* t, y& D$ }/ I {( I
paramSet.bCntReload = PING_PONG_BCNT;
9 T- W* T1 m v! v# d2 g
5 e" p: ]! D' K" R ~
/* Src in constant mode Dest in INCR modes */
( Z9 Q" Q! f" r) I
paramSet.opt &= 0xFFFFFFFDu;
5 J7 S. s; K3 r6 C/ p; c. P
//paramSet.opt &= 0xFFFFFFFCu;
7 {- \. B( c* m
) v$ U7 f( m& S+ y$ @1 O- j! M+ i
/* Program the TCC */
! W( ?" ^) N7 h k6 X9 u1 T
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
9 k; ~6 H6 c, C: M: \9 C; ^# H% X( G
9 \7 \/ H3 d: B
/* Enable Intermediate & Final transfer completion interrupt */
7 I: \9 E& @. b( H7 I8 T' k+ i% b0 U
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
, T0 B5 n6 S8 u1 ]
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
% L, Q4 ^* V5 o% g
( K; x" D0 T" S
/* AB Sync Transfer Mode */
. l* ?4 L5 j- t/ K) a3 J
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
* n5 T2 C$ H' @! y
* q& q- C* g! M$ v, t# O
/* Program the source and dest addresses for master DMA channel */
; H; ~2 b2 j2 F: U0 \
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
7 x$ m$ q- X% X4 r, j* b
paramSet.destAddr = (uint32_t)(ping_buffer);
, P) _' \ d8 M7 _* B2 P
, p6 E! d/ i& M, ^& X
/* Write to the master DMA channel first. */
8 y2 x$ C$ P+ T6 T* H
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
6 X7 e& I; \9 m, P6 p# M
}
7 g U7 [; x/ ]7 Q9 r
4 }* F D, ^$ Y% ~& I2 y9 l1 }9 ]
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
9 @ y" \3 j5 z$ q( E2 S
- }, d( D# s: w m5 E
if(result == EDMA3_DRV_SOK)
% A/ C' }/ @7 }
{
$ Y+ Q( o% x. ^4 S/ t4 @- `; [
print2arm("edma3 driver init success.",0);
$ s- v m- |, [, M
}
! h# u- n" ^+ M' u. d& Y) W7 S
}
4 I' I& T/ u6 ~, {; G
! u: [' Q. h x4 l
: j H( z/ R1 o. c0 E
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
/ L5 i1 b1 w0 Z3 J1 u% p4 A
! Q! X8 G8 N: h* D( T" ~( B- S
8 G9 _4 p* j9 q7 v" M
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
2 o* c& K+ R, Q9 d: O* S y3 D
每次DMA传输完成后都要再次使能传输
0 }1 y. V7 p0 _1 Q+ X9 X1 O
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4