嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
4 ]. t+ V7 @* M. n2 B
#define PING_PONG_ACNT 1
$ T; f3 ~8 V* w" Z! D
#define PING_PONG_BCNT 8*32*40
3 k9 o8 L4 I3 E4 h
//#define PING_PONG_BCNT 1
; J( D; D( R0 o8 @* @
#define PING_PONG_CCNT 1
. I- g/ Z; ?: f$ ~* F, G3 V
#define MCASP_BASEADDR 0x01D00000
* ~' W& [; B$ x) _6 F
#define Mcasp_RXEVENTQUE (0u)
$ P/ d& } d# c& v
7 G6 {; L/ Q3 g6 b* N1 `( G, C
/* OPT Field specific defines */
/ f- M _, u' O; [5 B4 R e! F
#define OPT_SYNCDIM_SHIFT (0x00000002u)
' u% k, W1 r7 |: h F5 n
#define OPT_TCC_MASK (0x0003F000u)
5 G# Z# P, @! P( N8 y, [
#define OPT_TCC_SHIFT (0x0000000Cu)
# a- ~0 E3 P! R4 S6 s2 W
#define OPT_ITCINTEN_SHIFT (0x00000015u)
; O ^4 W6 @* J( S) x" I k
#define OPT_TCINTEN_SHIFT (0x00000014u)
" y! m V- a0 s+ N: J: P3 a& Z
% ?4 T$ e. K2 e8 W3 H/ K9 s- l
char ping_buffer[PING_PONG_BCNT];
9 |9 i7 v# \8 Q- w; c1 E( M, i" P
char pong_buffer[PING_PONG_BCNT];
) q1 L& F3 U3 f3 g6 J. E. v
6 H5 C+ ~" Z& ?& b! A
8 d; J. E3 k( j
% `9 a; p# S x/ D; `
" v6 Q" n& _- ~
static void ys_edma3_init()
. ^0 B. F7 A- g# A$ C) C
{
& [8 |1 O8 K* C# V n6 p. }
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
3 p+ y/ L+ D- R, _" K: G0 t! I
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
& V. J% E) [( T: |9 W
EDMA3_DRV_Handle hEdma;
" {, e& k) @& E: m! V1 w2 ?
uint32_t chId = 0;
0 r2 Z9 T6 I ^6 c; p$ P" O
uint32_t tcc = 0;
6 I9 E d( b7 [0 G4 K$ x
! p* v, s! W. j) \
print2arm("edma3 driver init...",0);
4 M8 u" f' u+ T9 u ^
. N5 i+ d9 K7 e- g* F
hEdma = edma3init(0,&result);
1 D3 p8 V* r: K0 y9 }
if(hEdma)
: S8 O5 m6 j% c* O4 z r' ~. i
{
% b6 P9 y" k9 q& t/ a
print2arm("edma3init() Passed.",0);
! b5 ?4 l: e1 A# |; T* ^, d$ l
}
/ u- q1 V- D# j% w9 j/ t. K1 a* y
else
+ c" J3 s$ R1 o9 Z
{
/ d# N# Q' \( J# {! r" h
print2arm("edma3init() Failed.",0);
6 ^6 C9 V W8 ^0 b" j. U( b# x
}
! T5 `4 _. L5 u; q( I5 W
" x$ o& s6 y& {6 u0 ]
if (result == EDMA3_DRV_SOK)
$ B2 Y: P- h& _9 ~0 u1 Z
{
7 J- ?- C9 {: C( \
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
; x- I6 l; j% c$ B* w* \/ W
(EDMA3_RM_EventQueue)0,
* P& R7 _3 }0 |/ d. N. J' q" [$ L5 Q
&edma3_isr, NULL);
" J4 e/ p% V% D! W) o4 L
}
- I, h& d& ?, Y( A" U! o4 w' D5 ^
8 D1 t, I9 I: W+ ?% P& R
if(result == EDMA3_DRV_SOK)
! b) Z5 h" N' ?; U4 a; A0 U9 E: q
{
4 }, `* e4 X& v1 @
paramSet.srcBIdx = 0;
' q$ U( B- Y) M
paramSet.destBIdx = 1;
2 x5 B$ S7 W3 A( R4 u
paramSet.srcCIdx = 0;
l2 ]9 \" Z" z/ J
paramSet.destCIdx = 0;
! m+ N! ]0 X1 Q
paramSet.aCnt = PING_PONG_ACNT;
0 c/ ^1 f3 ~) ^6 r i
paramSet.bCnt = PING_PONG_BCNT;
# {) I5 ]8 [% G) Z! B' s r
paramSet.cCnt = PING_PONG_CCNT;
( O# X% D$ h4 Y3 \' |% M0 H
1 f k3 p5 V& V6 J; z
/* For AB-synchronized transfers, BCNTRLD is not used. */
( r8 I1 O/ G. l% j, u
paramSet.bCntReload = PING_PONG_BCNT;
( m- f& ~1 q( |5 K5 T
9 X3 U: v, m& S* W5 y& J, m3 [
/* Src in constant mode Dest in INCR modes */
8 o. q; K8 n `5 }
paramSet.opt &= 0xFFFFFFFDu;
: B, F' p2 X7 u# J- G
//paramSet.opt &= 0xFFFFFFFCu;
! w7 H+ d, L7 z0 U- {
- |; I+ c0 {5 _; a/ `0 J4 n
/* Program the TCC */
1 P% g, N6 g6 j, _8 `; g N
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
$ K9 x7 Z2 g6 {5 \ k" D; `6 ]
% g- e% j3 H4 X6 ~/ d
/* Enable Intermediate & Final transfer completion interrupt */
# i1 Z, f0 f4 e
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
. M- f' F7 E) ]
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
$ P/ B- q* k/ v; M3 X1 X
$ W0 j3 A! W. e
/* AB Sync Transfer Mode */
: R, @1 z, z; L, R8 L& S$ D) H- c7 T
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
* j% \+ u" ]/ d; ^1 L+ M+ ^
D9 P( X6 l3 F5 j) k7 B9 c1 S/ O- J
/* Program the source and dest addresses for master DMA channel */
% f( B" f4 H7 _ J; w9 e
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
- g' D8 Y& b! q% F
paramSet.destAddr = (uint32_t)(ping_buffer);
/ f& ^0 e; }6 p% K: [+ S$ m
7 A; h6 Y$ ?, k3 d! T4 F
/* Write to the master DMA channel first. */
7 u1 w5 l* A+ E9 n; i
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
- Y$ N1 ~5 d4 q: C9 T8 G
}
) P- W/ d5 d% l# t) i& ~
7 Y3 A* ^9 h$ @ t% Q4 B
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
0 U; }7 W9 I9 I. h/ O
. [/ l( f$ I9 R9 H! o0 x0 b0 z$ [2 o
if(result == EDMA3_DRV_SOK)
1 k8 |' ~4 U: P+ D0 _2 F
{
. y( Z4 m$ @ i0 a7 `" l; R
print2arm("edma3 driver init success.",0);
2 ]9 ~, H- J6 O" u
}
0 P( `% A" N5 W5 k% E+ M
}
& _2 N2 K9 k) y5 J" w
& q4 m) s3 N% O5 C2 P
; i3 J: w# u1 t) p
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
7 ?7 A) Y7 j+ t, p/ \. o1 f
' a, B4 P8 g0 f& m) U1 t
. W3 _: x( c2 r3 r4 O" i" ]( B
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
) ~; f D3 g) n$ g2 R9 [
每次DMA传输完成后都要再次使能传输
1 z- t F- h2 V, t( h! N- ]
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4