嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
7 b$ n m+ L2 A+ Z; u1 @
#define PING_PONG_ACNT 1
6 |/ Z% n j: ^ g# ~9 R% W
#define PING_PONG_BCNT 8*32*40
9 Y6 K- ?2 K' j* q5 S
//#define PING_PONG_BCNT 1
5 m6 m+ ^: C% L; Y: G1 u4 a4 J' k
#define PING_PONG_CCNT 1
" k5 z1 B5 N/ y e+ R
#define MCASP_BASEADDR 0x01D00000
" c1 \4 Q/ x* p+ w6 b7 v
#define Mcasp_RXEVENTQUE (0u)
& o/ ]3 }- z% L3 B9 B2 f6 k7 F! Q$ x
7 X2 P! T2 S& F
/* OPT Field specific defines */
6 M3 x# u$ C+ V- f8 l; D% m
#define OPT_SYNCDIM_SHIFT (0x00000002u)
% M) z1 J! [' M( L2 A: E
#define OPT_TCC_MASK (0x0003F000u)
# @' V& V& H6 ^& _
#define OPT_TCC_SHIFT (0x0000000Cu)
3 M- T+ C) C/ b6 ^
#define OPT_ITCINTEN_SHIFT (0x00000015u)
# R, O" H) [9 W( [: G9 c
#define OPT_TCINTEN_SHIFT (0x00000014u)
3 w8 R+ p5 a' H% |2 l3 a
: w) E# H3 B9 K4 o$ y
char ping_buffer[PING_PONG_BCNT];
! |- i! ]: b) U
char pong_buffer[PING_PONG_BCNT];
4 t) T o! n8 \" s; c2 _8 T/ H
4 i6 c$ v9 G. T9 h$ e5 p
9 u7 }- N$ `& P0 ]. F& u
9 P0 k; p: v1 x# I. B
% w" K/ i+ P3 H- u3 J
static void ys_edma3_init()
+ A4 Y; o7 ~# O9 D/ d
{
9 ]$ u4 u' E q1 O9 }) T
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
x6 k0 U+ ]% F, F
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
+ J" Z% Q8 X& n
EDMA3_DRV_Handle hEdma;
: @+ e% B9 b0 M# v5 [: r; u" s/ W+ ?
uint32_t chId = 0;
* B( E2 N; V% N# x) S
uint32_t tcc = 0;
' Q3 h" Q V( c
! w/ f3 W7 [% D4 y! R" x
print2arm("edma3 driver init...",0);
) S. n6 \$ n9 q. U& u h& w) {- e
$ c4 r0 K$ O/ @" R
hEdma = edma3init(0,&result);
( g! ^6 \5 B0 n) v
if(hEdma)
4 X0 N1 ]4 S0 H( K, c: C: R; T
{
) ]4 z+ x8 T2 f: Q9 g8 \% J8 j
print2arm("edma3init() Passed.",0);
3 }2 d$ |# u i5 u& Q
}
^( r6 z$ C" f- u
else
9 T6 S% d$ b' |
{
* Y$ G% i+ A5 X
print2arm("edma3init() Failed.",0);
; X8 M' ~) @$ t g7 B
}
1 W- Z4 w: Q: H% n! J
4 Y) K% k' p- \8 o) c$ E1 U
if (result == EDMA3_DRV_SOK)
3 V( X) b5 ~; S9 k! \
{
$ O0 Q7 M6 c% D" R, x
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
' d1 U4 N; f1 q/ n" {) X
(EDMA3_RM_EventQueue)0,
) `0 M5 K# f5 o8 ^
&edma3_isr, NULL);
6 Z( L* l# i, S
}
( Z6 _0 I0 C# d/ y' R1 [
' x$ i2 @2 [9 y, n
if(result == EDMA3_DRV_SOK)
4 a( \# [% O/ n" L# B* }* o
{
, N2 o% G( Q' X6 ~4 z
paramSet.srcBIdx = 0;
- h4 X: I) ]% [. r( K. K
paramSet.destBIdx = 1;
- R' Q7 k" L0 b
paramSet.srcCIdx = 0;
4 W* X- n* [$ E8 h# ?8 w2 b' h8 r( a
paramSet.destCIdx = 0;
# k! y @; g. j1 E' O
paramSet.aCnt = PING_PONG_ACNT;
4 W" V- u' J/ ?
paramSet.bCnt = PING_PONG_BCNT;
0 i& g3 K* h1 A* l/ `1 B* n( w
paramSet.cCnt = PING_PONG_CCNT;
. @8 K5 P5 m- h2 U' |; a/ v* d
0 G$ S& F& Z2 b8 l4 W: c+ }9 O
/* For AB-synchronized transfers, BCNTRLD is not used. */
0 O' W7 w$ A4 s2 b3 K4 d
paramSet.bCntReload = PING_PONG_BCNT;
7 W2 x P! |- G
; f T$ G; H9 q8 R% [* \
/* Src in constant mode Dest in INCR modes */
( }# F% m% z1 r
paramSet.opt &= 0xFFFFFFFDu;
+ e$ X5 Y9 T" q( J
//paramSet.opt &= 0xFFFFFFFCu;
7 F9 Y& t: Z2 `" X
8 a9 A' j) q, N& P
/* Program the TCC */
' @' H9 y! w- x! M- w& P& R, n
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
4 H+ _9 w5 w3 v7 P5 S6 ~: J, W; y( h
% g4 g( q) W8 _: w- _; n
/* Enable Intermediate & Final transfer completion interrupt */
8 |% p8 S/ [- n
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
" ]8 X U' T1 T* c- M
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
/ P0 `6 c& {' w
. L" K# ^5 l" l# d/ H6 L
/* AB Sync Transfer Mode */
. q$ M5 }) }- H. g8 y; ]: p
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
0 C0 h$ S' j! O
- t6 |( r5 S+ _
/* Program the source and dest addresses for master DMA channel */
1 Y8 A% H/ K! U7 v- O
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
/ M- `+ ~4 _ X
paramSet.destAddr = (uint32_t)(ping_buffer);
! q% I6 {; P1 L6 u/ L3 h
, \+ p1 v4 H6 S$ ?( q
/* Write to the master DMA channel first. */
( V: M/ \# ]" }8 j; t; A& S- \
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
' @4 [* s' J+ y' g
}
2 @$ n$ t, g% w$ b4 K" v5 |
6 ~) r) Y; E+ s
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
- b: Q5 M2 t1 ]
% @2 W- O( ^* f
if(result == EDMA3_DRV_SOK)
6 q9 v T* k+ v# S2 d& q1 {
{
5 c( b6 B# B4 V+ F9 ]- z/ S* q
print2arm("edma3 driver init success.",0);
- i% `; H- U: d! F p( ^; m
}
h% B& A5 x; b
}
+ s+ C; [6 d+ Q% v
T4 b) q1 D7 r
9 y7 A+ q0 E' Z0 @) v( T \& s& E- `
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
$ Q+ r, K T6 C. I/ J! u9 @6 l
, F. i6 `9 F2 E) o" E
& {9 x3 K. I7 V8 v s4 |& s
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
) t8 _3 v( @6 r$ b- k& f/ F8 M
每次DMA传输完成后都要再次使能传输
+ G+ }/ D9 \& J+ W+ g' i/ F0 s6 X
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4