嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
1 c% M e5 c8 q
#define PING_PONG_ACNT 1
. S7 k' N% k3 L2 l' B5 B4 c
#define PING_PONG_BCNT 8*32*40
+ j; p, S3 z [# z5 b4 f
//#define PING_PONG_BCNT 1
3 q1 f' _6 D) N8 z
#define PING_PONG_CCNT 1
/ I; D* y4 v' }- ]0 G4 F9 _
#define MCASP_BASEADDR 0x01D00000
4 P# Q/ x$ _; z# A) H
#define Mcasp_RXEVENTQUE (0u)
& [9 r/ D3 A. N/ U% o
" h" [! @6 ?# L2 V Y
/* OPT Field specific defines */
- J! i* Z" a, I2 P1 U# X# [
#define OPT_SYNCDIM_SHIFT (0x00000002u)
0 U8 X! W. P- ?# ^; L' B4 D5 Z: t
#define OPT_TCC_MASK (0x0003F000u)
2 N5 H ~/ Y! [
#define OPT_TCC_SHIFT (0x0000000Cu)
0 v( C9 ]( [) P! t; S. F% T
#define OPT_ITCINTEN_SHIFT (0x00000015u)
" _4 |8 h! ?& i! h+ e- m4 D
#define OPT_TCINTEN_SHIFT (0x00000014u)
5 X/ Q1 M& m2 m; h
; I5 A# k* x# r0 P$ u% ~
char ping_buffer[PING_PONG_BCNT];
. m4 n+ _. p1 q& R7 D/ x" a4 w y
char pong_buffer[PING_PONG_BCNT];
6 U0 ?! R# v8 k- E3 B, T+ d. {
1 T2 A5 B5 c5 x3 Y& [
( o0 V1 _1 w5 f; X+ S3 r- V* B* x
7 d& t' v, _6 T0 r: j, ]
; x) f/ R7 h( i( i& C+ a
static void ys_edma3_init()
7 m3 S6 q) }( a, y
{
0 U) z9 I6 w& J9 A" p$ _7 I! _
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
& G6 |0 A( V2 @/ S
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
( \3 l+ x* Q% L1 r8 N3 G3 Y- K7 |
EDMA3_DRV_Handle hEdma;
1 d7 c# V2 |' J( X6 p* f2 D
uint32_t chId = 0;
. q! z7 P: \& }9 ]/ q) J7 }3 G
uint32_t tcc = 0;
, d9 A/ m# R& k! N1 f" V" K& C
; q/ Y0 O: X6 M5 N* S: S2 r
print2arm("edma3 driver init...",0);
- H+ G% \1 Y$ p! V: }
! F& O! q# Z: o' d- |
hEdma = edma3init(0,&result);
- \9 n$ M- W+ y. C0 P
if(hEdma)
# E' D. M, }2 h" f! n
{
# i. ~+ N; w: B( I- u: V0 A
print2arm("edma3init() Passed.",0);
: e) [1 [3 h! C& p! P- Z0 Q
}
: c+ c! Q; S0 _: M
else
, H- u, T0 @+ P! @; u# h3 W' A1 u
{
3 L& }0 B9 f7 f8 n
print2arm("edma3init() Failed.",0);
9 X8 f9 y8 U1 j! ?; w! R5 u$ X5 R- K* n
}
* {! i: n f5 p; V' X* e3 {; z
- H' h- i% n" W' S5 A( u9 }
if (result == EDMA3_DRV_SOK)
- O5 b5 \3 ~; j, R3 W. i# m( H( |
{
9 x5 T. y* N9 f, x, E5 T3 L
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
% g9 \+ ?. |% z8 }6 T+ B9 E
(EDMA3_RM_EventQueue)0,
- J' J7 ?6 e1 O+ t, x7 p
&edma3_isr, NULL);
& w. s9 Q2 f5 i; a: K# ]8 S
}
& i4 A* l9 Z( q8 u# J
# I( s- V, w, B0 G" g* `1 Q
if(result == EDMA3_DRV_SOK)
' `4 _9 [& M8 N, Y
{
* V) C/ \0 C4 n+ k
paramSet.srcBIdx = 0;
% u9 Y5 G) B: a* m
paramSet.destBIdx = 1;
8 @0 T# z0 X' F- b; n
paramSet.srcCIdx = 0;
! v5 M' c( g6 S0 G3 W
paramSet.destCIdx = 0;
( A5 j% r; l4 k) N; F
paramSet.aCnt = PING_PONG_ACNT;
: L \# p1 k3 B3 w' [
paramSet.bCnt = PING_PONG_BCNT;
" Y; a5 J# e' O" Z9 E. |
paramSet.cCnt = PING_PONG_CCNT;
- }% A; O1 W8 c# r
% A- B* S U6 F, Y& m% t- u* _ }3 X
/* For AB-synchronized transfers, BCNTRLD is not used. */
. C+ ~5 ~1 V+ ?
paramSet.bCntReload = PING_PONG_BCNT;
9 x; J @3 {. P9 ]5 T
h( Q1 w, q( `" g% v0 v
/* Src in constant mode Dest in INCR modes */
: o! l4 K, M0 e& d0 L
paramSet.opt &= 0xFFFFFFFDu;
4 N2 t+ H( ^7 [& K( G r
//paramSet.opt &= 0xFFFFFFFCu;
7 Z0 i3 a" U( X: U7 D3 z
* f7 L( e7 `$ s$ k- N- Y
/* Program the TCC */
( D+ c$ \ X# X- i
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
/ O/ L" {- ]8 \6 H& z% Z3 g$ m
. j+ _" P& ^; g" H' c" J# R
/* Enable Intermediate & Final transfer completion interrupt */
0 ^3 l3 `- |9 i% G# j1 M2 D
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
; y( V% O* C+ f$ F! e8 N( M
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
$ }: k9 N3 S& b
7 E: {6 H" Q; u* O5 i/ N; V) \
/* AB Sync Transfer Mode */
$ J* V9 j# J. M2 X" e0 o8 m
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
: i% Z" F1 x: |( a9 q% c1 R) F
( _& P6 R( U) Q
/* Program the source and dest addresses for master DMA channel */
7 q" q( ~' v' v, S, S' A ~
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
7 F% B# I# p a# \5 f
paramSet.destAddr = (uint32_t)(ping_buffer);
) T( G% h# I$ k' l8 A9 s, F& w) b
( q8 ], A h. F$ y* L: ^( w. A
/* Write to the master DMA channel first. */
! U8 r2 k+ d% M( q
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
7 u7 l! x. T0 L8 B6 r- b. F: E( U# i$ }
}
* h6 ^ O5 ?8 p- f
2 ~1 ^. P1 D7 f" i) z# o6 @8 O) H
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
5 A$ i+ D0 B& g! q" e
. a' Z+ N+ m- B, z" L; m
if(result == EDMA3_DRV_SOK)
8 V, r ^7 \) U6 E6 q
{
* Q3 A. X7 d$ {. p- H1 h$ D! q9 s9 a
print2arm("edma3 driver init success.",0);
- U* I( [! R0 n/ t: d" q3 x% S
}
- G0 R# C V; N" B* G* L# z1 J
}
, W# Q3 ~8 w) c" p, i
, Y* d* O8 Q/ b( y5 \
0 ^3 t1 U) s ~+ B
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
2 L9 t: a8 g+ w* L% o0 e9 P- w0 L4 R
" M5 ^+ P, l0 M& U$ j
( n; C- W9 T; _3 e! A# u8 G
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
/ z5 w8 x- O; U7 V
每次DMA传输完成后都要再次使能传输
$ l$ M. |+ z4 k% C- q4 R
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4