嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
, l2 ~, @$ J2 J( r3 I4 a! S% Y; R
#define PING_PONG_ACNT 1
( x1 J* K/ j3 r4 D1 d4 C+ {
#define PING_PONG_BCNT 8*32*40
: r i: {* F: b. k
//#define PING_PONG_BCNT 1
) Q: j9 R- x. }0 _0 r
#define PING_PONG_CCNT 1
+ {! @3 k2 L: d4 U2 _7 b' K
#define MCASP_BASEADDR 0x01D00000
+ h5 y. f4 H8 y0 C9 l; ?. Y! Q8 y
#define Mcasp_RXEVENTQUE (0u)
6 _# \! C& D: z0 I' D7 T
& Q7 y. a+ U; l& R1 [
/* OPT Field specific defines */
/ |" F# J6 N* M7 X/ n
#define OPT_SYNCDIM_SHIFT (0x00000002u)
' j: w; n2 |3 G1 J
#define OPT_TCC_MASK (0x0003F000u)
1 q) \7 c+ A+ }8 h* ]
#define OPT_TCC_SHIFT (0x0000000Cu)
' H5 Z+ S8 R6 b* m* w9 g" h4 ^
#define OPT_ITCINTEN_SHIFT (0x00000015u)
% j5 |5 R+ y% g" G: C# ?
#define OPT_TCINTEN_SHIFT (0x00000014u)
$ ^, h M% E" ]/ P* r
( |: n, h* I6 @% j) S- \8 B
char ping_buffer[PING_PONG_BCNT];
- W9 N' b9 r" i
char pong_buffer[PING_PONG_BCNT];
N4 V& O* M* ~6 ~) t
! N$ S: `& V. T: l
4 n) c6 o7 R+ ?0 X8 a. ~' ~# Y5 ?
1 e* a, X$ p% b# P
8 f2 v7 S6 t$ [5 E5 ] x' b
static void ys_edma3_init()
, A2 Y6 {9 z- K, v" ]
{
7 K* c+ |+ O6 {1 T# o2 R- r( s
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
% M; c" O, n5 l* f0 J0 q% C0 R
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
$ k: s0 u- w3 O8 F% p
EDMA3_DRV_Handle hEdma;
6 d7 }: v/ P' S7 U" a! W
uint32_t chId = 0;
m( Z* Q' b. S0 a, v1 U
uint32_t tcc = 0;
8 J, X" K4 A4 L" l
# D _, `" B4 U' [# _4 x0 i( u
print2arm("edma3 driver init...",0);
9 c6 D/ d6 p; r
+ U- w: |" l0 ^! V$ r5 ? U
hEdma = edma3init(0,&result);
$ p$ b6 ]/ X- u6 d% Z$ G
if(hEdma)
+ r- I) K2 X8 t5 P' w+ _* J
{
/ K9 B2 n" ^- e
print2arm("edma3init() Passed.",0);
' |: x3 F P, l% W6 b$ U9 _
}
3 z( S" p; j4 e/ U2 c( I
else
. g7 k1 Z6 W; L* C0 ]* a
{
6 h# r a+ d1 }
print2arm("edma3init() Failed.",0);
6 ?$ d \8 ^; {" A) d
}
/ H, j3 _, V# C9 {. n
6 t6 h: I+ n7 C! s, R
if (result == EDMA3_DRV_SOK)
: |6 q3 D+ n* q* I1 u
{
( z& H- w- m5 W' P1 m, ?3 `
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
3 c; d; `8 F. Q& ?0 O" ?) ^/ _
(EDMA3_RM_EventQueue)0,
2 E1 v. r9 R! N8 y9 v# c
&edma3_isr, NULL);
5 h" r9 X6 i9 B% Q: ]- n/ [, }
}
7 s2 h4 O5 Z S
8 \* ?) p+ y1 @3 V
if(result == EDMA3_DRV_SOK)
g. N- K* a* k8 a4 D
{
5 ~4 d8 ]2 o# f2 j D' A
paramSet.srcBIdx = 0;
: O) P% @2 c3 L W* m. @ |
paramSet.destBIdx = 1;
% K [9 F$ l7 [ p
paramSet.srcCIdx = 0;
4 n4 w2 ?) @9 ^% z/ X
paramSet.destCIdx = 0;
, d$ l. e4 r% j z4 c( x
paramSet.aCnt = PING_PONG_ACNT;
8 V; H. e+ K. J
paramSet.bCnt = PING_PONG_BCNT;
* m' y) K# y" f4 {; z7 T
paramSet.cCnt = PING_PONG_CCNT;
- x. \5 l& x P) j1 q$ l
- d8 y+ r* N) c( `
/* For AB-synchronized transfers, BCNTRLD is not used. */
& D5 p0 L$ w' d! s
paramSet.bCntReload = PING_PONG_BCNT;
J K j" z F, j
0 _8 Q0 g+ @1 @8 X) v/ z5 o
/* Src in constant mode Dest in INCR modes */
5 S% ^. A! t; L3 @) r- t8 M0 h
paramSet.opt &= 0xFFFFFFFDu;
Q! d7 ^$ \/ H
//paramSet.opt &= 0xFFFFFFFCu;
S0 g/ @1 \7 C/ ^2 S5 M9 k; c
% O( S. Z- L1 b. H9 x
/* Program the TCC */
3 C. S$ ]" L) @
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
4 T' `! I$ B3 i ?
& x$ O6 M1 h, {, H' `8 H
/* Enable Intermediate & Final transfer completion interrupt */
& @' \ G! q8 m+ V
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
1 P% e5 P; a4 E5 R- A4 ~9 U
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
5 M" r! q8 G- v! l
. T& N7 d Y7 P) F9 w8 {5 `
/* AB Sync Transfer Mode */
" P, X! l! W! H, {. H3 z$ s; [
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
% j/ J9 Y4 a/ \( _0 w
* P1 U7 k# z8 _
/* Program the source and dest addresses for master DMA channel */
( Z! ?$ Z q+ T" G$ N
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
# k& Q. h1 W6 J& `- [4 i1 ~
paramSet.destAddr = (uint32_t)(ping_buffer);
4 C% ]# r. W0 y
" Q; c8 v% B7 t e! O5 ?
/* Write to the master DMA channel first. */
A3 L a+ l( j8 r- o4 @- x2 n
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
2 ]; H" C. n5 E
}
7 C9 S+ V# O3 H6 e8 Y2 ?8 l
- b4 ?8 E5 i/ C9 K( T+ O# }
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
- S. D$ ~+ P- F1 _* [
& z7 ^) U- r) H% @: z
if(result == EDMA3_DRV_SOK)
}8 K7 B2 L" A+ H) C! E2 T
{
2 c# ~& c2 l- \1 N3 [
print2arm("edma3 driver init success.",0);
+ L# E5 I9 f' [1 u
}
( y. f, G# Z, _. x7 F" n
}
9 ^6 ?( E' \0 a
, m4 [' n2 m2 C( S3 \
& n! o6 M. @; K8 T/ `/ f. f- {
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
9 r" N; I2 B7 G% y# a. }
% M5 r. L; C/ I2 f: O
6 Y% f+ c9 V; `" F- _' H
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
' }* w2 [% f$ p- a; U1 S! Y6 |
每次DMA传输完成后都要再次使能传输
, A6 A. e9 d8 i) h/ S0 d4 O
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4