嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
8 @ t; w( S5 y2 E
#define PING_PONG_ACNT 1
% u A3 p3 [$ \; i* u; c, O
#define PING_PONG_BCNT 8*32*40
5 n$ l' j2 Z" J3 J2 s
//#define PING_PONG_BCNT 1
! _( k, x. e! H8 D
#define PING_PONG_CCNT 1
3 J+ @7 K9 W! E1 g1 u5 G
#define MCASP_BASEADDR 0x01D00000
3 T3 T8 T( x9 @+ |! L, w5 a1 I% {
#define Mcasp_RXEVENTQUE (0u)
0 s7 }+ Y8 Q" S/ \& u3 m
Q5 r- Z+ ~* B2 I
/* OPT Field specific defines */
' \6 Z5 t' p; n$ B! A1 s' d
#define OPT_SYNCDIM_SHIFT (0x00000002u)
+ }, b; @3 P0 {
#define OPT_TCC_MASK (0x0003F000u)
) S L3 j" e _2 H5 Z0 \! s. R/ y
#define OPT_TCC_SHIFT (0x0000000Cu)
8 c+ G" y3 o1 s. F2 U( G# m2 @7 }
#define OPT_ITCINTEN_SHIFT (0x00000015u)
! m) T& l8 h4 B: c! n6 I3 g8 f
#define OPT_TCINTEN_SHIFT (0x00000014u)
0 f; M0 {6 ?+ l5 ~8 n$ t C
$ F3 H: }: [5 u \ K% b* q
char ping_buffer[PING_PONG_BCNT];
2 @8 _; V5 M5 C
char pong_buffer[PING_PONG_BCNT];
- C" f3 z; q' X- {
9 z% T& |9 E4 F! ?
! M& {+ ?% o( w' f9 W
% G# B+ E( D% r( j5 H
/ R" G5 a& K- k8 b" a
static void ys_edma3_init()
% \- p$ A7 V4 C5 s3 L2 n& j" f
{
# v- x: c- H/ {* p: J! ?
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
% @9 V! Z" I8 b4 h, H' D8 M% }. Z
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
" y8 l' o+ P' e e# y' L
EDMA3_DRV_Handle hEdma;
: p! {5 f7 H9 t+ h& {) _3 m! \
uint32_t chId = 0;
) y9 B- z/ ~1 q# N6 `7 j
uint32_t tcc = 0;
" X3 r5 V) w4 T5 v
& N# x6 e, u0 F6 J4 ^+ o
print2arm("edma3 driver init...",0);
/ y( ]8 d0 d \1 E# |! g6 k
- H: L# _* O8 _& i( T) O+ k' o
hEdma = edma3init(0,&result);
5 }0 V! k+ z3 P: l. r
if(hEdma)
! y, _# ~3 Q) e- J- P
{
" Q: A7 R8 A) F. z6 U
print2arm("edma3init() Passed.",0);
! o. k" | E }3 K, H9 I
}
; Q& i3 V" |& N1 M9 J4 w+ B' I5 e
else
& p8 I2 r k( q/ ` |+ Z* b, F. Q) P1 q
{
" B& i% |1 i1 v3 F3 q
print2arm("edma3init() Failed.",0);
" e% T9 a# r9 {3 @8 j
}
4 d6 g! U; J+ g) G+ U8 L
5 n# n: x8 p5 W6 t$ s- `; ]
if (result == EDMA3_DRV_SOK)
* t R: {/ r+ l
{
6 E3 K2 X9 h5 g9 v
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
' w3 B" [* U: E- \
(EDMA3_RM_EventQueue)0,
8 h, U& _! k3 c) ~# \& g
&edma3_isr, NULL);
# A+ k: O1 I( [
}
. e; X; _2 V3 z! O$ w0 ?6 q
4 a- p7 t9 C* q) }
if(result == EDMA3_DRV_SOK)
$ V0 Z; V7 c- u9 _( n# M
{
6 f, _" L- A+ B, o1 b
paramSet.srcBIdx = 0;
5 W, V$ h- h/ u* ~9 C6 z" E8 o
paramSet.destBIdx = 1;
! I$ I- J6 N! A& E$ a+ _; X
paramSet.srcCIdx = 0;
( F' ^1 {% G" b2 G$ P- E+ w- n
paramSet.destCIdx = 0;
' r S$ ~+ i9 B& d Q/ c+ P
paramSet.aCnt = PING_PONG_ACNT;
2 k9 R" X- c: v2 H& \
paramSet.bCnt = PING_PONG_BCNT;
2 |6 E5 E# a4 e
paramSet.cCnt = PING_PONG_CCNT;
5 i1 e, a$ T( y
+ U$ Y8 \5 L8 E
/* For AB-synchronized transfers, BCNTRLD is not used. */
" P8 w! N# n5 G) b) R9 J, q
paramSet.bCntReload = PING_PONG_BCNT;
* W+ W+ ?1 s1 O' v& J! X
: E) o" {: w) U
/* Src in constant mode Dest in INCR modes */
0 C( \# J; w' |) |( q
paramSet.opt &= 0xFFFFFFFDu;
* r$ d" x: m# @
//paramSet.opt &= 0xFFFFFFFCu;
* G2 n0 v: j/ h3 e: P6 e# ]2 S
9 q5 | \- M- r! E% K" e5 J7 J
/* Program the TCC */
( k9 G+ P9 ?2 Y6 v
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
7 M h+ Y/ \5 w
( h7 S u% G! f* r
/* Enable Intermediate & Final transfer completion interrupt */
/ |9 x! A) @; v1 [5 A
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
' o: T# A5 P% A0 q- h8 V- g
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
0 o" C7 D5 @; f) s- G% i
0 B: J$ F3 c/ ]8 z' e1 z* a4 B9 m" W9 P
/* AB Sync Transfer Mode */
% @4 ^; Y7 F" l7 X1 d4 c& F
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
: A' f( g1 f' f7 }
( ^7 O& E- A0 c, }' l; \3 H
/* Program the source and dest addresses for master DMA channel */
N& L) V, c7 K
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
$ d" Z/ ?% q7 u# C; d) K( \
paramSet.destAddr = (uint32_t)(ping_buffer);
1 u9 q5 ^# E( c
0 l& ^2 {: `4 X1 Z
/* Write to the master DMA channel first. */
& b9 M; Q# ^* P, K7 L0 n/ m3 L
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
: e1 k8 v5 h/ s! S6 U* J
}
9 `- m4 Z! G4 S
s$ Q! @. L) d3 Q+ Y6 x4 k* z
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
0 W1 q" ^7 m, ~7 J
$ k& ?; n& \& e) H
if(result == EDMA3_DRV_SOK)
! P! X: F$ {* V; p, S7 L
{
2 F: W3 ~! Z. y3 J1 P' q4 N
print2arm("edma3 driver init success.",0);
5 d% ?9 L$ y9 j& E- n2 j) c
}
0 K, D! d: R* w2 d3 \2 F
}
- ^/ J" k7 z& `' Z
' Q* B4 x/ m- ]1 h3 {8 o4 R$ g' E
% M$ F4 B6 Y% }% a4 P2 k
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
) T( I+ Q0 V7 v8 O% F7 z
& R- E D# d1 T( [* u; ^7 Q8 x7 y
/ b R& s7 R' f" J5 g% t" u
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
/ ^. W# W5 H5 x) A0 q5 N( v( }
每次DMA传输完成后都要再次使能传输
$ H" f8 D8 G0 U7 x5 F5 Y
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4