嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
! P( t7 ], V F. O2 ?2 N
#define PING_PONG_ACNT 1
1 Q& u' U# h& S9 T0 T
#define PING_PONG_BCNT 8*32*40
% f9 C* p- A" P: _4 c
//#define PING_PONG_BCNT 1
& n. ?7 A4 k, U1 G9 [% H* \
#define PING_PONG_CCNT 1
4 g8 |0 c- I+ p% k; v* S1 f% @
#define MCASP_BASEADDR 0x01D00000
; a7 f# D5 x# G7 l
#define Mcasp_RXEVENTQUE (0u)
: A7 f: Z- w9 T: Y' ]
6 X! x* P& v7 l
/* OPT Field specific defines */
( c( T6 I* }; \0 o* e, h
#define OPT_SYNCDIM_SHIFT (0x00000002u)
+ c9 b& s/ {2 I4 Q6 @
#define OPT_TCC_MASK (0x0003F000u)
( Z8 T: P2 O7 A& B2 U X8 g
#define OPT_TCC_SHIFT (0x0000000Cu)
+ C- D, F/ @5 l
#define OPT_ITCINTEN_SHIFT (0x00000015u)
# g: {' J8 {3 l* `; H
#define OPT_TCINTEN_SHIFT (0x00000014u)
; U R& W* H, J3 L1 x
5 k2 x! u! x4 k# l7 X
char ping_buffer[PING_PONG_BCNT];
+ g" N4 l9 W+ t
char pong_buffer[PING_PONG_BCNT];
( Y0 t5 C6 o5 d
8 Z7 u1 Z+ `; v1 o' f" F
2 [4 L1 Z9 e- E+ z, L
! G3 \& G ^8 K8 }* i: r
* E( T9 E1 i4 E( o; G
static void ys_edma3_init()
* c* ^) ~! f4 W" |8 g
{
* t$ o. c! f/ W2 y
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
0 X# T$ E+ O& }) W$ r
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
/ F0 N; [1 k* _ J! D
EDMA3_DRV_Handle hEdma;
' \" V: v4 K1 Q; d9 _
uint32_t chId = 0;
Q! v, Y8 P- \5 L% _' C
uint32_t tcc = 0;
+ P" |2 g q: T6 A: U! `
: t' X3 L/ U: h. o0 q
print2arm("edma3 driver init...",0);
4 D! P0 Q* X" Z* h) y* K+ o$ D
|3 O$ \2 D; @
hEdma = edma3init(0,&result);
, [+ x% ^4 n4 g+ t C$ t- K' L0 y7 ]
if(hEdma)
+ B; ]) C, H1 Q/ F X+ ?
{
+ c; E0 `" R; o8 T: ], V" }
print2arm("edma3init() Passed.",0);
* n* Y2 |( ~5 d) L3 c
}
; j( S( L3 e3 A* @
else
* N. n! S7 N. A# i6 A0 Y" |1 b
{
2 E( g# f" O; Z
print2arm("edma3init() Failed.",0);
8 j: y: T9 G4 A/ z$ k
}
9 m! |6 L' G" g( m3 Q7 i
/ Z+ I1 a' L% d# Q% @( K/ Q6 L2 z. {
if (result == EDMA3_DRV_SOK)
+ a" D6 }3 j# J: R: O
{
2 r! I1 x$ g; J* H0 E& O
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
1 {; W; J' e8 _) N/ u' M
(EDMA3_RM_EventQueue)0,
. J6 ]; A9 S/ b
&edma3_isr, NULL);
3 I/ U" L, L( K, U
}
" l7 V+ p- [3 w# g( E7 K
6 [$ N$ V& F" }$ A6 \; F
if(result == EDMA3_DRV_SOK)
2 ]4 X) T/ b, r6 o3 \
{
8 I s/ V* e X( e6 U9 b
paramSet.srcBIdx = 0;
# D$ z4 U: ^' X" n) P
paramSet.destBIdx = 1;
. Z; p( y) a/ }
paramSet.srcCIdx = 0;
* s' ]; M+ h, ~2 F& u) {
paramSet.destCIdx = 0;
" m' g- P9 g) F$ K- m, K% ~& u, F: w
paramSet.aCnt = PING_PONG_ACNT;
d, l" }3 s5 C+ h z! D) t/ \, [
paramSet.bCnt = PING_PONG_BCNT;
) u$ \: Y2 L+ m0 A9 n1 d0 ~
paramSet.cCnt = PING_PONG_CCNT;
/ U3 D$ x$ J9 d4 R7 J+ g
+ n! e" \% u9 \# D5 F
/* For AB-synchronized transfers, BCNTRLD is not used. */
# m; I$ Y5 `% [, @, F
paramSet.bCntReload = PING_PONG_BCNT;
' ?7 ^- n: X, H( T6 y* z, T
, W1 U9 R( B0 Z. I# \( \' E* z
/* Src in constant mode Dest in INCR modes */
9 a7 y% k# t# f/ x: ^# X
paramSet.opt &= 0xFFFFFFFDu;
( v& C* z2 J7 O- k, I/ {; Y5 B
//paramSet.opt &= 0xFFFFFFFCu;
, F; ^$ H6 [7 ]" y$ a6 U y1 |( H! s4 M
. B# t& B1 x( ^4 Y: h
/* Program the TCC */
# E! n$ @2 ] o
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
& i3 A' S( n7 |8 {" d# |$ u
8 y3 Q7 ]3 u! L5 g# G
/* Enable Intermediate & Final transfer completion interrupt */
' H0 l* K+ ~+ K* j+ K. u
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
4 N7 ^4 k. W& o3 [
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
0 Y& l+ m- Y) C
/ J$ c( t& M9 b8 J
/* AB Sync Transfer Mode */
3 h q" X8 J. m6 ~: s5 L
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
0 r% y- c( h2 W+ Y
2 ~- W, `- x" s" C" S- ]& E
/* Program the source and dest addresses for master DMA channel */
3 R3 o" H7 s, M# V0 m$ n& a
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
2 p1 t% C5 w8 { E
paramSet.destAddr = (uint32_t)(ping_buffer);
0 H) w, m* {; u7 j1 D( T
1 ~5 B' o* ~7 S9 M& {6 W! T0 s) e
/* Write to the master DMA channel first. */
6 m l$ J8 A- F* B
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
, c: T# v6 N8 q/ D/ O1 q
}
2 E5 Q3 A! R3 u# c) f9 P( F1 g
) W+ V. z. |+ A G) @! n+ u
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
4 y1 {! S5 o4 Z& ^! j, J0 ~% r
" S/ j! r/ P' {. C/ s
if(result == EDMA3_DRV_SOK)
- Y0 Q3 l' K1 [# q
{
0 S, Y: @% g8 E, @" s' E9 q+ d8 @# d
print2arm("edma3 driver init success.",0);
" F6 X: O, i& e8 E' s% o
}
' K, X8 e) X: R5 T4 p! ^
}
& d3 G# l, Z7 T2 I8 @3 f: j
4 J0 ] ~+ d2 f9 p
: O; F# t; Y2 Z2 y
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
! ^5 y4 f+ D, _& C+ }0 o" Z" g
/ f3 A% q. e2 \1 F @' H
4 e6 c5 `5 t, z6 R) i
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
# ]7 d9 O$ `6 s- G, z8 ~
每次DMA传输完成后都要再次使能传输
4 z' }& j- p6 c& t6 ?' ?
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4