嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
; U, A8 }/ Q9 [0 v& S; B% K
#define PING_PONG_ACNT 1
' \) u/ @% Z5 l7 i' m- R* f/ ^$ s: c$ H
#define PING_PONG_BCNT 8*32*40
/ k/ a/ b U/ D$ ^. V/ F: [
//#define PING_PONG_BCNT 1
, x# \- k0 B/ W
#define PING_PONG_CCNT 1
0 Q9 h' C6 J' P
#define MCASP_BASEADDR 0x01D00000
/ I: U0 D2 y8 {8 D% J' {
#define Mcasp_RXEVENTQUE (0u)
8 ]+ Z8 P; U$ H, Q% I( J9 W
8 K& s, G3 }1 q0 j6 [
/* OPT Field specific defines */
' a& S9 a; [) Z0 H" M9 f* ]
#define OPT_SYNCDIM_SHIFT (0x00000002u)
" X8 z( d# k3 o( z( i
#define OPT_TCC_MASK (0x0003F000u)
0 Z, m. N3 B, a( h/ h& _* \/ r0 Q
#define OPT_TCC_SHIFT (0x0000000Cu)
% F( P& U: a& t3 t2 W
#define OPT_ITCINTEN_SHIFT (0x00000015u)
6 h0 R) q1 X) E; E
#define OPT_TCINTEN_SHIFT (0x00000014u)
, B2 t( q6 H8 ~5 S/ z! |
* t1 D! L, f+ u0 L
char ping_buffer[PING_PONG_BCNT];
8 l# u6 z6 C5 x8 T& u2 T1 t0 A+ R
char pong_buffer[PING_PONG_BCNT];
. b: w& ?- E6 m: Q& @( x' ^
$ X `9 c) u. L6 M/ h4 x
" G) W1 _5 `( Y, a* r# H
" U. ^7 G5 I% f1 S# E
2 D. I4 d1 g2 h! F, J( y. [! E& D7 Z
static void ys_edma3_init()
6 C+ k* N; y& Z+ O0 q* n
{
3 _! m5 ~( V$ S+ H7 |" N
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
7 r7 ?" V' B1 t
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
$ E2 U5 H# \, R% M( O/ k
EDMA3_DRV_Handle hEdma;
4 @, }; J0 C2 |% S8 ]% |( k7 L: a
uint32_t chId = 0;
$ C- p) \ } J( I/ X
uint32_t tcc = 0;
* m7 t( e* @& ?5 U
7 H' Q7 ]4 h8 I
print2arm("edma3 driver init...",0);
9 @/ R0 h+ t' M% ^, R
; Q6 ], n( e0 S1 f& r- Z8 ?% `
hEdma = edma3init(0,&result);
# b, j) q6 U( O: p' e) P+ r
if(hEdma)
( ^( S A7 G" a' m
{
2 N% F* A- {! {, F
print2arm("edma3init() Passed.",0);
/ ^2 g+ k; ~8 q: c: b5 l5 m& o- x
}
* Z8 M2 `1 Y+ B! _) m- U9 y
else
) t. W' d; B4 _. |9 _- k
{
a, o- b' X1 z
print2arm("edma3init() Failed.",0);
. r( T# |; J9 z
}
8 i7 R; Q/ |1 ^- B8 q1 T7 I& G
1 E8 Y- x5 J) d4 P$ Z
if (result == EDMA3_DRV_SOK)
9 @1 U8 |; G( V( V7 Z9 @/ W
{
. g6 L0 D" v* y0 f) ~1 c
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
- y. ?( h. Q4 c8 j8 H$ R% b: J
(EDMA3_RM_EventQueue)0,
, \6 L8 q7 Y8 @$ c7 o# t
&edma3_isr, NULL);
, Y5 D+ ?) Y0 w' m+ l; S' M3 t* T
}
- w/ n# ?- ^' u9 D0 G" E. \
" H" Z, s9 J: @3 F5 p+ B- A
if(result == EDMA3_DRV_SOK)
: T& \7 X1 Y( W: N$ R6 D$ M
{
4 ~% c! r9 O$ ~6 I
paramSet.srcBIdx = 0;
, g# `; C! M, ]2 ]$ O) v& V
paramSet.destBIdx = 1;
' l( ]4 i# H$ ` V! ]
paramSet.srcCIdx = 0;
( f7 N% a* G. ^6 H2 c- K
paramSet.destCIdx = 0;
, b0 ^& M# K/ R" S- w$ m" j
paramSet.aCnt = PING_PONG_ACNT;
* V! A8 q! u& j- {3 t/ g
paramSet.bCnt = PING_PONG_BCNT;
$ v. {+ S0 z) Q6 e4 P" ?
paramSet.cCnt = PING_PONG_CCNT;
( W9 Y4 X+ N, [; A* G& a* {2 S
3 ^' G/ R) a6 O4 Z, z1 w3 ~
/* For AB-synchronized transfers, BCNTRLD is not used. */
# h6 @: ^7 _, v- K
paramSet.bCntReload = PING_PONG_BCNT;
- X5 r1 r: P" m$ a* {
+ F3 Q+ Y' L6 E# i, Q
/* Src in constant mode Dest in INCR modes */
0 a- @, `+ { \! b* D
paramSet.opt &= 0xFFFFFFFDu;
2 Z, Y; z. z( M: j- O/ [
//paramSet.opt &= 0xFFFFFFFCu;
* S: e7 A, H& e* d, z
9 K4 V {1 l' g+ h) k0 ~( E
/* Program the TCC */
n+ [2 @! v3 T/ P7 _. O
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
3 V9 _1 M' `1 K3 u# S
1 Y: e1 \4 P. j5 ?* M
/* Enable Intermediate & Final transfer completion interrupt */
2 ]/ I6 N' I5 ^8 W& F, y: s
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
4 K0 \/ d y6 ]9 X/ `' d- ?7 F
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
5 U( P/ \4 r. U
) P) E! W% A. O u
/* AB Sync Transfer Mode */
& m! s' \9 a1 P1 k
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
" k8 \5 [* k4 C
1 ~2 A3 s$ E- u# N
/* Program the source and dest addresses for master DMA channel */
3 j* l7 p# |) o" G$ _/ ?- n6 M
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
. g7 o6 W! Y6 F
paramSet.destAddr = (uint32_t)(ping_buffer);
: k: G5 ^* h4 p, i6 l3 D9 @
% U7 e" a4 o6 |/ W8 ^5 z1 p( T T
/* Write to the master DMA channel first. */
) y( a: {3 a0 q3 R( Z& y% D' d/ ]7 n# E
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
9 E) |- d. E7 K4 k* a3 Y/ w* s
}
. h6 x) A2 j7 v; B+ _/ @
7 X- @$ u9 E' r% A7 w
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
8 r7 _; ]- }$ e; x, ]$ e8 Y
, o* I* V; q1 L) Y2 m
if(result == EDMA3_DRV_SOK)
0 F7 @; B9 k/ _. @9 g, J. X
{
# t/ `: F$ P' Q* Z u3 h9 ~ U7 T' Y* Z
print2arm("edma3 driver init success.",0);
$ Q. {0 o5 \" L! r* Y2 l# P
}
- T! p2 @) @9 {- q, m4 M4 s# Q% Q7 j
}
" L& M1 j+ {+ @* O+ q1 ]
! |! ^8 F7 \0 W3 j' a; \
, U3 |" P# K, m$ b
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
/ B5 b7 m P" m Z! _* [/ o7 R
$ Z. g5 j8 G2 h8 p8 t4 Z
7 p# K1 D; d* j! K$ z5 p X
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
0 J$ d" f5 j e* e- a2 n
每次DMA传输完成后都要再次使能传输
/ m8 b8 @4 i: E: P
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4