嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
* o r6 ]& I+ n8 e) M t- G# [
#define PING_PONG_ACNT 1
7 w3 O) J7 H2 y& F0 S
#define PING_PONG_BCNT 8*32*40
0 r$ \0 p8 u0 K( G; W6 a5 g2 z
//#define PING_PONG_BCNT 1
; B" e4 r9 s& _/ p' h# F9 L$ n
#define PING_PONG_CCNT 1
, \, F# z# P$ Z) {9 H( S# g
#define MCASP_BASEADDR 0x01D00000
! R7 ^9 D+ e) r/ [- ]7 u
#define Mcasp_RXEVENTQUE (0u)
2 x3 d# @# z5 W+ E" N
- n* b7 `5 c9 ^2 d; u9 E
/* OPT Field specific defines */
5 m- S* z( h% D' c8 H
#define OPT_SYNCDIM_SHIFT (0x00000002u)
* |( q$ }- u' o' |) S
#define OPT_TCC_MASK (0x0003F000u)
, y- R! F0 v U" |$ Y' P2 z
#define OPT_TCC_SHIFT (0x0000000Cu)
' a9 V6 c" l6 C3 ~; h/ q7 f
#define OPT_ITCINTEN_SHIFT (0x00000015u)
/ ~/ S* y& c$ G# ^( N7 K* K
#define OPT_TCINTEN_SHIFT (0x00000014u)
' k! h7 x, Y- S
8 K( ]: |/ L+ q |
char ping_buffer[PING_PONG_BCNT];
3 M4 c8 }; z( h( t: X
char pong_buffer[PING_PONG_BCNT];
6 M3 x2 p: U6 r2 x
- \5 f4 [6 g+ h. g
1 D8 E1 y! V- z5 g2 R g) _
' g* G2 A, u" o4 s- i: _$ C% f
" j* n+ e9 g+ f% {' {& |
static void ys_edma3_init()
/ a- e' ?: V1 X
{
$ T) r) A2 i' ]
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
: `3 G' A* f7 E6 C1 h) `
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
8 g6 `% k* f* s# [" k7 k
EDMA3_DRV_Handle hEdma;
* E U! g4 q H; W
uint32_t chId = 0;
& c" t3 `- x6 B' D
uint32_t tcc = 0;
& \ L( q) i5 g& t( H& Q! l/ L, P
) l8 S. ?8 `/ R$ ]0 m
print2arm("edma3 driver init...",0);
9 P/ T, M/ f" i! b
2 X7 W" J ~) c$ r2 L! } O" E
hEdma = edma3init(0,&result);
7 A9 A9 h) t/ i6 r# H
if(hEdma)
5 {8 Z& N0 p0 `
{
, v$ z5 N W% `* h( x. R
print2arm("edma3init() Passed.",0);
( g8 m- g$ z/ w4 D( }- q* d& Z$ p
}
/ H; f0 F# d& |( Y
else
]3 K* p4 H; n- m& `$ U! J
{
0 c& F$ P6 f# B) s2 C" r; L
print2arm("edma3init() Failed.",0);
& ^/ D2 t, o }
}
/ o8 N* g& K- ^, y+ P" I# ~2 G, l
. _* Q" @! J9 ~! _, O5 e! i
if (result == EDMA3_DRV_SOK)
: Z) ?: |: T0 s, r, i
{
0 t' r6 z h" q/ n- d, J
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
2 s9 e4 z- K2 S- M
(EDMA3_RM_EventQueue)0,
0 i% h$ p- D7 A3 s* ~* _ o
&edma3_isr, NULL);
8 j: B6 x4 D4 p% k# t/ H
}
' a K) N) {- D5 p: g
4 p. t6 ~! L# G6 [
if(result == EDMA3_DRV_SOK)
) D5 x# W& u* v$ l
{
. s, W# b/ e8 t L/ [
paramSet.srcBIdx = 0;
+ f9 B2 Z! T w3 s) c; C- j
paramSet.destBIdx = 1;
$ [0 q1 |2 `% \# Z! A
paramSet.srcCIdx = 0;
4 R! U- T$ M7 r; `6 X" w7 H" {
paramSet.destCIdx = 0;
- J+ z: U+ b) T9 I( t6 H
paramSet.aCnt = PING_PONG_ACNT;
# e, S. k, F' \7 A1 Q
paramSet.bCnt = PING_PONG_BCNT;
4 j0 ^& A) m6 p/ J* Z1 e% d
paramSet.cCnt = PING_PONG_CCNT;
4 U9 M, o$ S3 G' d4 g% Q
9 ~8 d1 D1 d$ ^! B6 r$ z( _% O
/* For AB-synchronized transfers, BCNTRLD is not used. */
+ J/ s& y$ c" A- I/ N2 r
paramSet.bCntReload = PING_PONG_BCNT;
/ G. g- K: q+ \, Q. _, V5 ]
9 u, _+ q; j \0 r2 [
/* Src in constant mode Dest in INCR modes */
7 L, d4 T, V4 @, W
paramSet.opt &= 0xFFFFFFFDu;
" s& a9 g3 ~; u& @: l( C6 O) W
//paramSet.opt &= 0xFFFFFFFCu;
, b C5 n; A4 O2 n1 k
9 L X9 A0 P6 f3 e0 n+ r
/* Program the TCC */
0 ~0 P+ Y, I' k, W7 C& I) \3 ]
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
# t" N4 N+ B* `. W
V6 V0 v7 `7 P* H5 W! x+ m; U
/* Enable Intermediate & Final transfer completion interrupt */
c+ r. e# T; G% L2 ?
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
* V# y7 U" b0 C: B6 W* V- F/ E! G+ b
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
6 m5 }- r9 h0 K$ h1 f
" E4 m' p" U8 t3 G- M: {
/* AB Sync Transfer Mode */
0 _7 x( L' n/ N" w; ^( T: j
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
0 ?2 b' f' d' [% n- H7 B3 Q
; j) V" K ?- U$ z
/* Program the source and dest addresses for master DMA channel */
. d( D( u! `3 Q0 y0 _
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
5 i' r) q; g( {3 V* A' f+ x( E. e
paramSet.destAddr = (uint32_t)(ping_buffer);
# e0 S! M& R+ C: W: F# J! k9 r
$ ^# D' M+ q, Y% ~3 M
/* Write to the master DMA channel first. */
. s8 O W& ?6 B0 c% p
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
O) V' L: f# y) B7 T0 B
}
" o! ]" ]/ y) P4 o
9 ]! g( m& Z% e5 G* j# _
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
. u% q: o8 w9 N* J$ i
' q1 a' v1 n3 J( B7 \
if(result == EDMA3_DRV_SOK)
- O# U1 N& n7 \! @
{
8 C: v A9 w9 |8 ~
print2arm("edma3 driver init success.",0);
. I1 |8 N$ I: X9 z' G$ W
}
1 ?4 [5 K3 t S. Q( Q
}
* w% v# D; L, J( ?% R% h
9 [' N f) a3 d
" q% D* ]6 R2 h
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
" j3 u- t8 R0 L
7 E% u P" o; B1 k
1 ~+ h3 I2 x9 P/ H) E
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
. `: `7 i7 _. O" k2 D
每次DMA传输完成后都要再次使能传输
6 t$ s9 @( n' @& ?9 [' d
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4