嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
2 Q, z4 U; u8 A
#define PING_PONG_ACNT 1
) E, i' V! \4 t8 b
#define PING_PONG_BCNT 8*32*40
$ G2 H' e5 L( Q- h5 N! q" T
//#define PING_PONG_BCNT 1
! b+ t& _3 y) ]2 m
#define PING_PONG_CCNT 1
. R7 d: S1 Y( O: ]
#define MCASP_BASEADDR 0x01D00000
% p: L5 b2 l$ O+ N7 V7 T
#define Mcasp_RXEVENTQUE (0u)
+ d0 R8 K) j- @, B7 g
: [" R( ]9 Y0 n. Q7 {2 [
/* OPT Field specific defines */
7 Z! b3 w: ?) F1 @& k
#define OPT_SYNCDIM_SHIFT (0x00000002u)
^4 C# Q0 L s2 \. Z) o' N/ b3 [
#define OPT_TCC_MASK (0x0003F000u)
$ X2 N2 Y; Z3 e9 o$ ~/ a4 L
#define OPT_TCC_SHIFT (0x0000000Cu)
7 s, l: e) ^. T3 d, R5 m
#define OPT_ITCINTEN_SHIFT (0x00000015u)
& U/ h& ?! S u4 b D; [
#define OPT_TCINTEN_SHIFT (0x00000014u)
4 z: Q; t$ T# |% F( z3 B
8 {& \1 U* }, k; D% M# I, ~4 A
char ping_buffer[PING_PONG_BCNT];
S6 M% y3 t8 ]7 p) h
char pong_buffer[PING_PONG_BCNT];
% }* ]) k- D- Z) ~7 p' a$ A
/ Z9 ` }; L0 @# V* `$ e3 p
- V5 f- M" q& h" N1 Z# c. \
; a% C X4 ~( j8 Q; s
0 i7 e$ r/ j+ M" ~
static void ys_edma3_init()
% s" D. x/ k9 o2 b o
{
+ x5 [: f9 J* X* ~
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
5 U0 c! n( k' S* {
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
8 \9 z6 g4 z+ u7 n! _
EDMA3_DRV_Handle hEdma;
4 i8 x2 S$ r3 V6 }* S, {# t
uint32_t chId = 0;
- p3 J! y$ U7 f. x
uint32_t tcc = 0;
. d8 o" F2 K+ h& {( z
, m b0 U7 F( K T+ D; G! E
print2arm("edma3 driver init...",0);
; u/ s$ ]% J, p7 e2 S3 G
2 m2 V: Z/ e, f% g) P
hEdma = edma3init(0,&result);
( E2 p. w" d( v% `& A. i+ i2 {
if(hEdma)
% ]- l' ^* T7 j
{
' O, v1 S6 N5 i" ?
print2arm("edma3init() Passed.",0);
: h/ `# R7 Z ~: [# r0 F
}
5 q. l2 K( x+ L) N* B1 R
else
+ L x9 [. }0 x
{
8 ~8 ^1 l3 ^' S2 C: t2 ~+ d
print2arm("edma3init() Failed.",0);
3 F- m2 W9 E1 ^% G
}
7 q/ W7 X% B: I" B
_1 v# [! n4 l+ R
if (result == EDMA3_DRV_SOK)
* B) Q" K6 }& @* x2 x
{
* \- v% _ |7 W6 A& ^+ {
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
9 P2 e' J E% D* V/ k0 ?
(EDMA3_RM_EventQueue)0,
! p' N, b5 M& p+ u+ @; \2 B" A) L
&edma3_isr, NULL);
* ?) t3 ]- H& G& a" X
}
1 a1 i8 i0 {/ z& m& r
* p3 P/ s$ S/ W0 L* m! y
if(result == EDMA3_DRV_SOK)
: t' k' ]4 E/ o9 [1 }* L0 P
{
2 |7 b P5 I P8 h5 q8 R3 {! I
paramSet.srcBIdx = 0;
! M1 o3 s: e* c$ l
paramSet.destBIdx = 1;
f1 W3 X7 [5 r( P0 I0 w3 x
paramSet.srcCIdx = 0;
/ }! W, A- q4 Y3 G Z9 Y6 M
paramSet.destCIdx = 0;
/ B0 O( @0 b3 H+ c9 {
paramSet.aCnt = PING_PONG_ACNT;
+ ]8 `, s: V+ m
paramSet.bCnt = PING_PONG_BCNT;
& Q$ W% U2 e6 w+ e" G
paramSet.cCnt = PING_PONG_CCNT;
& D5 {7 p( g% J' m6 m
, ~% |+ S1 ]+ ~2 n
/* For AB-synchronized transfers, BCNTRLD is not used. */
: b- G% t& A# B) D) ~' p, b
paramSet.bCntReload = PING_PONG_BCNT;
' ^- a/ u/ s9 o, w0 z
+ f( J1 ]- h1 i4 @, O# J
/* Src in constant mode Dest in INCR modes */
3 c( W, J9 R/ p3 H% I) {
paramSet.opt &= 0xFFFFFFFDu;
. V( q* n0 U1 F( U
//paramSet.opt &= 0xFFFFFFFCu;
2 ~) Y2 I' C0 r( _+ A
: Z! w0 {- @: ^# _# _' S5 G
/* Program the TCC */
+ b, j/ w3 j3 J$ ]- s0 }
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
/ O, z" S7 J- M+ \ ?1 `
9 o- |, n7 Z- n" T$ |+ O
/* Enable Intermediate & Final transfer completion interrupt */
8 @1 c9 W" I: v) M6 h; Z" X8 c
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
2 T8 \! v# Z) F+ ]2 z9 n7 M2 `; V
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
2 a7 M" [; e/ C. U, M
# Y! v/ U* U) M- S: x
/* AB Sync Transfer Mode */
5 [# d8 b! i9 W6 z2 U2 ?
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
4 c) G. ~- O6 w( l
/ m0 J" {* L( i: o
/* Program the source and dest addresses for master DMA channel */
0 l9 Z$ h( H, E$ s, V5 F4 R
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
, A2 k" r A: y
paramSet.destAddr = (uint32_t)(ping_buffer);
; E$ q9 T. s4 F7 i& h2 G
1 E' t& E+ c9 ~. K7 E
/* Write to the master DMA channel first. */
" b. q. l, ]% j+ e( ?) D) ]
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
% w/ |$ o; q2 v3 H4 E. h( M U
}
5 }' r. u6 E5 ], o7 Z
: i: N; D C$ a9 `$ \. t0 H' u
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
6 O- n, {: @% t" d; Q* c- z0 r
2 Y$ }0 X) X+ B9 U+ w
if(result == EDMA3_DRV_SOK)
5 N; j, o' d" l, k8 f7 x$ F
{
# M5 l$ e2 j% S' e
print2arm("edma3 driver init success.",0);
4 {8 D/ H8 E, M. d0 `9 X& \. d: S
}
6 s8 g* s! p+ J l+ L8 j, |
}
5 y F$ R4 v1 D W* M# {2 C; E# s
; s+ w, ]. Y/ D
( m- k$ m7 E4 c
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
7 y. R4 c1 A) _5 m: J
9 m% \ c) E0 w& Y- K
' D/ | P2 s. Z7 O9 D9 F# x
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
, }3 R3 e2 S1 D1 ^# U& s0 t
每次DMA传输完成后都要再次使能传输
, J; r9 W6 f7 g, G8 f" Q
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4