嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
. \! r# p4 b0 a9 O7 X% A
#define PING_PONG_ACNT 1
! t3 |- C& {2 b, V x
#define PING_PONG_BCNT 8*32*40
) `& |9 g& P( ]
//#define PING_PONG_BCNT 1
3 K6 f: E R, h# w
#define PING_PONG_CCNT 1
m. ?+ T/ {' j6 b P8 ~+ R R
#define MCASP_BASEADDR 0x01D00000
0 Y9 Y( u9 L9 B( m
#define Mcasp_RXEVENTQUE (0u)
$ c S1 y' k* Z, R7 F
- R% g# R e3 c1 a) c
/* OPT Field specific defines */
* ^3 z9 N1 b& X1 U# D F
#define OPT_SYNCDIM_SHIFT (0x00000002u)
- i( m1 e: W6 p$ i% }
#define OPT_TCC_MASK (0x0003F000u)
q1 i7 x; b! T# I( ?
#define OPT_TCC_SHIFT (0x0000000Cu)
" Q/ Y1 n* [- ?- k0 h) k
#define OPT_ITCINTEN_SHIFT (0x00000015u)
3 v2 H2 x" u- P( V) s8 S9 x
#define OPT_TCINTEN_SHIFT (0x00000014u)
+ j3 e* I$ V$ v$ {; f
% i# ?9 D: R! n
char ping_buffer[PING_PONG_BCNT];
% K' D9 L7 v. @3 I
char pong_buffer[PING_PONG_BCNT];
S* m0 G' o5 \& k( q) \
$ c3 O! o" J- f0 @/ E; h
/ b! H6 @! a! i' b0 n
* U' Z, X3 B1 U, R V
# [; D! _/ S1 K G
static void ys_edma3_init()
8 f. B: O9 m& y
{
6 M/ ]. y7 o7 B! s$ y- U
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
# P) f8 s0 E: G* s$ y0 _) N' U
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
1 d9 J2 r2 ?1 W8 V6 H
EDMA3_DRV_Handle hEdma;
2 }7 b* j+ P+ y0 h0 Y! A# K* [3 i5 T( ?
uint32_t chId = 0;
6 X7 z: o6 g' ?6 Q2 x6 f/ X
uint32_t tcc = 0;
0 {4 {+ p5 h3 R8 {2 F
. P0 M( K9 f8 Y, I, y
print2arm("edma3 driver init...",0);
$ a* h' g4 ?8 s- C$ g! S! a' P
" G4 @6 D$ g8 f6 U. O. {2 P. c* N. Q
hEdma = edma3init(0,&result);
9 a7 p( D/ }3 J2 p5 u0 M. X5 e
if(hEdma)
- ]+ u8 g2 F0 E+ D# L t Q
{
- E# p" [6 D# Z5 P' S1 S) `
print2arm("edma3init() Passed.",0);
2 K1 C. x y0 I% X& ^
}
5 [% }$ F+ i. Y) W! _+ k8 X% }
else
8 L1 c/ D- A* E7 L
{
8 I; e/ ]% s* ]. x3 x: l
print2arm("edma3init() Failed.",0);
: A6 l& A8 |( ]/ y1 F7 C3 N
}
; r; T4 A* J* F# Q) X$ Q$ C! {
) b; ~9 M) _8 X
if (result == EDMA3_DRV_SOK)
% X2 `0 t* p6 t; d ^3 ] s
{
3 _1 H! A& o. u7 G1 r
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
& Y# ]/ X) @. h& x
(EDMA3_RM_EventQueue)0,
/ y* x% m5 V( y* g7 A x
&edma3_isr, NULL);
N8 z( \4 U$ p1 C ]8 F+ m
}
, O2 r. r& [5 }
. \: U# x" I4 m0 c6 A/ F7 W* B
if(result == EDMA3_DRV_SOK)
) f0 O4 Z1 ]2 L, f( _7 M: R! U' X
{
" g* x( Z# {8 ~
paramSet.srcBIdx = 0;
% A- c V( f0 J4 g1 |3 L8 n& w+ t
paramSet.destBIdx = 1;
' M, p) [' Z) Q7 n! q. c' I
paramSet.srcCIdx = 0;
+ ~$ k" J9 x# U% b# b) z
paramSet.destCIdx = 0;
; S2 k/ D/ t% c0 X
paramSet.aCnt = PING_PONG_ACNT;
& g7 @+ t; b, H, Y1 ^3 O1 a: E
paramSet.bCnt = PING_PONG_BCNT;
6 _* x. F" m. |2 {
paramSet.cCnt = PING_PONG_CCNT;
c8 _) w# m/ O$ Z; r: L4 r
5 T/ t- P! Z" Z; _' a) ?1 n3 ?
/* For AB-synchronized transfers, BCNTRLD is not used. */
& Z+ v2 @9 }9 ?4 u1 l d8 {
paramSet.bCntReload = PING_PONG_BCNT;
0 G! V9 i% G; D' T1 S, ^
. U5 U7 ^+ y' a- w, Z& }
/* Src in constant mode Dest in INCR modes */
* E7 s: Y3 {8 W- ~ L4 o
paramSet.opt &= 0xFFFFFFFDu;
1 z* v5 {, O! p& l/ C: k
//paramSet.opt &= 0xFFFFFFFCu;
% |$ Z+ D& v T5 g, j- H. _
' k7 V2 c( G) Y" Y; N# C. ]4 F
/* Program the TCC */
7 N7 d, `% D& O& S
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
, ?7 ]$ N% x4 F1 c- l& |5 E
4 ^/ N: v, u3 E! M6 \# e
/* Enable Intermediate & Final transfer completion interrupt */
! g, S9 A& }5 |6 L& i0 j) n
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
: Q3 G& A6 A" t- g
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
( @3 o4 `! C N! C
( L& k" S- O/ z8 C& w
/* AB Sync Transfer Mode */
$ j/ ]! ^! ^6 D5 u. k }
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
: M9 a, W3 z' w$ h9 t
( g: E$ Y6 f1 E1 a7 X
/* Program the source and dest addresses for master DMA channel */
& d. r" M- s- A2 b+ {# ]7 H$ B. M
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
4 X% e. M1 T3 @9 _
paramSet.destAddr = (uint32_t)(ping_buffer);
1 U* p7 p6 T5 ^& e& F+ Z
( T9 c3 N/ T3 z" {! A" z- T6 h
/* Write to the master DMA channel first. */
3 d3 o8 X* ~& V& R$ N- I
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
, p3 w4 W/ H; C8 q0 K+ b
}
# t) i% I0 O3 B
. K$ h2 A# H! S3 d6 x
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
5 n7 H' f+ J# l4 i0 j9 H
8 O9 X- `6 E2 G2 \8 x: u) \
if(result == EDMA3_DRV_SOK)
+ l8 Q. _( `3 I2 U3 h* J$ Q
{
7 e K! R. h3 s# ~+ [- m
print2arm("edma3 driver init success.",0);
9 H$ q( s! w7 @; V3 O
}
+ H1 C0 ^; w* F2 @3 D- H
}
. W9 ]* A9 O$ y
2 s) m8 p6 b6 b5 y
) \' N7 m5 {7 q( |7 v i7 m( F
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
& j% n H' c( B4 n, Q r' O
, n$ Q/ n- Q+ a! f4 a* j
7 ^6 F5 @. a1 B- A" B% G( `
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
0 l; D; A- `' G) `. P& k
每次DMA传输完成后都要再次使能传输
& s: o( y- v* o, @8 l; B
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4