嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
. f- }/ `; \2 [+ }, \
#define PING_PONG_ACNT 1
% L! N6 F! ~ r* e
#define PING_PONG_BCNT 8*32*40
& k U8 \6 K0 O! [
//#define PING_PONG_BCNT 1
0 f0 A6 Z7 U* h6 Z, H6 m
#define PING_PONG_CCNT 1
# C- z% q% B( H4 I
#define MCASP_BASEADDR 0x01D00000
% w9 B( `! J8 _6 g; k- @
#define Mcasp_RXEVENTQUE (0u)
( }) r; @9 W% j& g
t8 u- Q9 d) |0 i$ G; z/ e
/* OPT Field specific defines */
: w* \) |' E+ d. m& O* H
#define OPT_SYNCDIM_SHIFT (0x00000002u)
7 W1 ]9 y4 w- a) N% Y
#define OPT_TCC_MASK (0x0003F000u)
) d3 z8 A( R/ @( _# D5 Z8 E
#define OPT_TCC_SHIFT (0x0000000Cu)
- n; V; c& X+ t; L% T5 e! j
#define OPT_ITCINTEN_SHIFT (0x00000015u)
% s, L, C* y3 c* z
#define OPT_TCINTEN_SHIFT (0x00000014u)
: k. s" Y/ l( i8 c
1 C; _; a7 d. X* x* ^' ~
char ping_buffer[PING_PONG_BCNT];
. ]& n7 R/ B/ _# _$ Y E1 Y
char pong_buffer[PING_PONG_BCNT];
" S9 D; X1 g! K
* }" f! B' e: ~: [
! w8 }( w" |3 \1 a: \' ^( ]9 Y' p
& c T1 o" T5 v/ [7 r( m
0 h S6 D6 B) B
static void ys_edma3_init()
7 R9 u6 ?+ x8 j- a |; x
{
4 s* @6 M' I9 W g
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
* R1 h' q8 ^5 L. A. J2 l
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
, o& E6 M3 t8 P" i1 k. h0 g, l7 _
EDMA3_DRV_Handle hEdma;
O. H% C% C% I9 E6 q/ y% m
uint32_t chId = 0;
: e7 }4 ?' _6 O/ m$ q
uint32_t tcc = 0;
, X$ g. j' P) a. v0 Y8 `
7 i1 O" Y* ^' f( U; G7 h
print2arm("edma3 driver init...",0);
* Y" d1 c G6 n* V3 c( N
3 {- b1 h% W' Q6 ?4 H* ]
hEdma = edma3init(0,&result);
6 m1 w& O" U8 N4 q3 _
if(hEdma)
/ T- d7 h3 z7 S0 u( |; u7 U
{
$ }/ L! K/ u5 \: \% t, Y
print2arm("edma3init() Passed.",0);
3 N0 ~ a5 p4 r& _( @, b+ A j
}
% \- |7 ~( j/ W$ t( P" @6 }
else
; I+ y* [5 a. x `+ [$ t+ L- U
{
8 L7 ^& ]) h9 K7 _- s t+ w6 Z
print2arm("edma3init() Failed.",0);
& o* b0 `0 F8 D t9 @, S# Q
}
* u0 x: i: I4 P& w; p. N7 n; V0 w
' `7 J) P" K' u% p4 Z9 A
if (result == EDMA3_DRV_SOK)
' w F: ~6 ?; U g$ L5 x
{
$ |$ ?" g. v( K7 P0 u
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
! ~) J" l& `2 W7 u" m
(EDMA3_RM_EventQueue)0,
2 l/ Q% e2 M" D0 E/ ?! i7 R
&edma3_isr, NULL);
6 ^6 z+ H2 E- t+ F
}
) ^7 O. F& r* m2 v6 A8 N1 h% f- m% l
. K9 Y2 Q2 Z6 I! S- }
if(result == EDMA3_DRV_SOK)
/ p7 K! z" u( u z5 _
{
% H( ]. [6 c9 g: Y" r: P7 Z5 b/ [
paramSet.srcBIdx = 0;
% d& _: u$ {5 p! |5 ^7 u7 @2 D
paramSet.destBIdx = 1;
& l8 N* y$ v6 g/ ?' X
paramSet.srcCIdx = 0;
* |% x7 k; R0 p( w
paramSet.destCIdx = 0;
9 L/ q7 W+ Z" F- j- P: F
paramSet.aCnt = PING_PONG_ACNT;
: q7 t9 E/ @* T/ t8 G, U+ r
paramSet.bCnt = PING_PONG_BCNT;
$ u7 [# ^. K5 O! k
paramSet.cCnt = PING_PONG_CCNT;
5 R, ^/ W& |, y( d! w* M+ f
' _. q8 g- ]2 i b& O9 {
/* For AB-synchronized transfers, BCNTRLD is not used. */
* w. Q2 Y4 B9 Q+ N* y; Z& C
paramSet.bCntReload = PING_PONG_BCNT;
- A2 K" P. e$ u; s4 v
" w7 _; A' ~- {
/* Src in constant mode Dest in INCR modes */
* c8 w8 ?* r1 `) D: c3 [# O$ s
paramSet.opt &= 0xFFFFFFFDu;
5 }$ J6 p! U$ i3 O+ S
//paramSet.opt &= 0xFFFFFFFCu;
/ d2 s) y. Y5 d7 y
$ [ v# d- N+ s4 W
/* Program the TCC */
% t5 y/ L. M! b* R
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
K0 u+ `/ P3 F S0 D
- d+ R# O8 T5 J9 r9 i/ r4 i
/* Enable Intermediate & Final transfer completion interrupt */
& p* U0 U! l5 ^
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
% F: U/ ~9 \+ K/ D* p
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
& R: C" ?- E6 e
) K8 ?! v, e" s2 ^; G: A, B/ s
/* AB Sync Transfer Mode */
3 r4 `+ {2 _+ F8 s
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
4 k2 ^! s3 [ i# ~* p6 B. x
0 v- h; b3 D/ T" ]( J
/* Program the source and dest addresses for master DMA channel */
$ H9 P5 t1 [! H9 X9 e, R
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
" s! j- \, {3 W3 a5 S
paramSet.destAddr = (uint32_t)(ping_buffer);
! A2 e; j" i' Q; o* j
3 X1 @6 E3 g$ l. N0 k: ^ u) @
/* Write to the master DMA channel first. */
' X. N' a1 ^% y
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
% A" G! [6 P0 e5 {& @1 `
}
+ Z2 ]5 U* u) E5 t
}0 o" |# I+ h+ A% c
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
- E8 V. ]9 I; \8 v9 @
2 p0 j# D5 }. n5 F3 h
if(result == EDMA3_DRV_SOK)
2 J7 e. U. v6 D# T8 w, D3 r; Q; @6 m
{
7 U6 H% ~' W/ x* x6 I
print2arm("edma3 driver init success.",0);
% l/ p4 V' D+ _: w( k0 b
}
/ ?0 L; c4 R3 ^2 }" G+ [
}
! m8 j9 e# A. g2 ^/ o' v7 C
" {- p4 k& V& v6 N+ E+ N
) d; ~% `' k) r2 R4 B7 y7 K
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
( _) f1 E1 X. B/ |6 a9 ^( p' J( b
. ^5 K( |0 A! z+ K( ~ A
7 t* V7 F8 b7 V. y3 l& ^" G# Z
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
( @% a4 Z: ~% V1 o4 W
每次DMA传输完成后都要再次使能传输
% t5 u) Y' l4 J2 Z
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4