嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
2 Z2 K1 X* N# J, I& \
#define PING_PONG_ACNT 1
. {6 ~* X# M* t6 m4 c( U' b
#define PING_PONG_BCNT 8*32*40
+ F" F' Z/ ]; q7 Q9 A8 W" W
//#define PING_PONG_BCNT 1
# a) T8 r% n$ {
#define PING_PONG_CCNT 1
" L4 J% ?1 R; m% k% s+ \3 f4 U
#define MCASP_BASEADDR 0x01D00000
. g j& G; n& R" C9 \
#define Mcasp_RXEVENTQUE (0u)
" h- f" ]" F2 p
" g, W. N% N' |- \. X# I
/* OPT Field specific defines */
; [- j: z0 M3 ^! D
#define OPT_SYNCDIM_SHIFT (0x00000002u)
2 f+ j* A5 ?3 c, e% _
#define OPT_TCC_MASK (0x0003F000u)
- Z. ~/ S% G. ?$ H7 q7 ]) \2 m7 ~
#define OPT_TCC_SHIFT (0x0000000Cu)
0 M0 p6 \- J5 H
#define OPT_ITCINTEN_SHIFT (0x00000015u)
8 M' n7 i; L/ C5 s7 a9 W
#define OPT_TCINTEN_SHIFT (0x00000014u)
5 D2 }3 l5 a8 D: G
5 D( U) s a$ R5 Q# e# ^# N# b' a
char ping_buffer[PING_PONG_BCNT];
- y: m7 o7 n, G2 ?
char pong_buffer[PING_PONG_BCNT];
& x8 o6 A8 v2 D% y, M
. ], K" D8 }6 U+ \
" [$ H# b6 A$ W# x! @
* {" B: W$ @- Z+ ~: y! q
$ D) E% e! W" h5 j
static void ys_edma3_init()
* t8 L$ B: p8 }
{
`7 N4 ?( G3 E: z" a
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
/ W# E7 X* {( V
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
# F2 l. v: A. u0 J& S
EDMA3_DRV_Handle hEdma;
! U6 a, `* S& E4 r' c) f# n5 T2 y
uint32_t chId = 0;
7 E8 l4 M6 ] G$ k6 I4 D
uint32_t tcc = 0;
! ~: Z7 M3 P+ H
9 P. u4 E' l* K- n& V5 Y
print2arm("edma3 driver init...",0);
3 ]: p# n# s Y# Z
: D; @* j U. n" L7 R9 q2 v
hEdma = edma3init(0,&result);
9 I, s: E) O9 F1 R+ p' p( N
if(hEdma)
* X$ p- y- r+ t- A( ?' X t; u
{
% `$ C: ?& H, o
print2arm("edma3init() Passed.",0);
0 U7 L: d6 t- A$ W2 w
}
T* @( b3 W' a; G2 g
else
0 a3 i+ N5 Y* t" }7 N
{
. R h/ u( R# K
print2arm("edma3init() Failed.",0);
2 X7 k. `+ y G, P$ c9 R
}
- {3 k5 d3 C0 e5 ?2 r" t7 P
5 T+ C+ Z2 Q) Y# J
if (result == EDMA3_DRV_SOK)
/ ^0 ^$ f2 F) B& h0 A: |4 {7 k: ]& w
{
+ q1 ~0 I' O5 I
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
. x( }# J: `. x6 \6 p
(EDMA3_RM_EventQueue)0,
2 n* k- k; E( r9 n! ]$ r
&edma3_isr, NULL);
/ ]. G! `, b, W* Y( S! J* p4 `: i
}
9 ]) |5 M7 T3 U% O4 @# F# [. e; `& ]
6 D% M+ r0 B1 c0 K9 P0 q+ u9 s
if(result == EDMA3_DRV_SOK)
' l- `+ U* O4 H- O2 _- o
{
: M: ^5 v* c! `" T" ]1 w
paramSet.srcBIdx = 0;
8 I" l5 X c4 t
paramSet.destBIdx = 1;
7 Y) N; j. d1 K$ Z Q9 J* T! K
paramSet.srcCIdx = 0;
3 y2 q P6 a8 Q. y7 `5 d5 n8 Z! V
paramSet.destCIdx = 0;
# o, F1 e3 s" U3 A3 S' L' g: E0 G: U
paramSet.aCnt = PING_PONG_ACNT;
& v0 ~: f+ w6 _5 B
paramSet.bCnt = PING_PONG_BCNT;
5 j4 F9 s- L0 h0 R
paramSet.cCnt = PING_PONG_CCNT;
) H6 }# O7 E; ?/ p
5 @# H8 k: [0 v {- z3 I) V
/* For AB-synchronized transfers, BCNTRLD is not used. */
0 Q* P& h6 ^ ^
paramSet.bCntReload = PING_PONG_BCNT;
, J& W7 S7 u# `# e2 d
M5 y2 Q$ r& ~* U$ m& ]! Y
/* Src in constant mode Dest in INCR modes */
) G F$ X I7 c ~1 b! O* Z* ]
paramSet.opt &= 0xFFFFFFFDu;
9 z/ J' w" ?1 m8 Y, G0 |5 B/ C9 P
//paramSet.opt &= 0xFFFFFFFCu;
3 U$ [2 E& `7 X/ n4 E
?# Z' P% @; j5 O* @2 \3 ~, p
/* Program the TCC */
5 s+ X) g- A' X/ o( `2 g
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
2 X/ }! k1 B$ D# _
: L9 [/ X9 Y( P. I8 }7 ^8 L
/* Enable Intermediate & Final transfer completion interrupt */
8 r8 R8 r. [! `4 c; m6 O1 c
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
0 C/ Y' N7 S3 _5 b6 u
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
4 H. J( C f8 {
9 |( m2 h+ C) b- L1 h! O7 u
/* AB Sync Transfer Mode */
# W( b3 \6 a3 N5 V! I; ?' z
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
, N: h% r2 S% X
* m* v7 y' Q; B' J# i' W5 k2 T9 \* v
/* Program the source and dest addresses for master DMA channel */
5 C( N: ?$ R% U4 ^
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
4 h6 X) _0 N R0 A7 F3 ~3 J+ q
paramSet.destAddr = (uint32_t)(ping_buffer);
" d% l6 V$ k4 `2 y8 |
g, R# l4 X, @
/* Write to the master DMA channel first. */
2 g# c E1 j( @# @/ w
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
, P2 M5 I# @" S7 A9 R" ?
}
$ j2 z: N6 b* V) U* r# X/ W
8 f0 N$ O/ S K; @: z* N# P0 \
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
* u5 B4 t6 ]2 f3 f6 O' D3 A/ q
& m% d. f) L7 U# c; g
if(result == EDMA3_DRV_SOK)
! h7 j, ]& F# J- a R. t& y
{
5 D9 v; Z2 ?4 n) E* L
print2arm("edma3 driver init success.",0);
. U# t" c4 T; J' ^. a5 N! D
}
, S2 j, N, Z1 u9 i
}
' ]0 w3 W9 m* A$ v; k/ b% [. N
1 o, a' C4 y( }' T( j
+ v" d# a/ i. E& z+ k' Q& I, Y
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
2 h3 L7 {0 d5 E0 F5 u
n5 h3 f+ R% Y! q2 v5 s1 X, j6 N
8 O, R' W% F, _7 }, P
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
, Z, H, U0 _% w6 y+ x4 L
每次DMA传输完成后都要再次使能传输
! ~! q8 ]% u, F' q. C6 }
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4