嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
5 u0 ]3 d1 N2 u3 w, f- g
#define PING_PONG_ACNT 1
" P; c0 p5 t# U) z4 q
#define PING_PONG_BCNT 8*32*40
7 b1 a8 g3 V# I5 ^5 O
//#define PING_PONG_BCNT 1
& ]. n/ Z% p! _' j
#define PING_PONG_CCNT 1
! K+ h9 H' @, {2 R6 A, _
#define MCASP_BASEADDR 0x01D00000
! O( f% e5 U2 |! z, T2 R$ M# q1 x
#define Mcasp_RXEVENTQUE (0u)
3 V' Z% M* E: M2 p5 |( O
9 Y! A- y, R* m' Q {+ e, v: Z2 g
/* OPT Field specific defines */
2 H& n& E1 ~5 d# L6 S% b
#define OPT_SYNCDIM_SHIFT (0x00000002u)
* ]$ x+ }# X' H) f% m9 {9 b
#define OPT_TCC_MASK (0x0003F000u)
, x8 N& t9 V0 w! H: Y$ L& C- I6 {
#define OPT_TCC_SHIFT (0x0000000Cu)
K( |" i" X- u9 q# i" L
#define OPT_ITCINTEN_SHIFT (0x00000015u)
/ w& ?2 {' C# _$ k9 u0 ?! a
#define OPT_TCINTEN_SHIFT (0x00000014u)
) _1 q+ h1 w B4 [4 I
% T) Y/ H$ C) L( H! a( D
char ping_buffer[PING_PONG_BCNT];
! V( I4 m: r3 [: K2 b/ [
char pong_buffer[PING_PONG_BCNT];
. a `& P, P; w- j
4 M' K3 ~5 A- I) v- O1 D
$ j# h6 z8 j! n. _! D3 n6 n v
3 l( ]1 K5 p0 A1 D! |0 a
0 I3 o% p' N, j, t$ @
static void ys_edma3_init()
U& X9 ~8 f; O& ~; P+ E1 S; f
{
& r. `0 x" z1 {+ F6 I7 s' m/ ?
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
- r: j. l1 X3 P. m# }+ E; B
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
: e/ l3 ?- s2 z6 m7 \3 a1 F
EDMA3_DRV_Handle hEdma;
) ?# }: \/ J0 \ _8 [
uint32_t chId = 0;
4 k2 \5 h3 `- M& `! E' H
uint32_t tcc = 0;
* `7 J0 i' c5 J6 x' o- R# G
4 o' o$ Y: d$ x' z
print2arm("edma3 driver init...",0);
" V. b2 J; u# F$ F
0 [4 A' n1 o* ~ N6 M, w4 v
hEdma = edma3init(0,&result);
* H# O+ N9 i4 v8 u9 [3 a* y4 l: [( i
if(hEdma)
) I* I( L' ~# r8 @ D
{
; a& K. P7 `6 N2 \( c& }
print2arm("edma3init() Passed.",0);
( y: {" n0 B% h9 X
}
2 D! D0 s4 C( d7 F0 {& `" _
else
; g- d- t. q3 r
{
: J1 j7 j+ t: J2 b% v
print2arm("edma3init() Failed.",0);
M5 h6 F. _4 r+ D2 u( Q6 g* A7 C
}
8 S* R% ?6 d" L; o2 O$ P" j, h
3 g( i; {4 s8 p( ?8 o& p+ ~% e
if (result == EDMA3_DRV_SOK)
H: u7 E( B( S9 {
{
7 F$ G0 R* [! D9 ~- `: m
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
! [* q) s" g% _# Y |
(EDMA3_RM_EventQueue)0,
; D( M G3 R% V0 i# q/ i
&edma3_isr, NULL);
* r! I8 U. o3 i( i* r3 k0 o
}
' }* Q1 g: `0 H9 c
, V* o, b+ d, C3 [9 F& M
if(result == EDMA3_DRV_SOK)
: ^% a! n9 k+ R; \
{
6 S p5 u$ k7 y+ o; Y
paramSet.srcBIdx = 0;
j, M6 _! P5 y& ~* z; B t
paramSet.destBIdx = 1;
: _) o/ }: d6 {: p: C; U
paramSet.srcCIdx = 0;
; e6 d/ p6 ?" Q) W
paramSet.destCIdx = 0;
$ P C# v2 o4 t, r& [
paramSet.aCnt = PING_PONG_ACNT;
( f( L7 R! C. w
paramSet.bCnt = PING_PONG_BCNT;
- T7 `7 x a9 O; ]2 V6 Z% r& Z2 K! J
paramSet.cCnt = PING_PONG_CCNT;
0 T3 v8 r8 \# |3 W! k( R
; H; Z5 ~; c$ x' @ M5 i6 Q# w
/* For AB-synchronized transfers, BCNTRLD is not used. */
7 \ P6 Y& P: {& H
paramSet.bCntReload = PING_PONG_BCNT;
/ _3 f5 F; ~5 D
8 B- `3 ?& K; {0 T: U; |
/* Src in constant mode Dest in INCR modes */
) Q0 \( P! ^/ q" x
paramSet.opt &= 0xFFFFFFFDu;
' V; V0 o r+ E; h3 Z& v, C
//paramSet.opt &= 0xFFFFFFFCu;
1 a/ I% C3 r5 B# _$ v
. o! M/ u4 k. ~6 D2 u
/* Program the TCC */
0 C, Q2 ~5 ? Z8 z6 @; r9 F+ L/ h3 Q
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
% g5 _ u% j) ~$ p7 e8 x+ ?; c) x
, b/ H5 q* y5 U. U! q
/* Enable Intermediate & Final transfer completion interrupt */
5 [, a/ J( }# @$ u) x) z( P7 ^7 c
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
6 ~9 S* `. k5 |9 F+ f
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
. K( ~3 L: J9 Z! D: u' M: Q
* S& I+ x. w. O3 k- c+ ^0 c0 U0 w
/* AB Sync Transfer Mode */
9 x* Q7 ~$ d8 I6 o) a+ M/ S
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
; o: I: t* T% H3 A
1 ?* X; H# J8 @$ E1 @" _
/* Program the source and dest addresses for master DMA channel */
! u& |& |# @* p2 |( h# M+ n
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
# U0 x* c% y. R6 }3 O7 U5 m- ]8 Q
paramSet.destAddr = (uint32_t)(ping_buffer);
% E- ?8 ^4 \& w6 }: n5 a: `
# k: }% U$ V: {/ y6 [+ \! E D4 @
/* Write to the master DMA channel first. */
" p' o9 s. ^: f' {6 J8 i: Y1 ?1 I* y+ m: O
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
% b9 a5 O9 `5 m# Q) n
}
8 x3 k! I2 A# k6 z
c5 g+ {. T5 e. ]8 G" f
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
+ _8 f M# q8 ^
. a6 E% o: o: `& x3 y$ a
if(result == EDMA3_DRV_SOK)
7 x* N7 K- \; l% @- _+ y( t2 `! l; {
{
' |" N7 G' c. u/ R
print2arm("edma3 driver init success.",0);
1 ?) N9 C( `. [! R, M
}
, Y! ?. }3 Y6 Y$ g5 K6 z1 L
}
) t! i# Z! _5 \' S2 i
( t4 }1 r4 H7 ?0 m' ]7 M( P
* O! D8 d( F( c' g! b
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
+ I" U9 j2 C) Q
: T8 O( Q# K* k! W6 |
3 V% m- v" h5 j/ k
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
; p& N$ q% v9 x
每次DMA传输完成后都要再次使能传输
7 h9 E3 I# R9 j: g1 X
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4