嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
" t" Q5 v% K. w" {) k
#define PING_PONG_ACNT 1
6 H+ B, [+ c3 r5 S8 p! F4 U# ^
#define PING_PONG_BCNT 8*32*40
4 v( K+ l, [6 K2 J7 |- u
//#define PING_PONG_BCNT 1
# O L: |4 i9 q
#define PING_PONG_CCNT 1
' x; k. `7 D0 W6 x
#define MCASP_BASEADDR 0x01D00000
6 L( R9 |. s! X6 N; @) l
#define Mcasp_RXEVENTQUE (0u)
, H3 y. S! ]5 b3 n4 X. S
, D, W1 W6 H9 q. _9 G! ~
/* OPT Field specific defines */
% ^# [1 u8 Y2 ^' l) o% e
#define OPT_SYNCDIM_SHIFT (0x00000002u)
1 M9 f) {0 E7 v4 Q2 X" e
#define OPT_TCC_MASK (0x0003F000u)
3 a6 j+ K4 G$ K( J! y. {' Z9 U1 B
#define OPT_TCC_SHIFT (0x0000000Cu)
# C+ P: b3 k; S+ ?+ K
#define OPT_ITCINTEN_SHIFT (0x00000015u)
' @8 M: S" Y) J) a8 b
#define OPT_TCINTEN_SHIFT (0x00000014u)
' `, m4 h6 Q3 N. P$ v& z
* O2 j8 g8 m6 ^; L6 P* j* I$ G
char ping_buffer[PING_PONG_BCNT];
( y# ]3 j h3 x4 H: G& F3 c- c
char pong_buffer[PING_PONG_BCNT];
- w. o& |4 c+ [
$ n) q4 G# x+ q7 u
- q" ?2 Q9 S n9 S( w. ?# H w
0 O; }! S2 H! A, L
- z0 l' @' t6 F7 F) B3 }' m7 f
static void ys_edma3_init()
7 z3 [ k# s3 K6 R
{
d: x% c7 d+ f5 z% d8 Z. n
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
3 M* q1 k1 L1 b# ?
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
' @1 p8 ~8 }* \5 g0 n
EDMA3_DRV_Handle hEdma;
" ~/ V4 x3 T" a; R7 {5 @- N
uint32_t chId = 0;
2 v4 P* B$ E8 L* R8 \/ n$ _$ |- ~. N
uint32_t tcc = 0;
3 O6 S5 a3 i, x* G
5 N) m' j, W0 T) x, ~$ j
print2arm("edma3 driver init...",0);
) ~! L7 P; j9 A3 s
D5 D& r; V7 O+ n. {
hEdma = edma3init(0,&result);
1 n# X3 A8 ]4 g
if(hEdma)
! `" D% t( f# b4 g% B) ~
{
& X" Z* \# d- Y& b1 o G7 B
print2arm("edma3init() Passed.",0);
3 ~/ B, _% Q; b9 x# o' f5 d/ W
}
' p u- z, T$ U2 E
else
- `7 a: \% L/ B" q0 I
{
4 B7 i; r) w3 }
print2arm("edma3init() Failed.",0);
0 G" F5 g- ?( M- \$ f
}
/ i! v4 W( E5 I# \' ?' H" q/ ^
. h2 S9 z v3 [1 j1 X* E
if (result == EDMA3_DRV_SOK)
+ F0 Z( n" J1 C" C
{
! M ?2 @" ^" H& p' w2 w
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
" E# ?& z/ Z5 |
(EDMA3_RM_EventQueue)0,
+ [+ o6 V7 v0 R* ^, W# v5 s& y# |
&edma3_isr, NULL);
% N* U2 z) \* e$ z" X( e3 E
}
$ n8 b! `2 B+ \
- {: @1 F6 O) Y) x% A5 z7 J7 q
if(result == EDMA3_DRV_SOK)
! @1 q* M) s, D. K: ~" K" K
{
! E W- G6 T8 I$ V
paramSet.srcBIdx = 0;
3 E' I' u* X: q
paramSet.destBIdx = 1;
- _- g8 m1 y' B. @$ K/ m0 R
paramSet.srcCIdx = 0;
/ _, E" d9 X0 e7 H
paramSet.destCIdx = 0;
' H" }0 e) g% N! l5 n, a3 z f
paramSet.aCnt = PING_PONG_ACNT;
& c9 U- N! R6 Q5 o7 ]5 g$ _
paramSet.bCnt = PING_PONG_BCNT;
7 T& ~3 G+ r5 U6 f9 {7 u
paramSet.cCnt = PING_PONG_CCNT;
9 D5 f5 D+ k/ r3 b, {' d4 r
9 a/ I: w3 J3 w, b9 n
/* For AB-synchronized transfers, BCNTRLD is not used. */
4 z' B$ ?) W9 w0 g& n: k5 T/ D
paramSet.bCntReload = PING_PONG_BCNT;
7 [2 d% j' K: H2 u. ]" s
3 ~: x" q0 ^) @4 z8 v
/* Src in constant mode Dest in INCR modes */
# I1 I% J7 n( c& {
paramSet.opt &= 0xFFFFFFFDu;
$ i$ z1 M1 B. \$ y. K. Z- W8 V
//paramSet.opt &= 0xFFFFFFFCu;
+ E3 E' N0 V+ R! E" p$ e0 v' ?) W9 X
/ A! f2 Q3 t+ X$ w
/* Program the TCC */
! w3 h0 ]; x! {- M& T: G
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
! N6 h2 q! N1 z1 P) d6 W
~' K$ h9 s$ g9 K, A4 c5 B
/* Enable Intermediate & Final transfer completion interrupt */
# V% G; [: F. e. e8 @- E( _
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
2 u- R" p. u/ g/ |( G! v1 j
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
6 p) W# @ `& _+ n' p
! G1 v) f! l' a2 L. ^
/* AB Sync Transfer Mode */
) d7 w7 S: d9 \& ^
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
$ {) V7 P O2 u, O! i5 Q5 K
2 J. ^/ K/ X$ L8 `' ]. ?
/* Program the source and dest addresses for master DMA channel */
, m( G5 v# [& w; ^- l
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
, G9 F. @; ~- d' W4 {7 |' s
paramSet.destAddr = (uint32_t)(ping_buffer);
/ _! f! x$ s; {( x' ?) A
# a, W3 Z% X( |; T6 d
/* Write to the master DMA channel first. */
# H) o! G. T) L' Q; ]( W1 n! a4 h
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
7 c) C1 c3 G4 P7 i4 i
}
& C" |$ n& @8 p
0 l1 N1 L( F9 n0 G9 |! ^4 u
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
9 r0 } D! _: e' E5 Z5 r9 t. T a
4 R$ _/ K3 P8 u' A$ L) U" Y
if(result == EDMA3_DRV_SOK)
8 u' F. p7 K; f7 \ G
{
" r. H4 a1 L P8 S. E
print2arm("edma3 driver init success.",0);
1 _* E( B5 R6 W+ H$ ]
}
6 @" f' Y8 [2 X3 R& G/ V
}
. U: M: B/ U8 m7 o- O9 j3 X4 l
: @# u; K! V$ h, S1 E( Y
) z `' I k! @( @, b I; H G
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
& k9 O2 t" u2 Y& W' [
4 [5 |" ~! p: m+ W4 p! w
2 _% p% I1 O/ L6 _9 E" y, h
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
q0 S' ?8 v( {
每次DMA传输完成后都要再次使能传输
2 T# X u0 H! t% P2 P
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4