嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
- {$ O/ E4 c6 y8 ]. O9 c, ?: {
#define PING_PONG_ACNT 1
6 U$ t* y: w3 C, l, z! R5 X7 }
#define PING_PONG_BCNT 8*32*40
: _8 Q0 {7 b& l. u% X2 k y- n' d4 w
//#define PING_PONG_BCNT 1
2 s( H5 g9 P9 U# K
#define PING_PONG_CCNT 1
+ B, S' q. |9 l; C: s
#define MCASP_BASEADDR 0x01D00000
1 N- j1 Y. R7 p
#define Mcasp_RXEVENTQUE (0u)
7 Z4 c* J I$ i
& O/ x6 t! Z9 ~, S& q1 ]) Y7 Y! Q
/* OPT Field specific defines */
" B/ ^ _8 z( h. t1 f. B6 A, P* y7 z7 I
#define OPT_SYNCDIM_SHIFT (0x00000002u)
0 U# F, V* z9 u6 a
#define OPT_TCC_MASK (0x0003F000u)
$ l& D! k; C2 N7 r9 ]
#define OPT_TCC_SHIFT (0x0000000Cu)
2 ^4 _1 i$ E5 i5 M4 o1 a
#define OPT_ITCINTEN_SHIFT (0x00000015u)
/ B2 e+ n% T; y" q! H8 W( G$ }
#define OPT_TCINTEN_SHIFT (0x00000014u)
$ S* f" E4 G6 i& g: A
" R K a9 k' d6 a5 N( w
char ping_buffer[PING_PONG_BCNT];
; \4 m& H- r* L% k" K
char pong_buffer[PING_PONG_BCNT];
# p' Q& |& h* r' {" Y
0 j4 r0 I( C1 o9 P/ k* R
* X8 Z8 Q4 G6 S' Y( ~& ~4 E0 D
- k6 g/ F1 T& W+ d
: Y8 h# g- z' e9 {4 \ E+ @2 g j8 ^
static void ys_edma3_init()
% J, m- S, K: I* D
{
8 ?. h' I& Z$ M/ {5 y; A3 ~
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
1 }4 k, z# s+ _
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
j5 |7 z, p( G% k* G7 t1 [
EDMA3_DRV_Handle hEdma;
* `9 a/ c. U( G; j! p) Y
uint32_t chId = 0;
2 h* v" ^# Y8 ^. m0 y8 R+ X: b
uint32_t tcc = 0;
' m+ P; X, V' u, U5 c: i& ?( }) ~, |
' d6 [; q/ G8 G
print2arm("edma3 driver init...",0);
3 _- \% n; e* O
7 [+ O0 \. x; G9 m
hEdma = edma3init(0,&result);
0 @' w8 t% b, ~1 m' b9 O1 n# @( i |
if(hEdma)
# Z; A# w* E" O% X( ~
{
' X# G8 _) l" \
print2arm("edma3init() Passed.",0);
) _, j( k7 t% J
}
~, y( z. E- G: z, J
else
- P# t/ J, z# n7 `) S
{
/ K) `8 M u, \* p; `8 J: W+ Z
print2arm("edma3init() Failed.",0);
* e( U$ j0 e) f2 I
}
" N; t+ O) U9 t- _' J; R
" l- h5 J8 E0 K' j- |. O# o
if (result == EDMA3_DRV_SOK)
0 i$ ~' W7 i6 v) I0 `- X7 i
{
# s* Q( }/ b( w1 @( e* {8 e
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
) b' D' Y# k. F% e7 A1 y4 F
(EDMA3_RM_EventQueue)0,
" K4 L! ?! g3 M% _' x
&edma3_isr, NULL);
6 v! `7 I5 T, h/ q- B4 W3 _
}
) ~! u1 E* O- C0 F
: ]. @' G6 T8 p! ?" ~. f
if(result == EDMA3_DRV_SOK)
- W6 u' d: w! B3 o, c
{
& N `8 f3 Y8 Q$ m. _8 S
paramSet.srcBIdx = 0;
6 N7 r8 c! P5 B) h6 @
paramSet.destBIdx = 1;
& I+ y3 j- u6 _$ Z: K: l1 K
paramSet.srcCIdx = 0;
# ?/ P5 m0 K' T: N0 u) a8 W5 c# u
paramSet.destCIdx = 0;
" T9 J2 ^! H" k9 x& J$ H' a) h
paramSet.aCnt = PING_PONG_ACNT;
1 W+ ~, N5 @# I7 K
paramSet.bCnt = PING_PONG_BCNT;
6 w% A0 l9 G. D! @+ V9 L
paramSet.cCnt = PING_PONG_CCNT;
+ T5 i; l2 F3 L! q3 j; X* @! h- u
( k* v+ a! F+ n5 z
/* For AB-synchronized transfers, BCNTRLD is not used. */
* i) S+ K& F2 l8 Q8 x
paramSet.bCntReload = PING_PONG_BCNT;
6 r! a. n3 ]* @9 f7 @7 }% b8 v9 S, w
5 V& H( O8 x" @, v8 F* {, s j
/* Src in constant mode Dest in INCR modes */
3 _: {$ m/ h3 q! ]6 O" W- d7 \/ `
paramSet.opt &= 0xFFFFFFFDu;
& N$ O6 a4 |* H" \
//paramSet.opt &= 0xFFFFFFFCu;
6 d; B6 _3 j5 l6 `' B6 i
: A' {9 i- @( q9 t# T' d# |
/* Program the TCC */
& y# r, X% n' D- y2 I6 s4 S# b: ^* n
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
2 Y+ s' O4 O: Y
$ K' e' \$ _: m. q
/* Enable Intermediate & Final transfer completion interrupt */
) K3 A- V5 Y/ ~( E+ p/ S/ \; i8 N- I
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
, g# x' u {: `; R" e' _
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
4 n: R, s# a2 u# `0 M: x/ {
/ N* b* d3 R( k# M# m+ I# _
/* AB Sync Transfer Mode */
* C: ^; C! b2 R. Z% k. \
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
, T# G: ]$ D- S# ^ D
+ r- e g @, D2 O) s0 X, J; E
/* Program the source and dest addresses for master DMA channel */
& h* O; V V) P+ J( c
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
0 g X! k l% a6 W) f
paramSet.destAddr = (uint32_t)(ping_buffer);
! O3 }1 ?8 s9 z4 o: l) W% {
! B+ f3 l+ W) Z- ?3 M
/* Write to the master DMA channel first. */
2 X. s f! ~9 y! q
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
+ _7 }, k2 B: F5 L# Z
}
) r& Q7 A4 F3 f5 L5 f
* I2 r; R: K$ b9 M! z9 I& `
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
5 s9 p* X: O3 o; F6 T
3 Z1 ]% g9 S7 w. s
if(result == EDMA3_DRV_SOK)
, [& l' G- V3 ?/ n
{
4 D% k5 a9 B2 ~' h, S7 `6 H; g9 y3 U
print2arm("edma3 driver init success.",0);
$ d/ ~/ `9 c6 \: E$ \$ \
}
( |5 w- Z7 R, A7 M
}
$ X( }+ g; L( N$ |) c
7 P2 q1 e$ }8 @* k! D: y, `
6 R4 o( s( q4 H' W
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
- @4 A! S1 C; D2 g. J+ h
6 H9 ?5 f1 Z \" r |" Q% t1 H$ O
4 R! p( g& x8 e0 B! E5 c$ |# f
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
- F3 f w% M! e
每次DMA传输完成后都要再次使能传输
f4 k2 d/ E: }. E& R2 \- N& k
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4