嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
7 o: i$ ]7 k9 ~
#define PING_PONG_ACNT 1
4 I& d2 X6 ~# N6 K; M( q& b
#define PING_PONG_BCNT 8*32*40
1 L3 E0 C. U R1 \% _! j* M4 A) I" \
//#define PING_PONG_BCNT 1
3 Y' E' o: D }
#define PING_PONG_CCNT 1
! M8 I& i; h1 a1 |& U9 ~" O
#define MCASP_BASEADDR 0x01D00000
# N% g7 X: |3 v. g9 b
#define Mcasp_RXEVENTQUE (0u)
8 a6 }9 t& F9 k, _. T4 Q( [
1 q7 O8 Y: { K L( T4 P
/* OPT Field specific defines */
0 O4 H7 w7 o' z6 e" g" ^
#define OPT_SYNCDIM_SHIFT (0x00000002u)
$ I# H& a! ^/ ^1 Z s2 c
#define OPT_TCC_MASK (0x0003F000u)
: K& B( F. K+ X3 l! C& g. ^
#define OPT_TCC_SHIFT (0x0000000Cu)
# }: f3 h% ?7 S+ a
#define OPT_ITCINTEN_SHIFT (0x00000015u)
U$ L( U7 ~9 Q0 D/ h' V: `
#define OPT_TCINTEN_SHIFT (0x00000014u)
3 r! u7 M! E5 q9 u. R" K
. B9 T, f5 P8 j' Z& c! |
char ping_buffer[PING_PONG_BCNT];
" T* h9 f* b* M
char pong_buffer[PING_PONG_BCNT];
2 ?3 z! J6 _1 Z* L. x
7 g) ?+ c' N2 v# P# b+ p; D- H
' n5 E) n% M4 k/ P- S
' ^. r& R6 x0 t" l2 C
# f; q: K) h" z6 B! [! `' |
static void ys_edma3_init()
& C/ l z( Q5 Y4 C1 o
{
; S7 L0 g$ a/ \9 J% {3 i
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
?9 ?* m5 M% B, M3 y* p
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
0 d( ^, D9 g9 G( p! Z
EDMA3_DRV_Handle hEdma;
- K; [" _) |' ?1 I2 `' H/ c
uint32_t chId = 0;
8 g# |( ]1 |9 G' {- o8 l
uint32_t tcc = 0;
8 x ?5 j8 V0 ?
* F6 ?( E2 ?& v5 V% W
print2arm("edma3 driver init...",0);
! z( g" Q3 L- }. b' D" X$ `
* I: Z- P* A7 n8 w* c# p# d: S" \& _
hEdma = edma3init(0,&result);
8 l0 S8 h h- S+ j" Q- Y& A
if(hEdma)
0 w8 P' {/ H6 n1 a- D! ?
{
6 p1 G/ U. r9 G; i; i: V+ ?
print2arm("edma3init() Passed.",0);
1 L3 x% p6 @ C4 @7 t% h/ w/ t$ y9 J
}
6 E7 F& k) z: y% y, x) G: @
else
1 A% h) j) P3 R! s" A
{
7 a' l/ {' A _( U
print2arm("edma3init() Failed.",0);
2 x+ O6 Z) p" {9 X
}
" _! o; o! `. g0 G+ z# L9 q" w0 O1 ?
5 @- k* Z2 Y- U3 m H' c* E$ W! h
if (result == EDMA3_DRV_SOK)
+ G! R- R: F/ Z* W: o0 o
{
* ?) Q0 J H! Z/ T
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
p& |* D- ~2 {: G
(EDMA3_RM_EventQueue)0,
2 b2 d' V- g9 r% S" r
&edma3_isr, NULL);
7 N5 x4 s+ ?# p! i! B
}
# V# Z2 V$ y. n) [
, T6 P3 J) O3 ?1 X2 t) a, G/ y
if(result == EDMA3_DRV_SOK)
" |- I6 T# u6 K/ ]
{
' O; s* ~" t9 ~3 r# L9 c
paramSet.srcBIdx = 0;
1 D/ E+ C+ p& z# P r3 x/ F; N
paramSet.destBIdx = 1;
* `/ E+ V& K/ W: l% `# P. j
paramSet.srcCIdx = 0;
3 R; R( ^# ^1 n3 _7 P. s0 G
paramSet.destCIdx = 0;
: q' C( h( C' X8 Y& R' d
paramSet.aCnt = PING_PONG_ACNT;
' z* l2 }' W8 y; j h
paramSet.bCnt = PING_PONG_BCNT;
4 F( n, X% m; b
paramSet.cCnt = PING_PONG_CCNT;
0 O1 [# o6 j& G- U& d4 A
& P8 W& Q, D0 D
/* For AB-synchronized transfers, BCNTRLD is not used. */
9 f5 q! z9 F2 n7 h5 p" Q8 E) d
paramSet.bCntReload = PING_PONG_BCNT;
% V3 d/ k# r7 R, ~% F0 h
) S1 j5 C; S2 u4 ~8 E' N0 j
/* Src in constant mode Dest in INCR modes */
% v# B# F, ?4 h, s% |
paramSet.opt &= 0xFFFFFFFDu;
. O; C0 O5 L& d4 v+ R5 n, z
//paramSet.opt &= 0xFFFFFFFCu;
0 o/ y* g% S4 b3 J1 s
, F9 Q: J1 D8 y$ v' A' I, Z
/* Program the TCC */
& W. M4 W$ F& J8 a1 o, o
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
5 D3 P2 Y6 A5 t, m5 p# M$ J( |- E. C
- a7 u" s4 Q3 r8 }/ E. b- D3 X
/* Enable Intermediate & Final transfer completion interrupt */
, l# S( {! E2 i+ P7 |2 D
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
# M# [$ G; P t: [) E4 |! j9 H
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
& }& X- y. \ c' B4 @! z' h
/ G6 u+ u( T( X: D/ N% ~" ~1 _. {
/* AB Sync Transfer Mode */
$ z$ |9 p/ ~% F/ I9 D! u* p9 \
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
' ]. B' |( k! K; h0 d6 O
. h/ I7 G, ^* a
/* Program the source and dest addresses for master DMA channel */
' ?0 ? \! \. w9 N
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
5 L9 D. W+ N* j- Z" g# o/ {
paramSet.destAddr = (uint32_t)(ping_buffer);
$ A7 H1 w, n. n8 j2 Z
9 U: I) O9 j5 @
/* Write to the master DMA channel first. */
. @1 e, B, ]& j6 Z* B* D5 E: |
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
, w% E: \- ~- E
}
0 e- `5 m! v3 d5 s! r3 ] T* T
{! \7 P9 h% u* e, ?+ D7 m0 z
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
. v( H& W2 ?3 G
2 f1 h2 ~" h1 h, ?$ Q# c" X
if(result == EDMA3_DRV_SOK)
' B1 D, ^; h& n1 z% v' g/ t
{
6 }6 \) l$ a+ I( r6 \$ K: o
print2arm("edma3 driver init success.",0);
+ K/ V1 x {4 _# [+ K* ?4 E8 `
}
) U5 P0 P+ L+ b" }6 U, v% G1 }2 ~
}
" q4 D* _& F h& r+ i
9 l, p! J# D. u' D J* U1 D) |
' }6 Q, V* [- {) ~" |) r; I
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
/ q; O& w# m- k
& a/ O: ?$ ^/ V; r. f) D- w
% O$ p) G1 `7 x
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
, z# ?1 n; V6 R& {( |
每次DMA传输完成后都要再次使能传输
; R; H% D& y$ L# [* N
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4