嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
* g0 f. O7 ?( A8 D+ g; W4 y
#define PING_PONG_ACNT 1
# h1 w N! n( i- P% Y
#define PING_PONG_BCNT 8*32*40
* E/ K( J& E5 o4 \2 @. y
//#define PING_PONG_BCNT 1
) N0 P# ^; ?5 M- |2 p N" @/ j
#define PING_PONG_CCNT 1
" x [. z6 ^6 D/ }6 m& c! \4 A% Z
#define MCASP_BASEADDR 0x01D00000
: |# M/ X0 C- s7 y2 C1 H5 K
#define Mcasp_RXEVENTQUE (0u)
% E6 ^. O) {6 Z0 {' n
) r. H7 L4 E. e q; K4 H
/* OPT Field specific defines */
9 d4 [: c, N+ y7 o
#define OPT_SYNCDIM_SHIFT (0x00000002u)
" L: W. J+ v+ r( W
#define OPT_TCC_MASK (0x0003F000u)
# U/ S( F3 W j3 W) E# f4 I
#define OPT_TCC_SHIFT (0x0000000Cu)
: f9 S" }% q, l
#define OPT_ITCINTEN_SHIFT (0x00000015u)
0 k( n8 z9 R, @0 a. l
#define OPT_TCINTEN_SHIFT (0x00000014u)
% C$ j/ a3 n+ ], [: o& `
- ^& N; U9 {5 c
char ping_buffer[PING_PONG_BCNT];
( T2 |. t4 h5 R$ k
char pong_buffer[PING_PONG_BCNT];
' u) T6 C2 o8 U- B7 {- ?! Z
; }3 ]. ], ?) q2 { n3 c
1 b; H5 P1 }$ @( m5 O6 W
6 B7 k X2 Z. A7 h6 h
6 n# B' B& w' n8 q
static void ys_edma3_init()
& p6 N) a9 N7 A# N p" ^2 d
{
& `+ C( U- k& K: @
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
, Q5 r6 a7 ]) Y7 h* I+ u3 z
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
# T+ u4 B- e/ Q& W& r, d
EDMA3_DRV_Handle hEdma;
. u2 ~8 `9 o! Z9 \) q. }
uint32_t chId = 0;
' @' k) ~2 j& _
uint32_t tcc = 0;
/ K/ `' O* c4 e) m& v+ I" K& f+ `
( P% i) I5 B2 v: T% Q, [
print2arm("edma3 driver init...",0);
( g0 i" ~* x- o# ^# {% N
7 K: j, T" Z, n# L7 k0 }
hEdma = edma3init(0,&result);
; W, e; C( ^# u+ x+ U9 }
if(hEdma)
& A6 k9 Y" v( d0 a+ Z. P+ g$ d
{
7 D+ o7 ^* M) A4 u9 Z
print2arm("edma3init() Passed.",0);
; y* U: S1 W9 M" a, v8 H" Y$ d
}
, U& I$ \0 o' k. B& q8 T
else
& r3 Q" A9 P* c& S$ F) i* u
{
( c/ Y% e2 D) E. ]- ` K
print2arm("edma3init() Failed.",0);
4 Q; ~6 @" [* y. G, `& b8 p
}
' F: K' T i( S' N6 J' G% n5 J
; w0 y% v. q; `* ]# ^ U+ N
if (result == EDMA3_DRV_SOK)
+ {% s, h: o7 H9 ^
{
& V) h2 y" S& @; f
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
% Y3 j3 y4 D0 U: J* }8 P- c, [
(EDMA3_RM_EventQueue)0,
4 V9 C' u6 O/ L; P: e- e/ ^
&edma3_isr, NULL);
$ p# X3 T& r# U# S' Y) e
}
; a# j+ V8 b- k8 ?4 E1 {3 G
( l: V% `+ r3 ?8 Q
if(result == EDMA3_DRV_SOK)
. B0 u# |& C$ P0 \
{
O7 C, r* j9 _
paramSet.srcBIdx = 0;
+ l- n9 y9 Y" D6 j8 ~; R
paramSet.destBIdx = 1;
v, s; ~! p/ p7 E/ A
paramSet.srcCIdx = 0;
5 V3 [: w" V$ M; H9 R
paramSet.destCIdx = 0;
/ ~3 r6 X0 h. w% _$ [+ b: A8 T
paramSet.aCnt = PING_PONG_ACNT;
1 c* Q. h' L% d8 {
paramSet.bCnt = PING_PONG_BCNT;
6 I6 ~8 V& {7 [& y- f1 k0 _1 V! M
paramSet.cCnt = PING_PONG_CCNT;
$ G G+ G2 _: Z0 [
* g' Q7 ~. ~+ A2 X& c7 w
/* For AB-synchronized transfers, BCNTRLD is not used. */
' Z; h! e( G; F
paramSet.bCntReload = PING_PONG_BCNT;
: \8 ~: k9 c( J$ U
* I4 Y7 d" p2 `* C
/* Src in constant mode Dest in INCR modes */
& j& j8 ^# f0 t. y
paramSet.opt &= 0xFFFFFFFDu;
' A5 j- j5 _7 v/ f9 I$ @. T
//paramSet.opt &= 0xFFFFFFFCu;
# l! O5 S" ?# x
3 K/ Q' F, i' d8 f' r1 U5 H
/* Program the TCC */
: L2 y N2 x% B& W. R( S9 u, i8 M
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
1 N: x9 X% D, c& |
& `0 v. J* d0 ^1 V1 Z1 L5 X$ x
/* Enable Intermediate & Final transfer completion interrupt */
( S/ c) U+ h8 x
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
+ I. m; t$ \4 q
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
( t2 a9 k% V- @2 q9 ^
! v8 q3 z6 X1 U) u. V
/* AB Sync Transfer Mode */
" X1 A8 e7 v- J/ [
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
' q' @- ] q, z( f& A. |/ \- z
4 _/ \5 l1 l# |3 ^) a3 P9 C" [
/* Program the source and dest addresses for master DMA channel */
4 ~* T' I. s# Z& z* \) ^' b
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
1 K: U8 ^ x8 i3 ?; ]1 u" G5 L" P7 V
paramSet.destAddr = (uint32_t)(ping_buffer);
6 v! v% v5 K5 O5 }: p- q% n
. p+ K5 Z2 W4 t+ Z, S/ T' R
/* Write to the master DMA channel first. */
& _0 f! o+ C6 f% Z# H9 ]: \
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
8 D+ F. Q$ o0 P* W. r/ l: i
}
$ L* C: } A" x2 @0 @# p" p
- `0 @( n" a( [
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
/ y3 q/ B& i' t) } Q
( b% U# S$ p/ T6 K' O
if(result == EDMA3_DRV_SOK)
7 U. O1 Y. S! p- U0 h4 u" S; Q8 ^
{
0 m2 X7 X7 s$ }. W& o1 |7 g3 R
print2arm("edma3 driver init success.",0);
' ^) ], r2 E! a, [4 Q' s2 w
}
* I7 H/ n+ K7 ?4 [% h
}
4 m' D; R; Y0 V/ R0 P; A* y
' |6 [' L) l. a& g; {
* Y8 u r+ S9 `2 Z
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
8 C$ k7 ~2 U Z( f; S2 [! Y9 _2 n
; E; u, d/ P: [- q/ @
( V1 B" Y6 ^& h( o' z" H% ~: B' i0 @
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
* ~ W! [$ I- ?( B' b% Z
每次DMA传输完成后都要再次使能传输
3 M% ^+ }# g) D8 t7 C
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4