|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
一个项目要用到TMS320LF2407 DSP,之前没用过,花了一天时间了解了一下基本操作,就开始调试CAN控制器。
8 U: H P& u; V0 |5 H1 z, S1 v使用CAN自测模式,设置邮箱3发送、邮箱2接收,并使能邮箱2的接收中断、高优先级,main.c如下:6 ]9 \; M: r Z1 n6 f
$ [4 Y( r, N. b7 A( B& t% T7 E#include "global.c"
2 A% x9 d8 D# r% B5 D: Kvoid SystemInit();
' H! a) y% E Dvoid Timer1Init();
& f( l; e% _3 M/ E& Evoid KickDog();
7 Y" k9 _$ B0 q1 Rvoid CANMBX_ISR();
! M4 P B" L9 U& g3 O( Evoid CAN_INIT();# f, W0 a; @! D/ |$ c% {
unsigned int numled=0;: E: @! B6 C \0 y
unsigned int CAN_FLAG;// 定义标志寄存- ?& N, z* a" C, @# h
+ c3 t; C3 h+ O% Z
, j+ \2 ~2 V, D: w G$ K) X0 zmain()
) @; c6 i0 V9 `8 J7 Y0 Q- V{
- a1 p3 @& Z9 S W4 b% S7 Aunsigned int i=0;# |% n* L5 A' V( e0 g1 w
unsigned int RCA0=0,RCB0=0,RCC0=0,RCD0=0,RCA1=0,RCB1=0,RCC1=0,RCD1=0;( a" R+ Q* H% k, ?- E& {
SystemInit();//系统初始化
$ s: V/ b# M: k' p$ G3 h4 j; A. {2 n! m+ p$ _+ U
MCRC=MCRC & 0xFF00; //IOE0-7设为IO口模式
$ f* ]2 V* }* ~( lPEDATDIR=0xFF00;//所有LED=0,
% k# Y- F+ ^6 j/ Tasm(" CLRC INTM ");// 中断使能
. T, e5 ]+ P" e3 t7 LCAN_FLAG=0X00;// 清CAN用户标志,CAN_FLAG=01表示接收到数据: S) |7 v4 Y; ~# E! b
CAN_INIT();// CAN初始化程序
0 ?* u$ h( u. t/ L, Swhile(1)
' C1 a' u5 @5 G( z9 @& m/ l{2 v# n8 _0 ^0 Z: m3 Y1 ]
CANTCR=0X20;// MBX3请求发送5 g# _- _5 k5 {- F" o
while(CANTCR&0X2000==0)// 等待发送应答6 x2 F0 z" R% k4 i$ [0 E3 d
continue;9 F2 o7 o" m; s; @$ Y W
CANTCR=0X2000; // 清 TA3 和MIF3标志位. G+ s, u6 ]4 ?- i& g9 z
while(CAN_FLAG==0)
E) h% u9 {$ h//while(CANRCR&0x0040!=0x0040). q% p. Y. C, R3 r' \3 Y
continue;// 等待接收数据6 D0 {. U6 t6 Q* T# F
CANRCR=0x0040;//清接收悬挂位9 T, l+ R4 W; C) r3 d
CAN_FLAG=0;. o8 Q% R% `7 d# h1 W* G: S
i++;// 清接收到标志
( B3 u4 @/ H/ [/ P* T! ^2 P$ q- \2 WCANMDER=0X0000;// 邮箱不使能+ t7 d( u7 e6 l4 H/ i7 W& b* n
CANMCR=0X0140;//CDR=1,数据改变请求2 f) P' Q% ~' X9 U6 t
+ P! D) _( b# Z$ n$ @CANBX3A=CANBX3A+1;// 邮箱2中数据加1用来更新邮箱3中的数据
& C4 H% {: m. i& f9 LCANBX3B=CANBX3B+1;/ V: f+ l! ^/ n$ F' H& K
CANBX3C=CANBX3C+1;
7 _9 g* o4 ?, l7 ?9 f3 x7 SCANBX3D=CANBX3D+1;3 U O$ D* D5 ~0 d. u1 L
CANMCR=0X04C0;//DBO=1,CDR=0,ABO=1,STM=1
4 X5 E+ h5 e' w j$ q# B/ n) K! WCANMDER=0X04C;//ME2=ME3=1,MBX2接收, MBX3发送
1 U' a$ z! A0 V* X5 N; x, _. | @4 `8 k& G J j! v5 E& c, I
RCA1=CANBX2A;
2 L( @6 ^1 R4 L. q7 ~RCB1=CANBX2B;5 a/ C6 p8 n) [- t4 F8 ]8 @
RCC1=CANBX2C;' l/ x) E" _/ d
RCD1=CANBX2D;3 h. r2 r+ i7 M7 w8 d
! D4 t, s( j( o6 z+ L! a
: ]1 w) j3 [2 e5 G' O$ ]+ X}
! T v0 }' j4 y# c}0 W+ k6 v& e' x" `9 _' k
void SystemInit()
5 m5 Y; F$ |, s8 D) f7 b6 {{+ F* L3 D) N" D: m) ? X g$ i" E
0 `/ F) z# q7 V) |asm(" SETCINTM ");
# B: @9 s4 b9 w( K6 a: ~# _" tasm(" CLRCSXM");' _9 ~9 }* ?7 M0 q7 g
asm(" CLRCCNF");
! H* c4 H8 c+ x: Vasm(" CLRCOVM");
4 L8 s! N9 U" R) H! l3 pSCSR1=0x02FC;# G7 {5 b5 `* ^- n5 H0 R" y
WDCR=0x006F;1 C% t0 j h6 {9 W
KickDog();
: R; {9 F: {( M1 p- w6 }0 jIFR=0xFFFF;
& M9 H$ O8 @+ Q9 ~/ Q b. gIMR=0x0003;
4 a4 `4 e! j& F2 j/ s. X. a- {
# d1 P; i, a; e% O4 R( E}
+ S4 D; z. B% g' x7 N& Z a! `# f% g1 Z
void Timer1Init()! j; X5 T" G; s( ]
{3 A/ E' o- ^$ `0 H w5 ^
" Z) V2 P7 z/ c9 P o+ |( t4 R- xEVAIMRA=0x0080;//定时器1周期中断使能2 Y8 f. E% x" n
EVAIFRA=0xFFFF;//清除中断标志" V* o9 l$ ?& Q) m! j- D
GPTCONA=0x0000;
* _( b3 E6 d2 K4 {1 yT1PR=2500;//定时器1初值,定时0.4us*2500=1ms
. \8 Q/ m4 c2 s( bT1CNT=0;
+ P' O v- b9 h$ z1 l1 vT1CON=0x144E;//增模式, TPS系数40M/16=2.5M,T1使能
4 D' m( ~: x+ r" `$ R7 C' _8 U% ]& L: |2 R1 `3 v
}- V. ?9 x9 }3 z( _' l, h( `
void CAN_INIT()
. B3 |! a( v7 X0 X9 ]{2 w( ]6 w# G! C6 y9 G
MCRB=MCRB|0X0C0;// 设置IOPC6、IOPC7 为 CANRX,CANTX! s" H9 ] L A
CANIFR=0XFFFF;// 清所有CAN中断标志3 L! p# s" `2 j* J& i
CANLAM0H=0X7FFF;// 设置邮箱2、3的屏蔽ID寄存器% P9 Y) p. D1 V- e0 e2 w
CANLAM0L=0XFFFF;// 0则ID必须匹配% F# D" A- D9 P: ^( O3 q+ P/ r: V
CANMCR=0X1040;//CCR=1 改变配置请求& F; w& ~* n4 N( } D4 L
while(CANGSR&0X0010==0)continue;// 当CCE=1 时即可配置 BCR2,BCR1 寄存器- H' \- v) L: j1 B! d, U6 A
CANBCR2=0x01;/ |) k, d& s) {3 _9 i5 T$ A
CANBCR1=0x0033; A% S1 {$ _. q0 ] P8 A5 b2 t
CANMCR=CANMCR&0XEFFF;//CCR=0 改变配置结束请求
% m0 c6 h7 ?' N o, swhile(CANGSR&0X0010!=0)continue; // 只有当CEE=0时,BCR2,BCR1 寄存器配置成功
& k, T6 m* T0 V' [CANMDER=0X040;// 不使能邮箱,邮箱2设为接收方式# I) _+ ^& V! H3 x
CANMCR=0X0143;//CDR=1,数据区改变请求. S5 j2 B3 Z' }0 o
CANID2H=0X2447;// 设置邮箱2的控制字及ID
" M n) V8 b1 Z//IDE=0, AME=0, AAM=0
: _' k: u$ {* T! N// 标准方式为MSGID2H[12-2]
: Q$ I0 _/ s3 {CANID2L=0XFFFF;! D; j+ K7 @: O$ D
CANCTRL2=0X08; // 设置控制域
R' r1 q$ k1 J. J// 数据长度DCL = 8,RTR=0 数据帧
; p( J3 o% g! u) _CANBX2A=0X0000;// 邮箱2信息初始化+ f6 K! z2 {; Q- E# S" `6 ]0 T
CANBX2B=0X0000;1 ^$ b9 F# | B3 @- t+ o {
CANBX2C=0X0000;. K% o. L% W# d7 ?
CANBX2D=0X0000;
5 y1 R* c, R! g4 H5 x2 G1 vCANID3H=0X2447;// 设置邮箱3的标识符
+ d1 `7 O8 _2 T- D- rCANID3L=0XFFFF;, |; M' Q0 n" I0 O+ P
CANCTRL3=0X08;//RTR=0,DCL=8& v# j9 a" R+ r3 G4 w" e
CANBX3A=0X10;// 邮箱3信息初始化2 }6 g, w/ a/ S0 L
CANBX3B=0X10;5 S5 t5 p; l# c8 m
CANBX3C=0X10;( B9 n/ B# Y3 u( R
CANBX3D=0X10;3 E; Z1 |" S" Q9 f
CANMCR=0X04C0;//DBO=1,ABO=1,STM=1设置为自测试模式1 s+ Z* E4 N4 i7 E' k: K
CANMDER=0X4C;//ME3=1,MBX3 发送, ME2=1 接收
: e+ ^ @8 A P: T5 y1 y' oCANIMR=0X0400;// 中断MBX3 不使能 ,MBX2使能, 高中断优先级
5 ~8 a1 Z2 r! H) z, CCANIFR=0XFFFF;// 清全部中断标志
, v: C3 d" u" L& I" N}/ `7 e; s) l q2 |; M' m& u; C0 d
% m* }* U9 D! u& \1 ?- J
# G2 g+ }/ {9 ^$ A7 X6 c
void interruptc_int2()6 ]9 ]6 E: R1 C" h
{
& e0 Y7 f0 q; j) k! o- P$ ]4 H5 |4 K
. x' a2 Q7 A0 R; hif(PIVR!=0x27)# y0 j2 I% }4 J' Q4 K( z
{asm(" CLRC INTM ");
: Y5 j1 e1 M! U( V5 b8 Ureturn;5 h- H$ @, d' B) ~0 o! k3 g9 G. s9 k
}2 x2 R* u" R0 r% k3 R
T1CNT=0;% x, i, e; h0 B1 Q8 u1 y& W8 M% j
numled++;
# J3 [- ]% ~: b2 o/ A0 X9 J, X h9 J) m/ X3 u2 j0 F" t" P2 u. L/ F
EVAIFRA=0x80;
3 O0 H8 R9 ?0 J9 oasm(" CLRCINTM ");
' ? a# l! L3 q; F9 J- x3 A! C+ s. W% }" n* i6 m
}, L, U( x0 T3 M
void interruptc_int1() // 中断入口程序
7 o# \0 \' Y) ]. d{- M2 N, D; j. E" x
switch(PIVR)4 W; o7 `. S" X1 ~$ u# h4 ?
{
; i) [) a: x, W2 j+ Fcase 0x40:
: \5 H/ C4 Q9 p* B% K6 T) o+ TCANRCR=0X040;// 复位 RMP2 和 MIF2
. N( J5 `4 M7 j0 \3 K' Z' Q7 VCAN_FLAG=1;// 置用户接收标志
! f0 X$ k; E! F6 c/ V4 [: ^' E: e3 P/ `5 b. ~- P) X
break;& B- k* L$ H2 e, u# Z8 W
}6 Q% i+ z- g* l
}" n& ?/ _/ I+ u3 m! f5 }1 |3 j
4 l) D, W8 w9 B3 T* ^3 f
void KickDog()+ y7 k" G, n/ [2 e% }3 z" i g
{3 o" W) g" g) f
WDKEY=0x5555;
5 ?& Q% a$ C" R1 PWDKEY=0xAAAA;7 |. z+ v+ @ T, Z( s% W
}$ k# D W( _& Y9 l
但是调试发现,邮箱能正常发送和接受,就是进不去中断,查了一上午才解决问题。对于DSP的外设中断,INT1到INT6,在Define.asm中有相应的中断向量表与之对应,如下: z; N0 }" L( L4 @' i
;建立中断向量表- w4 y3 f! ^6 a0 P' ^* C6 u
.sect".vectors", g* X; T9 R% m
RSVECTB_c_int0
- B6 D4 a! `1 w: N7 oINT1B_c_int1, a E6 m. Y, [5 f% _. C6 A
INT2B_c_int22 l9 N; G2 X7 {5 J( k1 g; v
INT3BPHANTOM
6 X8 F- V! Z$ {' ~INT4BPHANTOM: U) X3 }9 K, q. Y( P
INT5BPHANTOM& z, [9 v5 O/ Q4 D# w' k
INT6BPHANTOM: J+ X, X" C8 L( o
对于邮箱2 的高优先级中断c_int2,一开始并没有在此定义,因此无法进入相应的中断,将原先的PHANTOM改为_c_int1就行了,即为其建立中断入口地址。_c_int与C语言的c_int是一样的。
1 N6 J4 a8 A, P( b/ F5 N: Y! fPIVR是外设中断向量寄存器,用于存储最近一次被应答的外设中断的地址向量,其具体值可在中断源优先级和中断向量表中查的,对于每一个外设都有一个唯一的中断向量入口地址与之对应。6 ]7 T! P9 ^ ?0 {1 u
|
|