嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
( n( M. Y' M& b/ D% e5 r" Q. r# F I V
#define PING_PONG_ACNT 1
% L7 p$ X" _" G
#define PING_PONG_BCNT 8*32*40
% d+ w2 n1 X0 b% @, }
//#define PING_PONG_BCNT 1
2 [7 `' z* |- a9 E$ ]0 _ ]0 ~
#define PING_PONG_CCNT 1
! k3 \" e2 A) w' H7 S. L) I0 |
#define MCASP_BASEADDR 0x01D00000
) _5 q& d1 R8 f9 u" p* M
#define Mcasp_RXEVENTQUE (0u)
+ c% }; ^( V/ u8 n3 d4 }6 t
) e7 Q$ _; A) |: q, E8 i6 Q. C$ c4 Y, h
/* OPT Field specific defines */
2 O& _/ ?. R- F7 i$ y
#define OPT_SYNCDIM_SHIFT (0x00000002u)
/ r& f% h; n2 E" y; J/ |/ b
#define OPT_TCC_MASK (0x0003F000u)
1 p8 P s# O. l4 D- `+ l
#define OPT_TCC_SHIFT (0x0000000Cu)
* O" B( |: a! N, i0 I, c% \
#define OPT_ITCINTEN_SHIFT (0x00000015u)
# m# J0 U( D' Y
#define OPT_TCINTEN_SHIFT (0x00000014u)
7 B& M0 B$ a5 u. `7 _& i. X$ f
& ~7 V/ t5 U9 c# z
char ping_buffer[PING_PONG_BCNT];
% `1 M1 {0 _4 O. Z' x
char pong_buffer[PING_PONG_BCNT];
6 ^7 N) G2 S6 ~" |/ s0 T
& D2 A) v% l3 w) o6 q: W" O- ?# V5 s
2 N6 I7 O4 C; \5 z, b
# g1 N. l3 f+ I" ~) s. u
% K0 l2 Q1 u$ H8 e" ^7 P! ]8 W, P9 y
static void ys_edma3_init()
9 y: x0 c8 r5 K) o# m
{
3 D5 [0 X/ }2 M, p8 l: n( K3 N
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
8 [& X8 \' D9 g Q* x9 G3 g
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
% m- O/ l) @, @2 x
EDMA3_DRV_Handle hEdma;
) V5 O1 _( Q; v6 P" ?, L& [3 d
uint32_t chId = 0;
! f; M5 b B- O- T
uint32_t tcc = 0;
. c4 K7 R% z9 U5 Z
" n. N+ {0 i/ E* O
print2arm("edma3 driver init...",0);
% u3 u, x0 L& m+ Y! v
0 t$ \( d' Q( Y# i- h2 S
hEdma = edma3init(0,&result);
5 u F" s6 c/ d- O) @. J* H
if(hEdma)
7 D1 o5 C; B0 Z" g0 w& Q
{
x' }" x! J7 w6 j& G
print2arm("edma3init() Passed.",0);
6 `! s2 T8 ^2 d7 ]' x4 @
}
) U- a. {/ ?8 N$ _. F
else
! W* w' T# n5 B0 g! H
{
. v9 U7 m2 U6 T \9 P& ^
print2arm("edma3init() Failed.",0);
1 b9 _. O! q @) r, r$ {# G
}
' s; w- X$ T$ Q1 c! E
7 z2 e0 L4 P3 e2 E( |- i
if (result == EDMA3_DRV_SOK)
( l3 q- J i" H3 o, O' {5 F) v
{
0 \3 v6 L$ `) F3 A0 y
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
: m( i3 _8 P$ N) p$ R+ ~4 l, d
(EDMA3_RM_EventQueue)0,
' C/ w# B3 s) f) p
&edma3_isr, NULL);
3 k" [9 F4 u" K. W
}
; w( J+ W1 P+ f8 l$ ?1 V
9 ?/ ?, e7 D- A8 y! L! b
if(result == EDMA3_DRV_SOK)
% B* K# c+ D8 {( |/ O
{
( ^9 S4 ?/ ~; b6 ?1 I3 @
paramSet.srcBIdx = 0;
; ?- x- E5 Z/ N( c! u: [3 M
paramSet.destBIdx = 1;
0 R/ Z0 y2 T6 a# W! o
paramSet.srcCIdx = 0;
4 x) I' b& Q7 `, ?# {
paramSet.destCIdx = 0;
8 l1 y+ U; P! e- A! K
paramSet.aCnt = PING_PONG_ACNT;
% \5 d% W& s! t0 w& z+ G' u# ~
paramSet.bCnt = PING_PONG_BCNT;
" g: S9 s A3 H5 d+ z1 m, f
paramSet.cCnt = PING_PONG_CCNT;
% e$ w9 a$ G0 t9 E! I7 D
- M: S/ X, E: O) ~% K
/* For AB-synchronized transfers, BCNTRLD is not used. */
2 t$ f! w7 { D% Q [
paramSet.bCntReload = PING_PONG_BCNT;
. s7 w& t( } i! K# `9 Q
9 O( r/ q; u% {/ k6 o
/* Src in constant mode Dest in INCR modes */
) F) ^/ H, E0 V. x0 c" K; m
paramSet.opt &= 0xFFFFFFFDu;
3 n; c M) U- }! L3 P9 G
//paramSet.opt &= 0xFFFFFFFCu;
, n" R" ^! p* V* t$ ^
0 F1 S1 D6 `2 ~# n3 q: \8 q; r
/* Program the TCC */
; h. W( M" I; Z7 G: F0 q
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
* O9 ? e, U4 @ O3 @6 L9 @
9 Z. @( T, P* k
/* Enable Intermediate & Final transfer completion interrupt */
4 }! `' A' C) D) H# C' G; b. g
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
$ F- O% @8 f& l- V# v
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
- ^9 j2 w* y, z* N0 S: N: N
' P; ^. ~3 V& b4 {
/* AB Sync Transfer Mode */
2 O& x; M8 Z) @( w
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
7 Q9 S4 E- C& }: W
/ |6 Q' _5 q7 H6 C& D
/* Program the source and dest addresses for master DMA channel */
' N% y/ T$ \& U9 I: }# [$ p( I
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
, I; L1 a2 C2 O( w7 `, ^3 h
paramSet.destAddr = (uint32_t)(ping_buffer);
1 V/ F8 {$ c3 Z
j2 T5 z* M5 b+ R
/* Write to the master DMA channel first. */
: `' ^- B% P( z1 {
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
$ \3 [, \: a6 j- `: \; a& x
}
& }4 H4 y* w0 J# I4 y6 v
7 B8 D; @; e3 x* ~
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
2 N6 y$ z9 M! f8 d
" o1 ` b3 G' S! ]9 L* E6 E
if(result == EDMA3_DRV_SOK)
. Y7 ?& z) z4 R- u g
{
; ?% d/ ?5 u, A3 |( l
print2arm("edma3 driver init success.",0);
+ ?: @) R8 l V2 G
}
) k" c/ J1 `( ^8 ]3 R! t
}
G0 }: n: N. v
0 g6 J$ W) q& g' b; ]- M
7 V. f0 v0 O0 A( l3 }! B
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
2 b' W/ G: h' H! T
- H/ n. |9 @; L. }
1 k; \% q: C9 I; l# l7 P
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
" \- |' w4 s0 r) K; P( `
每次DMA传输完成后都要再次使能传输
' T m9 w4 C. L, }4 Q0 A! W* y) R. _
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4