嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
+ E5 J+ R8 z- w0 e
#define PING_PONG_ACNT 1
) N, k; ~' g) E3 n- S( x' e0 n
#define PING_PONG_BCNT 8*32*40
' i5 }- W7 r2 i% v) @
//#define PING_PONG_BCNT 1
6 l% g2 U8 {! M2 [7 _
#define PING_PONG_CCNT 1
7 v2 n$ ~% ~: Q! [4 O+ Z, ~& _# U
#define MCASP_BASEADDR 0x01D00000
$ D( g# O L" D
#define Mcasp_RXEVENTQUE (0u)
9 ?+ a. R- m4 a" L
2 v K) G3 s% q4 n- ^% d
/* OPT Field specific defines */
' g p8 {4 P/ Z3 O- {+ d( S
#define OPT_SYNCDIM_SHIFT (0x00000002u)
, m K; u( ~" V) ~& V# R
#define OPT_TCC_MASK (0x0003F000u)
4 [% z t2 P& A, e& z s/ v
#define OPT_TCC_SHIFT (0x0000000Cu)
2 N1 o+ X* [; l/ K
#define OPT_ITCINTEN_SHIFT (0x00000015u)
. Y) x: }& e M+ l S
#define OPT_TCINTEN_SHIFT (0x00000014u)
( d. Z6 C/ O, }0 _- \. p
9 |$ c0 Z2 N6 M
char ping_buffer[PING_PONG_BCNT];
+ v; F- r% w( K) O0 P6 O0 ]3 |
char pong_buffer[PING_PONG_BCNT];
6 Y) j, h" M# \- L! u
* [7 L9 |8 ~7 V1 o& v v
9 Q! q* c$ Q1 j" k! r$ C T. A$ h. J' |
; ^* ~3 J, _: Q8 {; }! ?
; E# V, G( ~" X: L: w
static void ys_edma3_init()
# w% r) |' H5 I& X, J2 I4 O
{
0 ]. V9 ?* d. U( L9 a# t
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
8 Y, {% @" P9 x( e
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
# E k6 O1 Y. l, R
EDMA3_DRV_Handle hEdma;
+ c& L! q& k4 }; P7 _
uint32_t chId = 0;
, v+ H5 T, |% a7 i( v' v( N
uint32_t tcc = 0;
, D- b3 r! g- {+ A4 u
! y9 E5 N* f/ z' L9 U$ _5 L/ L
print2arm("edma3 driver init...",0);
( _1 z3 Y8 [( ^0 Q: K8 _0 S" X1 y
" ?, {: h) t, K" \8 G* |: r
hEdma = edma3init(0,&result);
3 H' v, b! L' g. E: c" O
if(hEdma)
" D5 R- I: \9 W7 l# \) Y
{
; T: s0 F$ f$ G
print2arm("edma3init() Passed.",0);
" f- m) p0 A* E4 v
}
$ u+ [9 q! y$ M2 `) h0 v8 V K
else
t" ^* q* a* [
{
l& ^9 x u& J
print2arm("edma3init() Failed.",0);
. y7 P$ Z, ~; q9 u( p( [ W
}
% s% d& ~) }5 `; q
+ a$ s, d i$ y: c+ x
if (result == EDMA3_DRV_SOK)
2 }/ {( p! d7 P/ D
{
0 T% e) j }& p- m+ z% D
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
$ m ~1 w) h! l, P4 j
(EDMA3_RM_EventQueue)0,
G g2 ^7 e- ]2 X( c+ P6 @4 f
&edma3_isr, NULL);
: X: U; {7 a' t; }. j
}
/ B) e4 w# E, L8 ?* F( M
4 l5 r) e8 \1 K
if(result == EDMA3_DRV_SOK)
( s& \$ z" G; b) `4 X2 t( @2 }/ y
{
3 r* O( ]' E' G
paramSet.srcBIdx = 0;
) n( l6 V- y& |
paramSet.destBIdx = 1;
2 }# V/ O K( w4 X7 H9 j m- z0 r
paramSet.srcCIdx = 0;
8 d: _: J t) h- E6 c* o1 C, p: l
paramSet.destCIdx = 0;
8 B4 N$ @* @# D$ [' L% X
paramSet.aCnt = PING_PONG_ACNT;
" T2 W" { g4 ]: H
paramSet.bCnt = PING_PONG_BCNT;
+ j: y# O: z/ e, M7 j
paramSet.cCnt = PING_PONG_CCNT;
$ Q1 |; s x. j9 y& L+ I
% m- D# R1 C: x/ a1 u; m% E
/* For AB-synchronized transfers, BCNTRLD is not used. */
" `+ X/ _+ C( _
paramSet.bCntReload = PING_PONG_BCNT;
' ^- M9 j4 u( h7 D/ X# C; ~! Z9 P% F
* Z1 O3 `- r) C0 J3 \, y4 ]- C
/* Src in constant mode Dest in INCR modes */
4 i) L6 q5 ~3 P0 F: O! A1 L# p
paramSet.opt &= 0xFFFFFFFDu;
3 w, y( \$ V" l
//paramSet.opt &= 0xFFFFFFFCu;
/ ^0 F1 L2 V9 W3 Z* \7 J0 M
# ^ H% h7 B5 l* Y% m' |
/* Program the TCC */
" ?* `6 H4 ?* ]' L! o' o+ Q
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
& w8 |$ y. v2 @
2 O6 J! {, T( J: m8 F. B
/* Enable Intermediate & Final transfer completion interrupt */
5 ]1 F2 M. O8 f+ D! o v- }
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
/ c1 T3 Z: ~6 w8 A, o3 g
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
& Y3 q4 C2 R/ Q+ r5 P6 o
: b3 c+ t9 d3 K* o, @: Z8 o( H
/* AB Sync Transfer Mode */
! l$ ?$ b/ Y, ?* R4 [& V* H
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
7 t; A6 |7 Q1 y& y* w
# S- {3 l( e) ~) K* ~0 R" p. g# D) }
/* Program the source and dest addresses for master DMA channel */
3 W( {7 [# k% V' V# M
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
0 u, Y7 Y1 B( l7 P y. g" @. c1 c* s& ?
paramSet.destAddr = (uint32_t)(ping_buffer);
?& [+ d8 @; y/ Y
}$ o$ o& ]" V/ S
/* Write to the master DMA channel first. */
$ g% @: l0 Z* y! v- w! D
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
6 U$ g$ n0 U( |5 o
}
/ d6 Z/ z. H* ` @* T1 @, U
& U7 a+ H9 W" w7 E" B. C5 a
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
7 S# j/ v& I R, b* a( m7 v& ^- S2 }
6 K9 N' \& K1 _: x
if(result == EDMA3_DRV_SOK)
/ H( O. s, R6 {
{
, q1 c6 u2 l0 Y4 [
print2arm("edma3 driver init success.",0);
( j# j1 a% e2 k) W" z1 c+ Y
}
, x4 P0 n3 k. m& n
}
' ]% v, Q. ^! [& y& n
6 d/ O4 y* B. S" e
+ _7 t7 p7 K! L$ W0 R/ Q/ X
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
) v9 @8 k- x* ]( t. Z' J
, l: ]6 e+ P1 E* {5 ^8 T
5 f" {" ^' y: e1 t, U7 @
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
( ]2 L p8 R! T+ R9 m
每次DMA传输完成后都要再次使能传输
& p, c: c+ i/ l S+ H# Z
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4