|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
一个项目要用到TMS320LF2407 DSP,之前没用过,花了一天时间了解了一下基本操作,就开始调试CAN控制器。% C1 m+ h8 Q, o
使用CAN自测模式,设置邮箱3发送、邮箱2接收,并使能邮箱2的接收中断、高优先级,main.c如下:; R* d/ j* h% w& ~1 h J7 Q
0 d/ x5 l; Z: @5 F
#include "global.c"5 K% c! R, [1 B9 e# I
void SystemInit();
) q6 P& @; q& \* S" v$ s( s5 K$ Kvoid Timer1Init();
7 k7 w8 d/ i$ \% t8 j) xvoid KickDog();
. D, |$ A. a0 Ivoid CANMBX_ISR();9 w" m/ P. j0 e
void CAN_INIT();
, `& `% D2 t7 u' xunsigned int numled=0;7 e, ^4 w% D/ Q' K
unsigned int CAN_FLAG;// 定义标志寄存
5 v1 G% a$ f! l% E; A0 J1 F! z
# s R. l! i8 O9 {4 `9 z z2 q( f3 L/ F
main()8 b+ Y* y6 w2 z p+ `3 j
{* n+ |0 ?* [1 G9 B- y
unsigned int i=0;! Q6 ]' R& N3 e# |, i4 u
unsigned int RCA0=0,RCB0=0,RCC0=0,RCD0=0,RCA1=0,RCB1=0,RCC1=0,RCD1=0;
) ~4 q# b/ b, y3 b2 X: ?1 I+ ySystemInit();//系统初始化
& }; J3 n3 f; v/ W, t4 i
- H) X' }3 ?3 G1 qMCRC=MCRC & 0xFF00; //IOE0-7设为IO口模式
# C3 w& C# F' Z: G/ E1 pPEDATDIR=0xFF00;//所有LED=0,9 K: b7 b! T% U9 [: I
asm(" CLRC INTM ");// 中断使能
& W/ S0 R% w5 f. `1 _4 ?CAN_FLAG=0X00;// 清CAN用户标志,CAN_FLAG=01表示接收到数据
# e4 T* M) s( T& @: [CAN_INIT();// CAN初始化程序" z' S, W* ^0 z6 g4 e: S
while(1)% H# d5 n% W4 I: [' k' b. \% i
{* y- r# K. X% u1 f
CANTCR=0X20;// MBX3请求发送( t4 |' r' L' u
while(CANTCR&0X2000==0)// 等待发送应答" [' | W- R3 E+ t- l% J* W6 H
continue;$ y- O) A1 O1 u6 H" s( H
CANTCR=0X2000; // 清 TA3 和MIF3标志位
9 ?3 z# J. x0 d) h5 g* Pwhile(CAN_FLAG==0)0 f! J8 b/ @" ~; F, R" Z7 F. O) Z
//while(CANRCR&0x0040!=0x0040)
$ O* D( _6 g% H* j; a/ z! rcontinue;// 等待接收数据, |" @1 v2 I3 G: I5 z
CANRCR=0x0040;//清接收悬挂位- k' q& w2 T6 _0 ^5 j! i
CAN_FLAG=0;
% n' s, ~: Z7 M. Yi++;// 清接收到标志
6 v& G. p7 `. @$ \4 Q1 J' ACANMDER=0X0000;// 邮箱不使能+ |5 K: k! b {$ P; K D
CANMCR=0X0140;//CDR=1,数据改变请求, z: s c0 v6 p! M% H3 _/ x" o
( o( X. i# \7 I+ `CANBX3A=CANBX3A+1;// 邮箱2中数据加1用来更新邮箱3中的数据
* h5 p# M9 k# K8 z- [2 SCANBX3B=CANBX3B+1;& j1 x1 G' w( g( z8 o1 x
CANBX3C=CANBX3C+1; F j% y, `5 s, i
CANBX3D=CANBX3D+1;- S9 B5 r8 x3 w t; C# Q
CANMCR=0X04C0;//DBO=1,CDR=0,ABO=1,STM=17 C. \. S5 D0 L2 h9 R! v
CANMDER=0X04C;//ME2=ME3=1,MBX2接收, MBX3发送
$ A5 r3 h$ A- m& Y% i5 X L
1 O6 y: H4 p/ \- B1 MRCA1=CANBX2A;0 H9 ` h5 e) r
RCB1=CANBX2B;
% q1 g% m" _/ x% ^RCC1=CANBX2C;
( b5 v$ R! `1 a" ]0 x' k; n, b3 aRCD1=CANBX2D;, W2 g1 i0 e7 o. `. q# _
& Q: T# q7 R0 i" r' c& q# K# Q
1 ^' z* k/ |; j' W, J9 W}
1 M0 [- O4 {; b4 N- |/ z}
) h( d' z2 t; J5 p* d2 Tvoid SystemInit()8 \3 U1 Y) T; s) f) O' J/ p
{; t, ?* A+ {& m8 i; h. O0 a- @
( p0 s6 p' ?1 W: q6 [. }( z& kasm(" SETCINTM ");
* L3 N$ ^- O: A5 l4 [8 w0 ?asm(" CLRCSXM");# ?. }5 o0 G j N* w4 @& n
asm(" CLRCCNF");
# B7 g" \9 n+ w& @$ Q( r+ X# jasm(" CLRCOVM");" r* R( p6 v3 c0 ?
SCSR1=0x02FC;# }; z3 m- N% O- E, p
WDCR=0x006F;
, L& f' y8 L8 s. JKickDog();4 `' v8 e- x' E1 q' \9 |
IFR=0xFFFF;
' d1 D7 H* e& m& u5 p* LIMR=0x0003;1 S8 _, r7 T. Y1 d
9 Z1 D) Y5 E# _. h: r: N}
# @: `' K! L, X* V" U7 j" x/ B
7 Z/ b; O' t" Avoid Timer1Init()6 U) E+ u+ E% g/ T* T3 x
{
5 k! Y2 C4 z v6 a, Q t" X
: p4 U: x0 q9 z+ S, _EVAIMRA=0x0080;//定时器1周期中断使能
9 l5 M1 T( L9 w2 z8 bEVAIFRA=0xFFFF;//清除中断标志5 P: \) S- D ~$ h
GPTCONA=0x0000;
& v. u7 l) x+ C( h+ Y- \T1PR=2500;//定时器1初值,定时0.4us*2500=1ms
3 x! l6 K0 {# ET1CNT=0;
* f- S! u$ t% F# h, G2 z" oT1CON=0x144E;//增模式, TPS系数40M/16=2.5M,T1使能
, B+ O2 n3 n, B$ _2 f! ]* q& \/ Y* h1 b& g1 F J
}
2 ]5 q x! C1 P9 P; W) r# |7 gvoid CAN_INIT(); ~; `0 ?$ ~* V9 k+ A( b( Z1 S
{
* G5 a" V/ v, O9 c }MCRB=MCRB|0X0C0;// 设置IOPC6、IOPC7 为 CANRX,CANTX& `' g/ ~1 x3 n( C n
CANIFR=0XFFFF;// 清所有CAN中断标志5 f+ \8 R; w: D
CANLAM0H=0X7FFF;// 设置邮箱2、3的屏蔽ID寄存器2 l' C1 m( d7 W! ?
CANLAM0L=0XFFFF;// 0则ID必须匹配
# d. ]. ^, _& ~$ DCANMCR=0X1040;//CCR=1 改变配置请求
7 S6 ?4 B, N! R1 E1 h* B! r1 t5 Twhile(CANGSR&0X0010==0)continue;// 当CCE=1 时即可配置 BCR2,BCR1 寄存器- s' X* b9 ~0 q1 `* p7 G
CANBCR2=0x01;/ Y1 C, ^" J6 G, F3 G
CANBCR1=0x0033;
5 Z; m) j# O- M* {& B% HCANMCR=CANMCR&0XEFFF;//CCR=0 改变配置结束请求
5 c$ Y- D' |. e7 h& t! s, Vwhile(CANGSR&0X0010!=0)continue; // 只有当CEE=0时,BCR2,BCR1 寄存器配置成功
0 W9 D; t! }* J, p0 o: r9 R) ~CANMDER=0X040;// 不使能邮箱,邮箱2设为接收方式
3 B2 [. ?+ k9 ~. W' ACANMCR=0X0143;//CDR=1,数据区改变请求
9 o, g, ^( b! c$ u! P! _1 ACANID2H=0X2447;// 设置邮箱2的控制字及ID. @2 C+ z' g) c) d1 ~3 z
//IDE=0, AME=0, AAM=0+ r3 f5 s' F0 [: Q
// 标准方式为MSGID2H[12-2]
4 S8 r- ]7 Q0 q0 b! q, ECANID2L=0XFFFF;
& G* W/ Y- C9 SCANCTRL2=0X08; // 设置控制域
, d& E/ z9 f% ~' ~8 ^. d3 b$ k' @// 数据长度DCL = 8,RTR=0 数据帧, _ h; |/ ?6 }) Z; E
CANBX2A=0X0000;// 邮箱2信息初始化7 K* H) C4 D* W
CANBX2B=0X0000;
6 A. g. v* J) ]# ]9 @CANBX2C=0X0000;
4 C3 |( i- @- w4 X8 s5 r! `9 @' m' _( HCANBX2D=0X0000;- W9 \, n \/ v
CANID3H=0X2447;// 设置邮箱3的标识符
9 T8 @% T( r; C; j5 K8 @2 jCANID3L=0XFFFF;
$ X8 L* f# E. @/ L/ f% }CANCTRL3=0X08;//RTR=0,DCL=8* }/ k) Q) F( Q5 u2 h
CANBX3A=0X10;// 邮箱3信息初始化
" ~) H, o6 C8 D5 L' ^CANBX3B=0X10;
, h( [# P r% g$ [CANBX3C=0X10;5 M# k# I+ k' p
CANBX3D=0X10;
+ M; d3 g7 }! t. f& pCANMCR=0X04C0;//DBO=1,ABO=1,STM=1设置为自测试模式0 M* a! r) l7 n$ I
CANMDER=0X4C;//ME3=1,MBX3 发送, ME2=1 接收
* M& H" C3 F; E7 G2 qCANIMR=0X0400;// 中断MBX3 不使能 ,MBX2使能, 高中断优先级3 j3 D/ [( _0 L% @
CANIFR=0XFFFF;// 清全部中断标志
0 X+ s q3 g4 u' |}/ z! N/ w9 D( n- i4 C# i4 F6 V
* o' h3 l& T U: G* S
* V) E$ t2 f( b. ~void interruptc_int2()
4 a, N+ O x m$ x# x! |5 \{$ X0 N$ R. x; j/ t0 c7 P
. v1 J# W/ u6 B6 Y
if(PIVR!=0x27): S6 ]+ B' }( M. @
{asm(" CLRC INTM ");9 `2 L/ K" l" V% Q7 y( j
return;
7 Q; t% W% j: T1 `, X}
# V" f& Z& S5 RT1CNT=0;7 Z) I" J2 `1 w
numled++;
: y2 X z2 \0 q, O" f1 T2 B' p: O* g4 ?
EVAIFRA=0x80;* V) i" w' f7 J; c( d# |: R: B
asm(" CLRCINTM ");
( \5 D+ f. ]$ X3 I6 y' g6 V5 c9 }% }/ F, k( G
}
& H% }& J- r* A9 l+ @: {void interruptc_int1() // 中断入口程序) z, f3 T, }$ Y3 X
{
6 c' ^7 E% `" }. Uswitch(PIVR)9 f! v0 R9 v, K& ^+ u& P: ?/ @/ T4 ~
{
- r4 k* o* ], i8 _" ?7 m* fcase 0x40:
7 C$ q d/ e' W6 Q* K' lCANRCR=0X040;// 复位 RMP2 和 MIF2
2 r4 D! o! E0 L* [/ qCAN_FLAG=1;// 置用户接收标志6 [% G4 a) X$ u3 r- a% ?* t
; X% K- W3 u: [$ N, S
break;
$ S+ w( l2 L, i' J. q7 B( c. G}$ Y4 b" l, h! L6 a9 B" }
}
& }/ O. N( D" X5 z- m4 K% K6 O3 D5 g
! X0 ~! ]) W, b5 bvoid KickDog()& K4 E& f% j8 A( J$ h' ^$ r
{- r) A9 g% E; ?) D: v0 B6 s! [" X& ~
WDKEY=0x5555;
. g+ M' P9 O" x7 }1 }0 y. GWDKEY=0xAAAA;
! l# b* O2 Y8 [* O# M. W}' q" P; C! U4 i% `! Z* b# m+ Z! ]
但是调试发现,邮箱能正常发送和接受,就是进不去中断,查了一上午才解决问题。对于DSP的外设中断,INT1到INT6,在Define.asm中有相应的中断向量表与之对应,如下:
F! h' q4 c: z. G! T) d;建立中断向量表# J3 e5 W+ J# ~* h+ o& c7 T
.sect".vectors"8 T; k: @- b" U2 {, t. R
RSVECTB_c_int0
3 |* M6 F: z8 t9 J- k. gINT1B_c_int1% W; t' K3 y- M; `7 L
INT2B_c_int2
/ M, P; L! V$ P$ c- yINT3BPHANTOM
! R! I2 n; u" @) A: g: {INT4BPHANTOM. s" q1 P8 [+ L- Z; h k5 n% J
INT5BPHANTOM% S. O7 ^- Z- c/ p. k' l1 T
INT6BPHANTOM
4 D' r( w, a: P对于邮箱2 的高优先级中断c_int2,一开始并没有在此定义,因此无法进入相应的中断,将原先的PHANTOM改为_c_int1就行了,即为其建立中断入口地址。_c_int与C语言的c_int是一样的。, a5 Y7 B, P' r
PIVR是外设中断向量寄存器,用于存储最近一次被应答的外设中断的地址向量,其具体值可在中断源优先级和中断向量表中查的,对于每一个外设都有一个唯一的中断向量入口地址与之对应。
7 u0 S3 F$ M$ b) V |
|