嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
; k1 i7 Z; D6 j. N% k. y
#define PING_PONG_ACNT 1
. m) g. U) }9 q7 a
#define PING_PONG_BCNT 8*32*40
+ W l1 _7 V' t9 }
//#define PING_PONG_BCNT 1
- `4 W! c& p7 m1 l; b. s
#define PING_PONG_CCNT 1
9 t, X: y$ V7 S8 \! m. \% l9 _
#define MCASP_BASEADDR 0x01D00000
, S( t( p+ `( a9 R0 `$ x" @: U# m
#define Mcasp_RXEVENTQUE (0u)
, u6 C& R B' H
" T6 F! u+ S/ u
/* OPT Field specific defines */
! j7 y8 h9 |6 F6 D1 @
#define OPT_SYNCDIM_SHIFT (0x00000002u)
: X+ ~' B5 J; n
#define OPT_TCC_MASK (0x0003F000u)
5 ] c: Q2 i3 e0 _) w4 P9 ^. J
#define OPT_TCC_SHIFT (0x0000000Cu)
2 R1 w+ ~6 ?* b0 V X( X) R
#define OPT_ITCINTEN_SHIFT (0x00000015u)
) i& \7 b" c% t; K8 t
#define OPT_TCINTEN_SHIFT (0x00000014u)
! e9 Q' [, h0 F. ^% H
2 ~- ?4 j' ~6 U. p/ j& v- Z
char ping_buffer[PING_PONG_BCNT];
* s* f$ a) ?: U+ g
char pong_buffer[PING_PONG_BCNT];
* K+ M: T# L+ K' r
8 R T ~, \3 } ~1 A
. d# t3 Q- \: s1 L
& d' m. @$ e4 E7 t# n
0 ]' }6 S9 R9 E8 Z' E0 c! v
static void ys_edma3_init()
4 v9 }) B, G/ ^( F* b$ |3 N4 D
{
6 o) ^* {3 a* ~. B8 P6 l
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
/ r; V% i. P: }5 D# F' u
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
2 P( J3 `) _# S3 e5 e ~
EDMA3_DRV_Handle hEdma;
z, i- ~7 [: o+ b# }
uint32_t chId = 0;
( G2 f7 H- W2 y9 ]* a: W: T8 u7 y
uint32_t tcc = 0;
( E9 ~7 s. J- S+ E2 Q# f
4 M' y& |' u! m( Z: W0 ~& ]1 _
print2arm("edma3 driver init...",0);
/ ?% h: ]% M! ^1 N8 X
/ o; z( H* t2 g5 y
hEdma = edma3init(0,&result);
( ~/ I$ K" S" V
if(hEdma)
; h* h3 X6 J$ F# [
{
, J' i: A' {# A% a) b, @
print2arm("edma3init() Passed.",0);
& i8 ^! x T- {' @) y
}
/ x5 Q" I* L0 c, [* d2 _+ [3 r
else
9 w( P) j2 b8 C5 \+ y
{
1 B. |- | B: l- c6 I. t
print2arm("edma3init() Failed.",0);
5 F$ b( `( z" i2 Y
}
0 q- m6 P9 n: V: g9 k2 c
0 j3 u$ `% F: T" X1 g' @
if (result == EDMA3_DRV_SOK)
1 a/ d, {0 y- a% f2 V( L- v& w' C
{
' B! [' C# a( _+ R& C4 j% E
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
5 z: N1 i" U0 S3 k2 w& d
(EDMA3_RM_EventQueue)0,
0 ?/ Z8 p' W2 e( `: }1 d( P/ j+ M
&edma3_isr, NULL);
) U4 h7 c4 Z: H
}
K8 \$ w3 R6 d5 j4 O! }
+ t2 C2 ]& {( b, M" Y+ C0 y( c$ I5 b
if(result == EDMA3_DRV_SOK)
1 p8 M9 G6 N3 @( q2 y3 ^) @
{
" i; f& I7 F- z- z4 K2 `
paramSet.srcBIdx = 0;
# N* e* P8 O E8 J; _* B; Z
paramSet.destBIdx = 1;
2 Q$ B+ {) h1 z9 J m
paramSet.srcCIdx = 0;
% _* k m/ X' ]) i) x2 z" H
paramSet.destCIdx = 0;
0 X; t( J) o( s4 B5 {
paramSet.aCnt = PING_PONG_ACNT;
, C1 X& {- a# a* F# Z" |) U
paramSet.bCnt = PING_PONG_BCNT;
3 c) B- W" ?5 V1 G: J6 p8 D7 {
paramSet.cCnt = PING_PONG_CCNT;
: Y6 x8 T# b8 T W3 r
/ b7 e. b" W) f) M4 k! t9 c
/* For AB-synchronized transfers, BCNTRLD is not used. */
" p& `. f1 t1 v' ]% k
paramSet.bCntReload = PING_PONG_BCNT;
! b$ a4 }+ e- c( h+ l, G1 B
: |4 L: V) D7 s1 ]" c4 } \
/* Src in constant mode Dest in INCR modes */
I& d n6 d4 }- S( h
paramSet.opt &= 0xFFFFFFFDu;
' I! t- \" a' X
//paramSet.opt &= 0xFFFFFFFCu;
5 I/ n6 ]$ l, M
4 G( c9 ~8 o+ K, d7 M
/* Program the TCC */
% z. d( C5 E" u; J3 ` I
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
, I* Y0 @. L8 L6 `, b2 S# M5 M
1 F" s# b6 ^* b$ W$ O
/* Enable Intermediate & Final transfer completion interrupt */
0 l; K4 p* V) \3 n- _: V; P; z; p% s
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
- Z6 ]" N: {: c) V; H2 `
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
1 q J9 s5 s0 M$ y' R1 S
7 e8 T; m7 o: {6 P: k0 \
/* AB Sync Transfer Mode */
f6 |! v4 N+ r% c' } ?& w
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
5 f% k: h5 A! U* @9 _; ^* l' F
7 r( J9 X6 V+ X0 \ G
/* Program the source and dest addresses for master DMA channel */
' N& D e" R7 ^* Z4 {! ^
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
* p/ w7 I1 r' I8 a( p' I
paramSet.destAddr = (uint32_t)(ping_buffer);
' A4 O& [% S% f5 c! k9 s" S2 p2 d
5 u$ g8 q; J* ~. H
/* Write to the master DMA channel first. */
4 u: k2 y( D: R5 f0 A0 v
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
9 p2 c% ?- T; G) u6 D. E/ H
}
( S8 V- T/ O) y& ?/ F
) u2 B, j. P0 q* `4 @7 z
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
* N6 Q8 c. }* h( A, o2 B9 @6 N
; y( C( e9 l: ^* C1 i" [% G) W, x
if(result == EDMA3_DRV_SOK)
8 s3 M9 g4 t5 W7 ^/ o" w
{
& _. x* w% S3 F: ^$ P% V
print2arm("edma3 driver init success.",0);
7 Y7 C+ i2 z; k$ u# {- S) F* n
}
9 m) ^. B; T, k8 c
}
1 E Q1 f$ _7 y, w$ q0 H
% t2 A. W, ~. ^' y5 R- U
5 t5 D9 N7 Z+ g+ p
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
" _3 {, E% x8 y6 t/ o0 x/ l' c
) H5 [6 N; O1 T8 f9 I2 f9 D
4 Y; ~+ B. B# R5 E
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
4 }* G' q" O; {! u) X7 U
每次DMA传输完成后都要再次使能传输
) U+ t$ t7 `4 e
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4