嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
& ^2 `3 y8 X4 e' k
#define PING_PONG_ACNT 1
' U8 t7 A8 H4 D' G. w
#define PING_PONG_BCNT 8*32*40
$ D; t8 F+ i& n, ^6 c4 w" o; c
//#define PING_PONG_BCNT 1
+ u2 y' i' R6 h. X G6 r$ ?5 H
#define PING_PONG_CCNT 1
& m4 y9 U( J/ S( H& I9 @3 I! i
#define MCASP_BASEADDR 0x01D00000
: v. I! O y% Y$ S7 p$ E0 S9 ~$ g
#define Mcasp_RXEVENTQUE (0u)
+ t1 f' g5 D& r& O5 j! n/ z
! g+ A1 K1 B8 {+ D H
/* OPT Field specific defines */
" H+ q/ Z) t6 _% ]8 b
#define OPT_SYNCDIM_SHIFT (0x00000002u)
3 O3 V0 ~ b( Y0 p5 A3 ^5 I5 [$ l
#define OPT_TCC_MASK (0x0003F000u)
) e; w! c% e8 }6 o4 D5 F
#define OPT_TCC_SHIFT (0x0000000Cu)
4 {' ?2 ^, N0 ^7 M6 E5 _6 G; h8 e
#define OPT_ITCINTEN_SHIFT (0x00000015u)
, v Z% T+ ?& X$ j" P& t
#define OPT_TCINTEN_SHIFT (0x00000014u)
' j- f$ h8 @/ x. x8 T# Z
; B* x! Z5 a& A* _) f+ X; P
char ping_buffer[PING_PONG_BCNT];
" |7 p/ t. B+ F2 t3 U# v
char pong_buffer[PING_PONG_BCNT];
- V- E; u- \4 U% z$ m
0 e* l* m: ?7 c% t9 | I& _6 a! Q' J
, ] Q4 m# e: q" Z+ n
# W1 \: q( E5 N, F) ~/ U
7 P% k6 q8 y- F b% L8 z4 Y3 S
static void ys_edma3_init()
6 Q7 _4 n+ Z! |# K0 k1 @
{
5 s. i# A3 L7 Z0 o
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
. E( q9 r: h F# M8 J5 |! b
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
& b) N' N8 b9 {7 Z! v
EDMA3_DRV_Handle hEdma;
& W# G% d s: l2 D6 R) f
uint32_t chId = 0;
+ r( y, U/ k7 L. i* _3 V
uint32_t tcc = 0;
7 z' v' w0 d ~4 _
! v+ i( t! t( k6 h+ K' A, k
print2arm("edma3 driver init...",0);
7 \2 I8 z1 u$ @8 \% {
0 ~3 e6 b0 {9 Q% q+ B' J
hEdma = edma3init(0,&result);
) W$ f. Q; n+ n/ ^0 q" \- F( G
if(hEdma)
4 I3 D0 r1 Y% f$ x7 l
{
R* U0 }) I. C8 Q0 D5 ~
print2arm("edma3init() Passed.",0);
6 \ L6 \; `, m0 E {
}
: Y _& S* x7 V0 q( Q" g
else
/ E; }, t# v: v' ~
{
" B; X" n& }- m- P; I9 y! @- F
print2arm("edma3init() Failed.",0);
7 y/ g$ o& X$ l; R# X2 k
}
/ N6 D4 a# f; Z0 v; Z( P
$ {2 K* g/ M# h( ^
if (result == EDMA3_DRV_SOK)
) l" @. O1 }) ]- B b% c# w0 m
{
+ y, K) j8 k! s8 C( R
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
0 J+ @0 r) t$ q, V! |
(EDMA3_RM_EventQueue)0,
( `$ a' v+ ]( q1 c
&edma3_isr, NULL);
L% j4 k; F, M% B b
}
# G& v+ L, J0 F0 l* C
& p# ?* r v: D2 ?' g# i- T
if(result == EDMA3_DRV_SOK)
$ ]# G3 S' f, l0 |. K
{
6 u) ~. O. w7 [. T9 R2 S- o
paramSet.srcBIdx = 0;
! X. c7 f% |$ _/ Q
paramSet.destBIdx = 1;
1 W& m7 _7 Q, a
paramSet.srcCIdx = 0;
2 J- a. z, }( [) m0 {
paramSet.destCIdx = 0;
- O! J8 X) y. `* q: N! J m% w
paramSet.aCnt = PING_PONG_ACNT;
/ i1 t& S, f2 N( n
paramSet.bCnt = PING_PONG_BCNT;
, O5 }4 z5 P' l0 D9 |8 e
paramSet.cCnt = PING_PONG_CCNT;
P. Q; ?1 R% U" z$ w8 D& E+ @
% y. p6 V6 w a2 Z N- C3 h+ z
/* For AB-synchronized transfers, BCNTRLD is not used. */
! g8 P0 M' a3 F2 |9 M6 M
paramSet.bCntReload = PING_PONG_BCNT;
( e% J1 i, \# g3 d
8 Y. A" J( H& S0 V6 k
/* Src in constant mode Dest in INCR modes */
" h5 f* Q8 Y! \
paramSet.opt &= 0xFFFFFFFDu;
. V# k, y& p6 o3 U8 H
//paramSet.opt &= 0xFFFFFFFCu;
" S; u5 r% d- @3 }( F
b3 v6 |- y; z+ w, u
/* Program the TCC */
- _. J( y* k) P* V: Q
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
9 G) Q G, m- W$ r- m! ]9 K! x
+ F! Y1 h+ ^8 o
/* Enable Intermediate & Final transfer completion interrupt */
4 ^ r. @3 O/ p. r
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
7 @' W6 b: q# D* k- @( \ C, v6 d6 h
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
/ V$ z4 b5 ~6 [$ {7 m
6 p, W* @8 \/ k3 j' n a. [
/* AB Sync Transfer Mode */
8 C* R7 x7 R( P" l9 V
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
5 k. L! m/ M) N' e# b0 Z
$ o; u* m% J" U2 _; _- a
/* Program the source and dest addresses for master DMA channel */
. w2 U2 J/ s4 t" u" @
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
) u6 Y& B2 u) \
paramSet.destAddr = (uint32_t)(ping_buffer);
4 F* W' c/ }4 u4 g+ M1 {
4 y9 f2 ^& `9 O
/* Write to the master DMA channel first. */
+ {# ~2 h" X9 J+ h1 M; B; [4 H7 N
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
1 X' x2 E5 A( G9 V
}
. \+ [, R/ e/ z3 k
1 K* B( G* o z1 t
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
! a% V# X$ n/ W/ C
1 p2 ~) ^) P8 g% v% F
if(result == EDMA3_DRV_SOK)
: Y: n Q/ j6 j+ H* s6 p
{
3 I# Y7 ^0 W9 e" D) |4 Q1 U+ c* [
print2arm("edma3 driver init success.",0);
# @; q* j/ Z1 O, |( J9 ?8 l! I
}
- T% a# P5 H% R, D. Y( M
}
+ q, s1 X) ^2 ^2 L# E( }/ o
/ v" R0 F' G4 A+ J6 O) ]
1 p6 G. S8 ~; m* M/ _! G* B
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
u6 o4 u; v* m- d1 a
4 I1 @: s" F1 r
: V0 ?% M, L# b; v" e
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
" X: S6 S/ Y; M) u/ a
每次DMA传输完成后都要再次使能传输
9 F( Q: \. ]* Y; a, {, H
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4