嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
2 |* U+ }4 G% Y
#define PING_PONG_ACNT 1
! n. i* U& |7 K9 Q4 @- h
#define PING_PONG_BCNT 8*32*40
5 w. h/ {2 F. X+ q* K3 v' u' J
//#define PING_PONG_BCNT 1
0 O" W: o% J! t4 Z/ X! ]
#define PING_PONG_CCNT 1
1 D; z) c( h# A
#define MCASP_BASEADDR 0x01D00000
) U: k, ?% Y) N. _! _" s) i6 [
#define Mcasp_RXEVENTQUE (0u)
4 w2 C, M! C9 }& q6 \- s
" q6 Q Z3 d, g. C2 `! k
/* OPT Field specific defines */
1 l5 B D b7 Y6 [/ p R; |
#define OPT_SYNCDIM_SHIFT (0x00000002u)
) d4 g$ [$ S8 w# F
#define OPT_TCC_MASK (0x0003F000u)
' B) X" `; V. t. a# J
#define OPT_TCC_SHIFT (0x0000000Cu)
* s( D9 J, ~' k' B5 \+ h* b4 w+ H
#define OPT_ITCINTEN_SHIFT (0x00000015u)
. Q* k6 s8 H, H2 {7 ` q* i5 x
#define OPT_TCINTEN_SHIFT (0x00000014u)
8 t" `6 J% p5 Q: o
$ l5 C9 {' ^- G; o* T$ i; o
char ping_buffer[PING_PONG_BCNT];
9 }* [7 l& @7 s3 k" c
char pong_buffer[PING_PONG_BCNT];
- {" f) V2 [; d" T
8 e1 f( S7 h) K1 k2 m8 g; ]' H% I
2 L* H. j$ X6 W5 o
: i! s5 I/ z5 R, U% {9 T
& [- d9 L+ h2 o) Z6 U: A" k# \
static void ys_edma3_init()
+ V5 i3 H* m! R2 _8 Z
{
' [7 Y/ m+ R' I; S8 [# G1 c% ?: t
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
|& u( ^: t& @* [6 ?4 E
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
w8 N" `8 a5 B" T/ ?$ r6 K
EDMA3_DRV_Handle hEdma;
8 C% v. ]- a8 S6 Q' g H
uint32_t chId = 0;
( O$ r5 `$ o# ]& Z
uint32_t tcc = 0;
' G5 N7 }2 v {" _: `3 U5 V
! R. K2 u6 }, J' u7 d- I
print2arm("edma3 driver init...",0);
* p( A" R& P4 S* w, ^
5 b7 x% y: ^: f, \0 S2 x
hEdma = edma3init(0,&result);
# \$ A' c! S, [7 ^5 A5 v# g |, H
if(hEdma)
# q" A! ~5 p! h _6 f F
{
( l. ?1 K- B: H2 s
print2arm("edma3init() Passed.",0);
3 C& O7 N' u3 T& c
}
* \" E0 ^% x, F, `7 j) o0 s8 j
else
* M7 [5 M4 x8 X9 |5 {8 e
{
1 m* K* V- H: P/ S) i4 a1 w
print2arm("edma3init() Failed.",0);
7 t) w- |7 Q) H, i) ?
}
5 Y! h8 U9 I" M- @
! u- C i) \) }7 y" a2 o
if (result == EDMA3_DRV_SOK)
! Z% L$ ^1 h& Q3 o. e( d$ [; o% I- v
{
F n( J" k: M. B
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
; a: t- R6 B( {; q; P. q
(EDMA3_RM_EventQueue)0,
5 x2 U: P( c6 s3 r
&edma3_isr, NULL);
" { A0 t+ u( }
}
6 F- v' S8 d$ F" D; B, e) l
& p% ^4 l# n3 l+ ~( p
if(result == EDMA3_DRV_SOK)
& q. [% R$ C: w) j, P3 m
{
7 D) C/ c0 k' k9 S
paramSet.srcBIdx = 0;
* M2 }) C% t4 m( d. e2 P
paramSet.destBIdx = 1;
5 e3 Z3 u# Q) t9 F: L3 i6 Y
paramSet.srcCIdx = 0;
3 V7 y; D e3 e
paramSet.destCIdx = 0;
; z- W. c; `+ ?/ k2 I/ U
paramSet.aCnt = PING_PONG_ACNT;
& M$ m2 v. a1 Z) \) |5 H; \3 |+ o
paramSet.bCnt = PING_PONG_BCNT;
% I% d* |+ I8 U. V" ~( |9 [0 [
paramSet.cCnt = PING_PONG_CCNT;
7 q; ?+ b0 M. c# p3 F
5 V1 U, ]. F& v! ]0 l* D8 f
/* For AB-synchronized transfers, BCNTRLD is not used. */
/ l* a# }4 ^3 ], O8 ~$ Z
paramSet.bCntReload = PING_PONG_BCNT;
( t8 y7 U( `) ^8 e$ o" X/ P
4 U3 a9 z$ Z: a7 Q& b4 O( o
/* Src in constant mode Dest in INCR modes */
$ _1 B0 P* ~! S: R6 e" R* `. M
paramSet.opt &= 0xFFFFFFFDu;
1 x& {0 K! S& T) p8 |
//paramSet.opt &= 0xFFFFFFFCu;
* ^" f$ Q' C+ P/ p) c% S4 L0 ^
1 g" M5 ]! B' C! m) M. u
/* Program the TCC */
) f& m3 O6 I) a$ c- g; _2 w
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
+ }: F4 h6 R3 r5 }. G" C [" {
5 a% _3 t6 A, D; e! Y
/* Enable Intermediate & Final transfer completion interrupt */
" {, d6 u% k# C! z( P
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
! m$ e$ s$ q. r/ ^' Q2 Y& }
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
) I) S6 V C7 v2 ]$ h! O' {, X
2 n4 L" v" b0 W, m
/* AB Sync Transfer Mode */
8 \ o: n7 _! J! o2 }
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
m' S& I2 I- N- W# b0 `0 l$ e
6 [% f! f4 m% P5 I" [7 t
/* Program the source and dest addresses for master DMA channel */
! d1 K5 a! j C
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
: C$ Z9 D8 H1 I
paramSet.destAddr = (uint32_t)(ping_buffer);
4 p' o* B2 d; w5 y
0 R( s+ }+ r) f0 f3 w
/* Write to the master DMA channel first. */
. f0 S( J* I3 W/ A
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
$ n7 V& V' W) W; y" D1 `
}
: h1 x, V( n$ d( B2 B
9 {: m5 ~3 n/ w: r
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
8 l! U0 ^9 _5 N0 J
. w" a! u( ]9 ?) u- r) @
if(result == EDMA3_DRV_SOK)
, w5 K( x% ]0 Q- D
{
& b" S S/ I! O( _, Y: x
print2arm("edma3 driver init success.",0);
7 o( B4 U3 h' s" ^) }) @
}
1 Y! w6 }4 q9 B
}
( V& d7 c& I1 I" R; ]! s& D9 M8 f
: H. L4 j( Q2 l8 s- }/ f) F1 F
4 h1 k. p: F; x. W
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
. m' w. ?8 g$ x% c' D' p1 Y9 k
6 |' e: Y% M( w; P3 X' j4 G. K
3 X' x+ t, G) | s7 u
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
' V& x7 Z7 {4 K& D! i
每次DMA传输完成后都要再次使能传输
! E: E! y; b* K- R
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4