|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
一个项目要用到TMS320LF2407 DSP,之前没用过,花了一天时间了解了一下基本操作,就开始调试CAN控制器。
) U; s- C. Z1 F& f1 J' z( z使用CAN自测模式,设置邮箱3发送、邮箱2接收,并使能邮箱2的接收中断、高优先级,main.c如下:. W% }2 C1 F" ]: l; N
8 Z4 f5 F/ M& t7 ^/ g R9 Z
#include "global.c"
. }, }% x5 X, e; W) y' D' @void SystemInit();
* ^( F( i2 c8 ^4 pvoid Timer1Init();( K3 W' v9 a$ G4 w7 p- q' E
void KickDog();! S, N& k6 h/ W6 z0 p) s
void CANMBX_ISR();% P) A ^" u; m7 ]) ~
void CAN_INIT();. P% L$ P& w1 r2 T( d& \
unsigned int numled=0;
5 S( C* S2 G' ~4 `unsigned int CAN_FLAG;// 定义标志寄存
/ \; V, E: k' x# S/ _& e$ j8 i! T! x& v) q0 m
/ h2 V, d- [5 r t' H, Hmain()
$ A1 v5 L+ {' T! I# \+ r{+ T1 _$ `5 K b! \" G$ X9 ?
unsigned int i=0;
! X# h2 W( v7 }* G. b% lunsigned int RCA0=0,RCB0=0,RCC0=0,RCD0=0,RCA1=0,RCB1=0,RCC1=0,RCD1=0;
+ o. c7 W- B5 x$ bSystemInit();//系统初始化
2 | q9 M* q! K2 m& f S" _6 n. |! K& X7 u0 x
MCRC=MCRC & 0xFF00; //IOE0-7设为IO口模式2 M9 r* r" N. g0 y5 X
PEDATDIR=0xFF00;//所有LED=0,
4 F- j: R A5 wasm(" CLRC INTM ");// 中断使能
/ h$ e% r1 y8 sCAN_FLAG=0X00;// 清CAN用户标志,CAN_FLAG=01表示接收到数据
4 v8 ?7 m! o7 H2 u7 g/ z' ACAN_INIT();// CAN初始化程序 g9 u# A5 @7 M6 h7 P4 Q
while(1)
. I" j' n) G7 ?6 Y+ z{" Y: o% D& \) s1 w
CANTCR=0X20;// MBX3请求发送
" E4 |0 G1 _; q1 V" ?- N, owhile(CANTCR&0X2000==0)// 等待发送应答
$ h) f) }% Q; s% D3 lcontinue;
5 |# B7 O/ j) X' A2 r8 FCANTCR=0X2000; // 清 TA3 和MIF3标志位
1 h5 U; U( b+ A% j3 w- Kwhile(CAN_FLAG==0)8 s9 f. u+ R/ h: e4 P \* ~* ]
//while(CANRCR&0x0040!=0x0040)) F8 h7 X- v& v+ W
continue;// 等待接收数据
' H' U, T) @# {7 |" J; h: s! VCANRCR=0x0040;//清接收悬挂位
( ~0 D0 x4 r0 M0 o5 hCAN_FLAG=0;; a" F [7 t' u
i++;// 清接收到标志
' i2 E! C5 }3 {& ?1 fCANMDER=0X0000;// 邮箱不使能
3 q: x* j2 w B d4 l2 _. ICANMCR=0X0140;//CDR=1,数据改变请求$ K' P( }2 Y7 J, b9 _3 q. E
5 r+ p4 `6 a$ L% M' K% L7 G1 o3 ICANBX3A=CANBX3A+1;// 邮箱2中数据加1用来更新邮箱3中的数据
6 F: ^1 ]" p& R" TCANBX3B=CANBX3B+1;- L! \* u) @% M; U. {3 c
CANBX3C=CANBX3C+1;
" B5 u$ [4 Y. a0 q$ j4 V1 {CANBX3D=CANBX3D+1;+ p2 ` d( J1 s _
CANMCR=0X04C0;//DBO=1,CDR=0,ABO=1,STM=1
3 @3 }" ~9 t1 ?; a* jCANMDER=0X04C;//ME2=ME3=1,MBX2接收, MBX3发送& u1 j% Y( n; g% l
/ p3 h, j1 C6 @/ k9 F( ?. f* o IRCA1=CANBX2A;( b8 O" ]- g/ o8 {
RCB1=CANBX2B;: F% H4 m M3 h# \* b8 l
RCC1=CANBX2C;
1 M" y& X+ m$ r+ [# C. r2 |% |RCD1=CANBX2D;
; M5 x$ [, \+ V, [. Y( f, n, D
M# B+ b7 V2 f
# n$ Q4 T+ R# ]- I}
- i$ c C- i9 b+ ^9 `. Z! z}
; V, M2 u5 ~9 p6 b6 ?1 cvoid SystemInit()
3 y4 ~, [2 r# R% i{1 i# Q- J7 U7 t- B# r o
; H v$ m( g; yasm(" SETCINTM ");5 m9 w# B: V4 T
asm(" CLRCSXM");
; F L1 g5 w/ e: ^3 ^asm(" CLRCCNF");
% [. y, |: a d5 j5 Basm(" CLRCOVM");7 }/ p8 e* V0 x# c; P
SCSR1=0x02FC;
$ M, A+ q& T, j$ a9 R/ o- TWDCR=0x006F;
' _9 I' D- m# o1 U$ x, xKickDog();
1 Y/ C( a3 Z! V6 ~: i. P9 E' i0 WIFR=0xFFFF;
, ]! p% A9 s" } d+ g/ VIMR=0x0003;
7 r1 ]# L% C* j2 e! V. ~6 ^1 O# I4 `! @9 E. ^/ u7 o- m9 T G: x
}% \( O/ a9 k. ^" {
& N" J) V1 z- Ovoid Timer1Init()
/ D8 x& A) D# r; Z$ I0 w6 T; p{1 L R$ x9 K; T9 J e( O5 P* J
/ z- z/ x3 k& I4 y$ C! J5 GEVAIMRA=0x0080;//定时器1周期中断使能
a- K9 l5 c& H3 S! z5 M) S. ^EVAIFRA=0xFFFF;//清除中断标志" W% m; w9 U& g& Y3 t; q
GPTCONA=0x0000;
9 G9 m: x) D. x+ XT1PR=2500;//定时器1初值,定时0.4us*2500=1ms. G8 F' S8 `" U# B* `; N
T1CNT=0;8 i/ l; s1 @& E" P
T1CON=0x144E;//增模式, TPS系数40M/16=2.5M,T1使能/ {* |1 }' `& ~. s) B( O
! o, i5 M1 J7 G' f}, ~4 A& S. U2 C$ i
void CAN_INIT()
$ k& x1 l2 z0 s0 q{; R. c0 a( ]7 U) H
MCRB=MCRB|0X0C0;// 设置IOPC6、IOPC7 为 CANRX,CANTX. F6 d4 W* H- Z9 p/ J* U7 i& `
CANIFR=0XFFFF;// 清所有CAN中断标志
/ {! H$ o$ B5 M$ C' UCANLAM0H=0X7FFF;// 设置邮箱2、3的屏蔽ID寄存器+ ~3 ], u$ d8 }: G: F6 W
CANLAM0L=0XFFFF;// 0则ID必须匹配 e* k1 V1 w; o+ z2 d! l% o @% @) F& |
CANMCR=0X1040;//CCR=1 改变配置请求
$ V4 S; P% y# q& s- `% Twhile(CANGSR&0X0010==0)continue;// 当CCE=1 时即可配置 BCR2,BCR1 寄存器
[6 \: L& ?9 _. j1 \* DCANBCR2=0x01;9 f4 q( d8 l5 ^3 J$ A
CANBCR1=0x0033;# _- a a, t$ k: [3 L6 [
CANMCR=CANMCR&0XEFFF;//CCR=0 改变配置结束请求
" M- Y" {9 ?4 E' C$ m) [1 Awhile(CANGSR&0X0010!=0)continue; // 只有当CEE=0时,BCR2,BCR1 寄存器配置成功8 N B7 k+ C% Y. J' _
CANMDER=0X040;// 不使能邮箱,邮箱2设为接收方式
) V) Y% N& x: k2 F5 i4 o5 g6 nCANMCR=0X0143;//CDR=1,数据区改变请求/ b& A! R2 H% {: g" Q" a
CANID2H=0X2447;// 设置邮箱2的控制字及ID4 d- A6 H4 c# e& |! m$ _0 b; `
//IDE=0, AME=0, AAM=0
0 _6 r2 {4 }6 f8 v7 V// 标准方式为MSGID2H[12-2]
0 p+ ?/ R1 S% b) d/ _' U! ICANID2L=0XFFFF;
, S( M7 P. \$ h; j' o$ Z( fCANCTRL2=0X08; // 设置控制域0 [4 J; t8 y# _1 Z1 ]$ h; ]0 m, d
// 数据长度DCL = 8,RTR=0 数据帧
) X! o) s4 G" S- PCANBX2A=0X0000;// 邮箱2信息初始化
; W, i% ~* u8 r% O# p; T, @CANBX2B=0X0000;$ |# u8 m2 b( t( R& J, a6 Z
CANBX2C=0X0000;
% g* w! L4 ~" D5 A" h$ CCANBX2D=0X0000;. G$ i% W9 b* p, w
CANID3H=0X2447;// 设置邮箱3的标识符7 \- @3 ~% r% O z8 ^
CANID3L=0XFFFF;
, E' _$ g ^& [. o% a) Q1 fCANCTRL3=0X08;//RTR=0,DCL=8; f% k; x; v5 `' j! K# `
CANBX3A=0X10;// 邮箱3信息初始化
' S1 p7 U7 W' {5 CCANBX3B=0X10;$ [0 [( N% H1 ^
CANBX3C=0X10;
: r& G5 Z; |+ z+ ^CANBX3D=0X10;+ r4 `( W5 E1 E; u1 T
CANMCR=0X04C0;//DBO=1,ABO=1,STM=1设置为自测试模式( r {& v8 g1 L! h
CANMDER=0X4C;//ME3=1,MBX3 发送, ME2=1 接收# W3 d! w+ ^" e' I9 {8 m
CANIMR=0X0400;// 中断MBX3 不使能 ,MBX2使能, 高中断优先级
1 l1 z4 e# N8 B* Q4 R! s. b# u$ tCANIFR=0XFFFF;// 清全部中断标志6 a" Q+ c" X1 c( t J) @) J
}: U4 @0 P) p5 G( @5 P U
1 U6 n; c9 L! `0 I- _3 u f& W( D. F2 d- T! C) O7 ~
void interruptc_int2()) M; a: J3 S/ X+ V
{
: [$ y. F' M2 C! w6 f
& I, `8 g1 R' y* b, O& G# j* |0 E. P' dif(PIVR!=0x27)
* z' B6 P9 _6 P8 V6 _: A) G# R{asm(" CLRC INTM ");$ o4 w& f8 p( Y3 t4 s: V9 v
return;' k1 d1 E" W+ B" C8 \
}
/ v% z' m/ s- Y$ tT1CNT=0;0 g0 G9 t! D) Q9 j( Y) M* l3 V# c& J
numled++;
8 F" B5 q# l+ j
; e; n) |3 x9 u4 P- V4 QEVAIFRA=0x80; F) E I$ k# T2 m. Z
asm(" CLRCINTM ");0 l \9 y2 r5 k- i% U2 @! M
* c& N- O/ K/ A& [6 l w
}
0 J7 p' ?; ~& n: O) pvoid interruptc_int1() // 中断入口程序
" F9 H8 c# P2 q% n- _{
, p# u, G( L$ O S# s$ Fswitch(PIVR)( Q% H' R5 ~; B+ T$ ~
{+ n% G& }% B) d! U- L% `1 X
case 0x40:) a% k; z9 B' C' m4 t
CANRCR=0X040;// 复位 RMP2 和 MIF2
$ T: p* y. t- R# A5 l) cCAN_FLAG=1;// 置用户接收标志* s/ V. H' |2 x0 O; v
; y! S: h. b5 @) v" O# M z2 hbreak;1 O7 r0 `2 Z4 H# I* M. ?. D3 ?
}
1 H0 B- X/ f# z' E; A! ]/ U8 W}. H5 \' h2 b8 c% l$ f+ Y2 H; X
( h0 P% G/ H7 N1 D) K6 x
void KickDog()
- ~* }0 o- ]7 W0 X) f+ d' c4 d9 s{
1 e3 L/ Z1 m5 O, qWDKEY=0x5555;; ^% R+ L& J4 }7 [, ?
WDKEY=0xAAAA;
5 z- {1 x& L$ K! u9 `}, Z9 u- C7 x% M3 Y- W2 t$ z6 o' x
但是调试发现,邮箱能正常发送和接受,就是进不去中断,查了一上午才解决问题。对于DSP的外设中断,INT1到INT6,在Define.asm中有相应的中断向量表与之对应,如下:5 U) z6 _ r/ Y" A
;建立中断向量表# I/ ]' O5 S. P, {9 O" i
.sect".vectors"( Q; b, F( o6 }* Y7 F7 g
RSVECTB_c_int0( T/ _) \. g* i# G0 t
INT1B_c_int1 x, u. Z5 `& u& d2 O/ B6 O$ S
INT2B_c_int2
& ?& f3 s( S6 @2 ~ m+ z5 `INT3BPHANTOM
6 `1 o- c/ \$ K7 a wINT4BPHANTOM
# d1 u0 w; e7 {; u+ w* p6 GINT5BPHANTOM
6 G# W3 F% ^( }: VINT6BPHANTOM- R: K% u: P$ h1 _6 L
对于邮箱2 的高优先级中断c_int2,一开始并没有在此定义,因此无法进入相应的中断,将原先的PHANTOM改为_c_int1就行了,即为其建立中断入口地址。_c_int与C语言的c_int是一样的。. C+ f/ U9 v( B X2 l6 z
PIVR是外设中断向量寄存器,用于存储最近一次被应答的外设中断的地址向量,其具体值可在中断源优先级和中断向量表中查的,对于每一个外设都有一个唯一的中断向量入口地址与之对应。+ |! ~4 a; t, @( |! F
|
|