嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
: m* r; ]0 Z) L$ X# P1 G, V
#define PING_PONG_ACNT 1
1 g) U2 w1 V- v, s5 u. x8 i% N
#define PING_PONG_BCNT 8*32*40
z" a3 a5 D2 O$ s, u4 ]
//#define PING_PONG_BCNT 1
' [1 l( q! k( w6 t/ ^/ m
#define PING_PONG_CCNT 1
; [! Z% J( c- J' k
#define MCASP_BASEADDR 0x01D00000
1 n" @( E* r c9 v8 B3 l
#define Mcasp_RXEVENTQUE (0u)
6 a% s5 j) V" ?! a" ^- x
4 q; b; `+ N" K0 Y
/* OPT Field specific defines */
# _) E/ u3 s) U3 S7 V
#define OPT_SYNCDIM_SHIFT (0x00000002u)
4 j2 }# S0 x$ I9 N
#define OPT_TCC_MASK (0x0003F000u)
D) [8 E" }* [: m/ y4 v
#define OPT_TCC_SHIFT (0x0000000Cu)
- z5 {8 Q' S: d: g8 ?2 _
#define OPT_ITCINTEN_SHIFT (0x00000015u)
& c/ O! B' O6 f' P( `9 @
#define OPT_TCINTEN_SHIFT (0x00000014u)
* i+ L) j3 D' e2 D9 v9 Y9 Z- G
. q$ U. z; { I, }
char ping_buffer[PING_PONG_BCNT];
% X5 [7 ]2 [* K: ? v4 s4 {
char pong_buffer[PING_PONG_BCNT];
, Y9 v+ q! [( ?3 K
2 V+ G3 F$ z% Q% o6 u* C$ J
W& A( ?' Y8 i% ], p5 W( @
5 X1 {* w& w; c$ K! H4 i# p
' O9 a8 A L! p, I+ S
static void ys_edma3_init()
+ t; E1 |& n8 G7 z; B
{
, x% t' ?' h& j7 Q+ e
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
$ B4 y; |: k* g* a" c) { x
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
% h e5 v1 s. }. B+ R% P5 z1 _2 F
EDMA3_DRV_Handle hEdma;
7 ^3 U" N" `+ |; ^
uint32_t chId = 0;
1 F/ a/ j# R1 R5 [$ S1 r
uint32_t tcc = 0;
: k. ^5 J! o: p/ R
6 D( _! g% k7 P" G6 O- R# F" T
print2arm("edma3 driver init...",0);
; \5 F5 l9 N) o9 V
- Z! [: E2 A, X' N d; T. Q
hEdma = edma3init(0,&result);
8 \: Y: W5 g! Z3 ]8 I8 V+ h
if(hEdma)
, v6 C$ L, m- g( e+ E/ j
{
4 j w, {, k* w% z+ N/ S# q
print2arm("edma3init() Passed.",0);
- Q8 }. ~" L k& m& i
}
' [, W* l5 j7 z4 N
else
7 M P, O( z3 u: C m* |5 }
{
5 h- a4 ~3 ?! h0 k7 H
print2arm("edma3init() Failed.",0);
& X0 E8 \% ^$ e2 b
}
8 i+ \# U& A1 O9 Y
; R4 I2 u) Z3 o3 ~6 k% N* I1 Q
if (result == EDMA3_DRV_SOK)
" M. T8 q) {5 H9 ]0 ^2 g& h
{
# k8 w7 A) L! M
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
! U$ t* o. A% X( X+ ?6 ^- }4 q0 [! P
(EDMA3_RM_EventQueue)0,
2 F2 d$ I& B$ B, }. w' G4 i
&edma3_isr, NULL);
* H+ E2 n# e; I9 ]
}
/ m6 [4 A) Z$ i' V# o. X
" I3 l9 M7 h/ _8 T
if(result == EDMA3_DRV_SOK)
5 r" o3 J0 I4 x% }1 Y
{
& x' _5 ]/ f9 Z( A) k( j& U
paramSet.srcBIdx = 0;
% D8 c; u {& B; O
paramSet.destBIdx = 1;
( h( ]9 c5 n* I! X: P
paramSet.srcCIdx = 0;
6 p6 }! r6 m# l. B
paramSet.destCIdx = 0;
5 ]6 v7 R5 e, f( T) B& o0 c) ^
paramSet.aCnt = PING_PONG_ACNT;
5 S" V' Q- _" q+ Z% l: O6 J
paramSet.bCnt = PING_PONG_BCNT;
/ h) n+ x2 H, @
paramSet.cCnt = PING_PONG_CCNT;
% N3 D+ |4 ^; @: D7 T6 ^
! ^1 J) h! |" Q& G& H; @8 |
/* For AB-synchronized transfers, BCNTRLD is not used. */
J: _! D+ F+ X) w9 S: Q, G
paramSet.bCntReload = PING_PONG_BCNT;
% a& B9 S% ^* P
2 n' U! D; ^, I) J4 E8 R& N7 `9 S
/* Src in constant mode Dest in INCR modes */
) N* ~' W3 K1 P- g, m
paramSet.opt &= 0xFFFFFFFDu;
0 P) E2 r! p, ~( `" ?" {0 d
//paramSet.opt &= 0xFFFFFFFCu;
+ X8 p; T6 z2 d+ p4 v
# O# _# S' [2 c' c
/* Program the TCC */
% m' D) [7 v2 q. @; x
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
/ `2 v. [% i2 o7 J. r' `' ~& j' f
( ?" O! _2 e. a) W. L5 _
/* Enable Intermediate & Final transfer completion interrupt */
4 d5 B" z. [! i7 R; I
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
" Q( b/ Q- m( W5 B
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
1 M3 L, \7 I2 O
2 X0 O/ m* o" w9 `- k
/* AB Sync Transfer Mode */
% Y6 @- Z! y6 n" H- l& m) d
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
/ c8 Q, p( j; p* U) Z8 O
; `) m2 F" r) y6 s0 ^' d
/* Program the source and dest addresses for master DMA channel */
! @/ `5 D# U/ U3 b- M. I0 ]
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
) O. r7 u: |" P- U' Z& c/ t
paramSet.destAddr = (uint32_t)(ping_buffer);
6 n6 X" H w, n8 t2 v- g
# W3 |. S6 f4 V8 X# B$ g
/* Write to the master DMA channel first. */
2 M; f$ Y8 m' B2 Z9 V% h
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
7 U, }* K9 I* ?) ~
}
% x) x; S+ ?- e7 Q
$ v; a4 d! A( ]; F4 l
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
5 @$ t# H! }( n
( E% L) ?2 v6 b$ I8 [$ K8 Y2 }9 [
if(result == EDMA3_DRV_SOK)
. `# H# k2 S: V/ B9 a: |% v
{
! n5 f8 b: ~4 a* C; F
print2arm("edma3 driver init success.",0);
- A6 V0 Q$ f7 _+ f: n0 e6 L
}
2 M8 J$ j7 c! s5 [6 S J4 i
}
: [" A( z6 G# S7 n! r$ I5 }: E
[5 N! i' Q% I, R3 A
% K t% m: O H4 `4 ~) Q
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
% V1 P1 r p5 d d8 q2 h. m
4 `$ Y/ N5 a }8 B
' ~, v- j+ F, I, K, F$ c
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
/ s3 B }8 u8 M9 J' M( x% a$ G9 g) _
每次DMA传输完成后都要再次使能传输
) Z- m9 A* X6 L
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4