嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
, V" p* R+ h4 b) Q% b" [
#define PING_PONG_ACNT 1
: d7 ?1 o3 K% ^0 n$ |
#define PING_PONG_BCNT 8*32*40
1 S( W% \5 G6 W% ^5 R
//#define PING_PONG_BCNT 1
2 Z/ V- ?% s; A5 o% Z# i" ~/ Q" `/ O
#define PING_PONG_CCNT 1
6 u& P' R3 q6 J9 o# \
#define MCASP_BASEADDR 0x01D00000
, p$ U6 L9 U, a# g. x2 }
#define Mcasp_RXEVENTQUE (0u)
* r6 T5 n( F9 r0 E
, f# t9 g5 V; d" P- K
/* OPT Field specific defines */
9 D3 v! p$ T* w8 n6 t/ W; ] d
#define OPT_SYNCDIM_SHIFT (0x00000002u)
3 l9 z! ?$ _+ b4 S* g! u. R
#define OPT_TCC_MASK (0x0003F000u)
4 V ^7 k! a- |; W, f& i0 T% {) J* a
#define OPT_TCC_SHIFT (0x0000000Cu)
7 \/ K( M* v I3 g7 K$ W
#define OPT_ITCINTEN_SHIFT (0x00000015u)
; W, f6 D. S3 {9 x
#define OPT_TCINTEN_SHIFT (0x00000014u)
# ^0 l& \. a" B( Z, \* \) y
; a: |/ ~* B2 S. [
char ping_buffer[PING_PONG_BCNT];
% {) i" \0 D! }" @
char pong_buffer[PING_PONG_BCNT];
1 r# R* C& U4 k/ P( i, a$ J
: {! c. i# ?6 B
# c$ O* J2 q( Z6 ]. ]) M
5 g' l0 ~# _% R
. k1 K$ a# ]5 m
static void ys_edma3_init()
/ o6 R, f' C$ I
{
( ? f& c5 H& {& ^" v/ i
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
7 Q$ j. @. m& ^/ b. d: `) f
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
3 b, A% `* {) o. q* \: F
EDMA3_DRV_Handle hEdma;
8 N) ]7 F4 L Z n& _9 L) Y
uint32_t chId = 0;
6 {7 ?: R+ h% S/ u
uint32_t tcc = 0;
& i3 D- H7 }6 y4 h+ C( S6 O, o
8 X& z' a( F6 N" e+ R* p& s
print2arm("edma3 driver init...",0);
# a' b# e+ |8 q
; t. y& D2 O2 z% k5 i L6 G4 U* D% C
hEdma = edma3init(0,&result);
* U- L% v# } O: J" E
if(hEdma)
3 \; H. D% _: C& M
{
, A0 l8 N0 b9 S+ j' }$ w0 _
print2arm("edma3init() Passed.",0);
! [; r- J' \7 c# B s
}
3 ~' C9 Y- `" p
else
, j; D5 @/ q9 }' }) q/ c2 `
{
+ W4 E; E# r; ]% P9 t+ h) T7 L
print2arm("edma3init() Failed.",0);
2 b, B; n$ l3 L" O6 S! @8 M
}
; q7 p1 }; I" ~
" `, y- w( u7 {' P
if (result == EDMA3_DRV_SOK)
5 R1 g/ c8 q7 \4 X g8 e
{
! q+ I, Y5 g, l- F3 Z: P8 [) L
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
, }7 W+ C3 [9 |# k
(EDMA3_RM_EventQueue)0,
9 V4 l' {2 u& Q2 _# `$ C }: J3 L8 X
&edma3_isr, NULL);
4 G. ~1 u. ~" j6 Z0 Y" f
}
+ Q, r" D+ q- u& A
0 A. r: v0 ?/ G# m" ~- S* ^
if(result == EDMA3_DRV_SOK)
- d; c+ x) j3 P& c. D$ b
{
4 O- Z6 z, G$ s; k- M8 f6 Z
paramSet.srcBIdx = 0;
% d2 `, X# F7 R6 v' w5 p- b) ^
paramSet.destBIdx = 1;
+ m8 A4 U# Y* I6 i' E
paramSet.srcCIdx = 0;
3 {. m# @4 p9 b# B% b
paramSet.destCIdx = 0;
, F8 S* u0 o' D
paramSet.aCnt = PING_PONG_ACNT;
f' N3 E: g+ l
paramSet.bCnt = PING_PONG_BCNT;
, Q5 Z" v# H7 O1 t
paramSet.cCnt = PING_PONG_CCNT;
& I" Z# n, ]9 l) E
2 s" ~% X$ J' ]- A
/* For AB-synchronized transfers, BCNTRLD is not used. */
! {9 Y7 H' S0 e. W Q
paramSet.bCntReload = PING_PONG_BCNT;
6 I' E+ M: p' A: p
0 Q; \! ^. |" b4 Y
/* Src in constant mode Dest in INCR modes */
3 N: ]! U& L$ O6 o+ r
paramSet.opt &= 0xFFFFFFFDu;
! q9 C4 ^/ d0 Z: U# {
//paramSet.opt &= 0xFFFFFFFCu;
. t3 f% K, E! w# {8 M0 z
3 s! @: F ? _. o( I3 R
/* Program the TCC */
* C7 d+ o2 U2 `" N
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
0 u+ i0 u5 V: C$ }
% w; Q1 [$ Q$ \- h
/* Enable Intermediate & Final transfer completion interrupt */
) y3 L- a. H1 F* L4 q! N6 S7 q, \
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
9 D+ O! m+ w* y! ~: @
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
) w# _4 ~1 ^" T3 M
' g' W' N. b6 O1 y
/* AB Sync Transfer Mode */
! _( V& T9 y* e% F$ d$ w3 w2 Y9 T
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
5 Q6 V, Y: S* ]& U) D
! H" {( A# S# j6 u
/* Program the source and dest addresses for master DMA channel */
3 q+ W7 d! d" T1 V4 t9 a
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
9 X: l( O: J: \7 o; t
paramSet.destAddr = (uint32_t)(ping_buffer);
0 Z6 j. O# \; _+ @/ t
' U. s, P8 t3 B. C0 K
/* Write to the master DMA channel first. */
" j7 d a- d* p; t
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
' @( p& |9 |0 U( [7 v
}
/ s- }$ I1 T" ]. a C& I4 x" g
" V' `3 s+ X7 p) Z& K) r; b. ~2 H i
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
- x) H* T' }; K1 t* [9 m
1 p+ ]/ j n Z0 y& P
if(result == EDMA3_DRV_SOK)
, m, X' W7 r% S1 D% w$ e
{
9 N( {3 B* j. O2 m9 k- p% t1 D
print2arm("edma3 driver init success.",0);
' ^5 ]9 n1 N) l" N/ r
}
! q5 m. d0 s' X3 h+ j9 c
}
+ Y# P% e D' Z
J% l, m' A# ^3 ^
5 Y- a1 v/ q6 X. Z0 x6 p4 L
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
6 r$ @- i2 I- l
/ |2 o# `: ?& [* t7 d4 v' h! o
4 D" y. ^; o" h
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
* ^# i% y8 n* K% a1 b
每次DMA传输完成后都要再次使能传输
/ T ]8 D9 l6 g7 K) x* h' m4 P
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4