嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
$ y$ U @3 Z9 b" M5 Q4 T
#define PING_PONG_ACNT 1
& ^, [* O: o0 f& U# ^+ z# m
#define PING_PONG_BCNT 8*32*40
8 _ M5 H' C- g* m0 O
//#define PING_PONG_BCNT 1
; n) E# n3 k5 j6 ?/ `3 d
#define PING_PONG_CCNT 1
" t" \% D3 l# L2 Q8 A- {
#define MCASP_BASEADDR 0x01D00000
8 Y' i; V/ Q- g# Y5 l* x
#define Mcasp_RXEVENTQUE (0u)
% a; A; n* Z% g: N0 R2 `5 D
; G- ~7 v$ w A( t/ h w! V) l
/* OPT Field specific defines */
4 P9 r4 u, t5 r+ g
#define OPT_SYNCDIM_SHIFT (0x00000002u)
% e# |& J4 K( u. t6 i, X( G/ X
#define OPT_TCC_MASK (0x0003F000u)
- i6 S! L1 I+ H( v
#define OPT_TCC_SHIFT (0x0000000Cu)
- \; d" ]7 Y8 d- j/ e2 k* i
#define OPT_ITCINTEN_SHIFT (0x00000015u)
( P' L, i* d: E, ]( ^
#define OPT_TCINTEN_SHIFT (0x00000014u)
: S1 T* @5 G4 p- d/ r2 P+ U
$ \! G. G( R" Q
char ping_buffer[PING_PONG_BCNT];
' i- g6 T, B" c3 |; `: h
char pong_buffer[PING_PONG_BCNT];
4 i& ^; S$ y& }6 s( Y
2 I/ b3 J+ S/ C0 g. Y* P% {* ?' q
3 _, X* ~) g1 F) |/ M
* U$ A4 G) Y4 P& _, a1 L0 o
7 Y- z3 I' Y/ y3 M, ^' A4 [
static void ys_edma3_init()
$ |/ v; K. d9 t6 Y& q: [
{
- |# l0 J9 b- s' I* Z9 J6 z
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
1 P( C6 Q$ @1 I/ \
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
, T7 m8 q1 b" G& h/ ^" Z
EDMA3_DRV_Handle hEdma;
5 K5 ^- U$ N- K$ }3 k& B
uint32_t chId = 0;
8 ]( r. f6 `5 ^
uint32_t tcc = 0;
# l- \. ~& g4 G* q, G
1 |5 f: n1 H6 q
print2arm("edma3 driver init...",0);
8 N2 J6 ^% C0 u! C: W: A# x" k# C" G
6 F& r8 ^& {% T: D- X
hEdma = edma3init(0,&result);
. f! D) o6 M; u0 C" N' N
if(hEdma)
- g( L" l4 b) S' ?4 p$ z' c; a1 q% G
{
: A2 s# p, M- P; |; b# t
print2arm("edma3init() Passed.",0);
/ [# @, _3 V4 l2 U% i
}
5 ^9 {: f( q. s' |+ i
else
; b) v1 y4 l7 I! H, T
{
- {- a }: ^: u' n# g! {
print2arm("edma3init() Failed.",0);
+ Y, R: R) L- b: V
}
Y5 g2 M3 g# }
" P" }; O* r7 n r
if (result == EDMA3_DRV_SOK)
4 R8 U+ b( V- }2 L" b' S" E
{
* R! b0 p7 H. L# O. ^! k- H4 O* y
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
7 V5 I0 {' Q2 V; D( j9 t
(EDMA3_RM_EventQueue)0,
3 p$ Y- s( W5 K( c
&edma3_isr, NULL);
, k; |# f, Y; ^: M# K0 g9 w
}
. K: E! Y S- c: B; Z
* a+ I' N- b. f) ]3 E @+ I
if(result == EDMA3_DRV_SOK)
$ k: o9 D3 A) @5 k
{
) }5 r0 ]1 C; u
paramSet.srcBIdx = 0;
( _! D* w; p/ {+ m( l7 m
paramSet.destBIdx = 1;
* @" o$ u, ]4 A6 ?/ @; h
paramSet.srcCIdx = 0;
# e) P) p! ^4 G$ u
paramSet.destCIdx = 0;
, U0 N! p$ m2 {* E
paramSet.aCnt = PING_PONG_ACNT;
/ d% j2 g0 ~. f! c1 M9 y2 F
paramSet.bCnt = PING_PONG_BCNT;
* b2 I. S$ Y! K$ `
paramSet.cCnt = PING_PONG_CCNT;
( |& V( _0 e( R3 \8 U" l; S
! u5 ^5 S% ?. h+ a: ^
/* For AB-synchronized transfers, BCNTRLD is not used. */
. [2 _: ^$ w0 X G
paramSet.bCntReload = PING_PONG_BCNT;
( y5 i7 ]' S1 j; z) I
# N. w+ I2 ~, q3 U+ n
/* Src in constant mode Dest in INCR modes */
6 h Z) R5 [; d
paramSet.opt &= 0xFFFFFFFDu;
9 `" u' X- f, m' }$ g8 P
//paramSet.opt &= 0xFFFFFFFCu;
/ B/ S5 k5 |, U2 F
4 s7 b7 @3 O6 w } y1 g$ S# v
/* Program the TCC */
# H1 w: k L) c
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
* t- w w; [) ^8 k
: b) x9 `" B: V: V
/* Enable Intermediate & Final transfer completion interrupt */
. H, M% S: p/ Z8 u2 v' P7 e
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
0 ^: ^( `' I9 M: w0 D
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
% S# L9 k3 I' u
, u$ l n# } E" ^
/* AB Sync Transfer Mode */
8 ^4 d W0 \9 ]
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
]. X, z. F- C9 t K1 H$ S
& ^5 L3 x" g" {' t
/* Program the source and dest addresses for master DMA channel */
- b( W% g" ]8 D( P
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
9 h* J8 h m5 m3 `/ B( o) V$ F$ {
paramSet.destAddr = (uint32_t)(ping_buffer);
' y; y7 U, K i7 H
" l: ]6 p4 `: B6 j, f1 s q% d
/* Write to the master DMA channel first. */
; ~" J% ]) i5 A2 R* |5 T; |8 u
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
$ l" h% K6 |" {2 r" S3 l
}
: J- X, X5 Q* {- d& V9 E& ^
2 W4 R3 m& G2 i1 Z* v
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
0 O! Z6 s8 |& O' O
) ?) z% c0 j7 Y7 {6 u# r* R* w
if(result == EDMA3_DRV_SOK)
0 m- a, y- z3 Z) p, |" q1 r
{
% L* ~9 K5 N7 D$ F$ x
print2arm("edma3 driver init success.",0);
4 P4 p% w! f4 B& Q+ g$ X6 V( E& C- U
}
r& f6 {& I; i. g* t! q# M
}
; G+ }% h! H! ]- o
- O4 A# ], d+ N: W/ o7 V% F) u$ X* S
/ D% J+ \9 ]2 F. G
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
3 t. F: i3 k# c' m. K. K
. x4 Y. z# k& J8 T# a+ H" ~6 x
: u- S6 K5 u( V7 a
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
/ c9 i* g" \" p9 T, u: R! m6 I
每次DMA传输完成后都要再次使能传输
" O: n$ {* K2 d- C. S+ l( [- I
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4