嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
6 L* U" g* U7 u. ~1 ~
#define PING_PONG_ACNT 1
: ]5 |- K5 [0 u3 I0 S
#define PING_PONG_BCNT 8*32*40
% Z; t# S+ @! o& r0 h" i& p3 M
//#define PING_PONG_BCNT 1
( P' ]8 L8 x! G
#define PING_PONG_CCNT 1
9 _5 P" k) ^0 d) s" p9 O
#define MCASP_BASEADDR 0x01D00000
9 s7 R" R( O" j6 J5 Z# j% j
#define Mcasp_RXEVENTQUE (0u)
: X' {) |9 G! m0 `' \" N4 H
# `. Z7 Q3 I) E2 }) ^
/* OPT Field specific defines */
$ {, _* H$ p# S1 k: Q
#define OPT_SYNCDIM_SHIFT (0x00000002u)
, j! g7 X$ w: a, S( C z0 W
#define OPT_TCC_MASK (0x0003F000u)
6 S4 H u) z; E ?) s; T
#define OPT_TCC_SHIFT (0x0000000Cu)
4 P. k" y% @% J8 o0 [* Y4 @
#define OPT_ITCINTEN_SHIFT (0x00000015u)
3 q3 _ G( ?% s6 Y) O/ F& e! M
#define OPT_TCINTEN_SHIFT (0x00000014u)
?. m* R9 Y# q- n+ a7 `( D5 L
' O! @# A1 n9 k/ O7 o! ?1 ~- Q
char ping_buffer[PING_PONG_BCNT];
1 q2 M/ p/ H8 w+ u# b
char pong_buffer[PING_PONG_BCNT];
+ r# C9 f: V' V$ q
* Z8 u. p6 C0 R, q( d
x- f) h7 x) z! r6 W2 |
" {1 ~9 q R; a
" D$ Z$ m5 ?2 ]( k$ |& j
static void ys_edma3_init()
( ~$ V9 P! k/ Y
{
* K5 Q# Y/ n& D/ h2 Q
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
+ }7 T3 R7 D- s4 D
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
0 ~; N0 x; t* S% F- D8 Y: V/ Z: x2 s1 }2 \
EDMA3_DRV_Handle hEdma;
5 t& ]0 q1 r% k1 V e' _5 ^
uint32_t chId = 0;
$ h: o0 n& V5 @* K
uint32_t tcc = 0;
+ T; \* l6 L' A2 J0 k
( {) j+ g$ J3 P! g9 ~
print2arm("edma3 driver init...",0);
8 X" l; Z4 e- F
' O9 N0 o7 m4 z3 Y' ]1 h G
hEdma = edma3init(0,&result);
7 X+ b; q% _* [2 }$ j( T* D
if(hEdma)
& y/ q5 r# J* L
{
1 o. x% [3 D" J! N
print2arm("edma3init() Passed.",0);
$ J* s- }' T+ I1 }
}
! r) B% X7 u7 f7 A1 Y! W f# H* X' }" a
else
2 ?1 ]5 C0 I6 ]& R
{
% T/ f9 g- W( q, S' u
print2arm("edma3init() Failed.",0);
' N- x: b+ `) N. k# W' ^
}
' c2 O' X/ R3 {
. O/ @) x7 c! s+ w/ Y
if (result == EDMA3_DRV_SOK)
3 f" m( l# k9 `8 Q8 [4 u, Y
{
* B, r8 K ^( N" u( I/ A g2 l. ?
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
! ]% ]7 B6 j+ k5 a [; {
(EDMA3_RM_EventQueue)0,
3 _# ]' q, z4 F0 {& l, t9 K9 {
&edma3_isr, NULL);
4 ^2 @9 P$ U7 X
}
5 A1 V3 d! i. w3 L o6 {( n/ [
+ P% G+ m' x4 Y3 f% l
if(result == EDMA3_DRV_SOK)
7 V! T" @& F" M; P# m
{
( m. _/ t' T% P
paramSet.srcBIdx = 0;
+ ]- u9 H- \ `. z& r. B
paramSet.destBIdx = 1;
7 C$ F% S n1 {. ]2 d2 N" O, ^
paramSet.srcCIdx = 0;
3 o# N1 M# a9 K9 ^6 B' T
paramSet.destCIdx = 0;
& y l$ [6 e* K; l6 G* O
paramSet.aCnt = PING_PONG_ACNT;
: A+ }/ \8 N9 L% Y& M: a0 A
paramSet.bCnt = PING_PONG_BCNT;
) v5 y0 ~ W: j" f7 @3 K0 W
paramSet.cCnt = PING_PONG_CCNT;
3 U8 p' k+ r# ] n! s! D
3 @1 a5 |" \! \+ q( u4 ~$ ~
/* For AB-synchronized transfers, BCNTRLD is not used. */
2 r* R3 l3 E$ Y8 D$ G
paramSet.bCntReload = PING_PONG_BCNT;
1 @% S8 T) Q- S, W4 i# n
% q$ e, y! z% K: P! n( q8 S
/* Src in constant mode Dest in INCR modes */
; D+ [0 F9 B. g S ~# {" x
paramSet.opt &= 0xFFFFFFFDu;
* q1 Q% w: x9 F7 l, \
//paramSet.opt &= 0xFFFFFFFCu;
3 M2 n! a' w$ t# ^
: {( T# }; O8 ]! N
/* Program the TCC */
1 L, t0 K+ D0 }# @. G
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
/ x1 j) b1 C2 b7 z- Y3 w, k2 E
4 C! M! H& z. ]- f3 Q1 l
/* Enable Intermediate & Final transfer completion interrupt */
/ `: Y9 n* r2 i U$ y( k: _
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
4 U3 P' u, R$ r5 s
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
; Y1 u2 `+ r3 g4 A4 g. a" X5 }
+ h5 ~ W4 T: t7 G# E: s
/* AB Sync Transfer Mode */
" g9 \7 @6 L# K0 Y- Z& c( J7 Y& H
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
* H9 u0 X: I& R
* L' U% V+ [! m0 B \
/* Program the source and dest addresses for master DMA channel */
4 u' s# t- N _: C. o+ [
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
- t2 X. ^& @ k2 h
paramSet.destAddr = (uint32_t)(ping_buffer);
/ o# F, S" e* C" `2 Z# |
# F' \0 q* F" `% U4 D2 |4 P% b
/* Write to the master DMA channel first. */
% f5 k# M" B1 S
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
# ^8 b8 M2 Z' X0 G
}
' t# D% v* J7 X! k6 @1 j
0 A9 R* K4 @0 Y
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
5 r+ T3 z, A) z8 }$ u! ^! i
, l# U( C3 b4 N# c: P
if(result == EDMA3_DRV_SOK)
+ M/ t3 S; J$ N- s7 P
{
/ \6 K" K/ d6 J9 K* \+ N, m2 ^
print2arm("edma3 driver init success.",0);
& O; {* A5 D/ e, h% r2 L
}
5 {" D# [; r# p% |" w% L
}
- ^6 }$ }* p1 A" }4 J
0 \ B1 K4 {- C7 N' b
/ W0 C) c& p2 ^! k) l: i* w8 e
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
2 k/ r. \: U4 d9 G7 S3 ?3 x: c
( k2 ]6 v2 t0 H# @2 v$ T6 t
5 w5 C5 K, j/ }% f
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
; D' w4 \7 z ?* b5 D! }
每次DMA传输完成后都要再次使能传输
/ U( }* \5 U+ b; v
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4