嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
. ^0 D D$ _, |
#define PING_PONG_ACNT 1
5 w' j# W* b8 m" C' @4 a+ ]9 ]( A2 G
#define PING_PONG_BCNT 8*32*40
$ O2 P6 q1 t) U. o- A Z" C
//#define PING_PONG_BCNT 1
}7 W. l5 \+ Q% x y( x
#define PING_PONG_CCNT 1
( Y3 r( u/ S; ?1 }/ I' A
#define MCASP_BASEADDR 0x01D00000
( c9 o$ g6 |+ h: j4 c' |6 `2 E
#define Mcasp_RXEVENTQUE (0u)
$ i3 y0 M# o+ b
" V' f t( T9 [7 r7 r9 N
/* OPT Field specific defines */
" S, Z5 ]0 l7 \, x8 P& h0 z
#define OPT_SYNCDIM_SHIFT (0x00000002u)
- a2 Q- ?; W0 ~8 L
#define OPT_TCC_MASK (0x0003F000u)
9 b, ^7 ~' g5 w- s' J% y
#define OPT_TCC_SHIFT (0x0000000Cu)
6 |, |3 J* C8 |" S# ` L
#define OPT_ITCINTEN_SHIFT (0x00000015u)
' N* y, l$ S4 x/ E" W
#define OPT_TCINTEN_SHIFT (0x00000014u)
% e+ ]7 {) o+ J8 R+ @
% u2 G7 g& J- d4 E
char ping_buffer[PING_PONG_BCNT];
" U# ]; ~/ B Y" G# P
char pong_buffer[PING_PONG_BCNT];
4 j! A8 c3 | P
6 x) F$ P, G, V t N
! u5 d4 |) j( U V
T4 P8 R$ Q$ u' |
; x. J, R6 Q0 m# y8 l
static void ys_edma3_init()
. }1 ]! ^4 c' W) B W. W O
{
0 | W5 q- m$ _& V0 L7 E
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
' S. ^8 E' z; J0 |4 @
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
/ q& P- Y3 ?4 M( o. |- H6 X
EDMA3_DRV_Handle hEdma;
6 Z* x6 _! d, T/ x
uint32_t chId = 0;
8 Q* S- c2 [& `3 O
uint32_t tcc = 0;
" d! `( P0 q- A" u5 W! m
8 g& _& M ?& M1 m. e7 E; Q
print2arm("edma3 driver init...",0);
9 w2 C0 q, Q: ^: V3 j: I S$ [
- A% n( E$ L0 a: Y: Z- u- `
hEdma = edma3init(0,&result);
1 P$ r% o5 I8 [; u; N5 ]! h |
if(hEdma)
/ m! ]4 S% h- g6 s7 r: T$ B! u
{
) q0 Q- P" o4 K& T, Q
print2arm("edma3init() Passed.",0);
+ g/ J7 D: x+ C J( L3 w
}
% X/ R* ]" ?0 | A( C# n
else
; q: `! Z/ |( b4 H# L. a. g1 n
{
$ U7 z# S9 E8 K2 V
print2arm("edma3init() Failed.",0);
+ w8 b0 `5 Y% |: S% X) n1 |
}
" t, J! Y* f9 m0 Q' O# H
; m4 V( E8 r5 B4 p
if (result == EDMA3_DRV_SOK)
% W+ @' @. O1 A4 n1 p! I" ^
{
' F9 o+ o) M( i
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
( i* ?* d+ p( J' L/ D
(EDMA3_RM_EventQueue)0,
& V0 N& z: \6 t, g! n6 \
&edma3_isr, NULL);
3 x5 p, W5 J+ }
}
& Y/ A) I) _: \. F
/ |4 A( \% K6 f! |4 D
if(result == EDMA3_DRV_SOK)
0 C0 [/ }) ~% [8 |
{
- O8 G% D+ b' @. n/ F5 b+ ~
paramSet.srcBIdx = 0;
: J4 ?' f6 q9 J
paramSet.destBIdx = 1;
5 } D/ ?# m( ]( o
paramSet.srcCIdx = 0;
* S. V B! [% A- l" D2 O8 ^
paramSet.destCIdx = 0;
/ E$ P) u/ q5 U7 d: v- P1 P
paramSet.aCnt = PING_PONG_ACNT;
; Y0 t) w$ }0 k5 }0 \' n
paramSet.bCnt = PING_PONG_BCNT;
, m: x) K( Q- @0 u+ D
paramSet.cCnt = PING_PONG_CCNT;
4 _: W( X9 M( L" l$ b6 R6 W2 r
: N6 D, j0 D4 [; g# z4 e0 m
/* For AB-synchronized transfers, BCNTRLD is not used. */
$ C. [/ k8 ^9 Q! |/ \0 j: Y ~5 m
paramSet.bCntReload = PING_PONG_BCNT;
" D' U, w& `. o
6 g3 Q: |$ I; M0 q9 p4 O3 ` i- q
/* Src in constant mode Dest in INCR modes */
$ y5 S3 l- G- x6 m- ^, V, @: r
paramSet.opt &= 0xFFFFFFFDu;
4 j: c, _0 M( u" p& o
//paramSet.opt &= 0xFFFFFFFCu;
: q1 [$ `, B; u7 g0 {9 m
/ f0 R8 `" q* E) n
/* Program the TCC */
" B" r+ w" i; ^( T( D0 ?4 s! c8 |
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
' U& y) N# o& o! P2 @6 j1 o2 }" Q) z
% `" b, \/ \6 S# D E
/* Enable Intermediate & Final transfer completion interrupt */
( M2 B ], [6 b( ?8 ?; H1 r( y
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
! J, r& q0 u; p# F
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
! n0 t7 O, U8 S" a+ y- F: z9 A" a
+ G" s$ `; g3 x
/* AB Sync Transfer Mode */
" c% y0 v" Y' I. v( e
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
. k, _/ X0 G* w6 T+ p+ B9 c
4 f4 W$ X+ F; m3 Y' I
/* Program the source and dest addresses for master DMA channel */
: C( A/ ~1 |5 q7 D
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
% q( |% O5 _& f( {3 O& g
paramSet.destAddr = (uint32_t)(ping_buffer);
2 ^- V X9 U3 `& r7 @2 G9 Z A7 x
9 q% s# k1 R: x- P
/* Write to the master DMA channel first. */
& L# l! R' Y0 S
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
. H) n/ j$ M8 r5 \
}
' I& ^, b. f2 V7 F# x
( [2 w' [. N4 I2 }+ P/ ~+ W
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
0 i: B7 v9 D2 K# l
. N+ x& v5 R9 x# W5 {
if(result == EDMA3_DRV_SOK)
9 j5 p4 c+ o A6 l/ v0 x
{
- X, {" K' y4 _- ` n4 R
print2arm("edma3 driver init success.",0);
, E/ a( X E+ R' l9 U$ d: a
}
+ i5 H/ {- m8 U3 p# ~! c7 i
}
" P Q% k0 ^3 a1 U9 }- Y
& o' @3 j4 g% @5 h1 E
0 V' R+ E6 G; n2 m
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
1 \: v0 i2 i* }( j! {
h( g% w' j3 X2 v/ g: n
" h4 j# g+ W1 O; b: s
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
$ V9 `7 y- v" T3 X [
每次DMA传输完成后都要再次使能传输
9 {# V5 M& H- R4 [+ X: c# I5 m
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4