找回密码
 注册
关于网站域名变更的通知
查看: 1287|回复: 4
打印 上一主题 下一主题

DSP CAN总线无法进入中断的解决办法

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2021-5-12 15:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
一个项目要用到TMS320LF2407 DSP,之前没用过,花了一天时间了解了一下基本操作,就开始调试CAN控制器。. L4 [; J% @5 m  ]1 V
使用CAN自测模式,设置邮箱3发送、邮箱2接收,并使能邮箱2的接收中断、高优先级,main.c如下:
5 b& e9 O' v: v4 O; Y9 o. D( _$ j+ K+ Y/ o  k; T
#include "global.c"
# \6 R( R1 V8 M9 m; mvoid SystemInit();( \! K+ Q4 _" d+ J% |% O# b
void Timer1Init();% L) H2 a1 }3 s: E/ z5 [0 V  J
void KickDog();1 I3 p) W1 w. e  Q" M8 s
void CANMBX_ISR();
$ U) H  J+ B' l5 r3 k, a6 ?void CAN_INIT();
0 P5 m* r& r* s- m% T1 nunsigned int numled=0;. \1 ?' |  D- r& a' `$ {, G5 b8 \
unsigned int CAN_FLAG;// 定义标志寄存' ]# a( }2 d8 O$ y

2 C, y( \+ Q: m
1 F7 o; L3 Z+ @+ j% P5 X/ e* [( nmain()7 S$ u+ m" y1 C/ X9 D5 R
{
' W! Y% w5 p8 Q& S  lunsigned int i=0;' v& ~0 ]+ O" }* H3 a3 n
unsigned int RCA0=0,RCB0=0,RCC0=0,RCD0=0,RCA1=0,RCB1=0,RCC1=0,RCD1=0;
0 K! [! M+ ^4 [0 \+ t/ V+ tSystemInit();//系统初始化, O* \) E" ^( R7 d% i$ w

2 `& G& Y* x, ?. m8 s9 S9 m$ g3 NMCRC=MCRC & 0xFF00; //IOE0-7设为IO口模式" a( N- o  w% p0 s: ~  A
PEDATDIR=0xFF00;//所有LED=0,$ M$ D( b! {( F8 S
asm(" CLRC INTM ");// 中断使能/ [) L1 a' }) `8 l
CAN_FLAG=0X00;// 清CAN用户标志,CAN_FLAG=01表示接收到数据: y: G+ f. E" O# V0 K
CAN_INIT();// CAN初始化程序  g2 U% g! n7 X5 y5 V( ?( @
while(1)
, L% m. ^3 H: H5 ]" P{
3 m9 f2 A. d8 |9 YCANTCR=0X20;// MBX3请求发送
+ I2 h7 ^3 c- v: m" {while(CANTCR&0X2000==0)// 等待发送应答
- j6 W* p# e  Q$ |continue;
. o4 x4 ], p' E/ @" k& ]CANTCR=0X2000; // 清 TA3 和MIF3标志位) h* p# |5 |+ m- u/ A8 c5 i
while(CAN_FLAG==0)
- A& T9 h, E% Y: H0 a//while(CANRCR&0x0040!=0x0040)
1 k0 l5 k7 }# ^2 L! [. [continue;// 等待接收数据
8 }+ h7 U) h0 q( z% T* k# ACANRCR=0x0040;//清接收悬挂位! ]" w' S0 E) E6 J! ?
CAN_FLAG=0;
: m: M' P( O: X% D( @+ Mi++;// 清接收到标志( J; R+ `& Z5 t: v- k4 z+ v( E5 C
CANMDER=0X0000;// 邮箱不使能
$ }, Z( ?8 V/ h  L6 r9 S: CCANMCR=0X0140;//CDR=1,数据改变请求- {; j4 O# y- \& N& `

0 f' P7 ]* Q/ J$ K" h+ JCANBX3A=CANBX3A+1;// 邮箱2中数据加1用来更新邮箱3中的数据
  z2 j. @# p0 n1 A. GCANBX3B=CANBX3B+1;
& @" {* c4 i$ f- [CANBX3C=CANBX3C+1;
8 B$ x3 V( t# ~% L" r& rCANBX3D=CANBX3D+1;4 U, m) o# j1 c3 r8 U" v' w
CANMCR=0X04C0;//DBO=1,CDR=0,ABO=1,STM=1
: ]# F0 Y7 G, r  c% Q2 ], Q. rCANMDER=0X04C;//ME2=ME3=1,MBX2接收, MBX3发送
: B1 y! Q' y( y) ^7 t$ |) K! Q2 C$ B% F" c7 R+ o( h, l# a
RCA1=CANBX2A;
2 L/ a6 }* y) ?9 G$ ^RCB1=CANBX2B;4 q. O+ \2 t! h9 g: I$ a1 w# U
RCC1=CANBX2C;
  G% Y+ }% P9 I; E9 u7 gRCD1=CANBX2D;; u3 e2 L. E7 J0 N
6 e$ g5 y  K( z1 a

9 {1 `5 p; l- s7 z5 a& K. g}" e9 ]7 M8 S6 y1 G" w( N
}' s6 F. d+ O0 K: v( p: a7 V" Z
void SystemInit()
- {% q  P$ p8 F{+ W, T+ x9 A6 ~* V
; X  u- `) e0 o* h+ {9 K- E8 z4 K) j
asm(" SETCINTM ");
' `/ Z/ c2 M+ |8 A$ p" Easm(" CLRCSXM");6 r& ]1 I3 w" J9 |* R
asm(" CLRCCNF");( I2 |3 h& D  p* U9 B
asm(" CLRCOVM");
; O7 ]0 J% y' s1 x, ~SCSR1=0x02FC;
: Z5 x5 d- }; ?5 M6 Q2 q1 d/ OWDCR=0x006F;
* M, R3 _4 o" }/ z' ZKickDog();
' D# D' q4 t5 DIFR=0xFFFF;- i& q/ T* c' c6 n# _2 n2 i3 a: E4 t
IMR=0x0003;/ D1 g* E% C( O% R

: |, C- c, Y2 V, C1 l# y& F}
  a( T0 x1 x$ K. x# }( [0 J# B( {2 i% H* P- X6 M  r- c
void Timer1Init()3 M1 j' `& f  Z6 B) X
{
3 |* c; I8 ]3 t2 y. F' a
6 f+ W8 c" A! h1 D2 REVAIMRA=0x0080;//定时器1周期中断使能
6 q6 O: u. X  XEVAIFRA=0xFFFF;//清除中断标志' R# J! z* J9 k
GPTCONA=0x0000;0 t% F7 X* q' n; T
T1PR=2500;//定时器1初值,定时0.4us*2500=1ms
6 L/ K, r6 E" |/ }! |' FT1CNT=0;  z  P  H+ c# @2 `
T1CON=0x144E;//增模式, TPS系数40M/16=2.5M,T1使能
" C2 U3 g; D. @9 @9 m" G8 U, i: D, U( ?1 p6 D: F
}
$ _- g/ f. p7 H( k9 G6 W* p8 A1 evoid CAN_INIT()
3 v# k7 u# o# H4 g& O- r# a7 X{
. s# Z" e' z: m4 J- _MCRB=MCRB|0X0C0;// 设置IOPC6、IOPC7 为 CANRX,CANTX0 i5 G; I9 R2 ^
CANIFR=0XFFFF;// 清所有CAN中断标志
. q: }3 @; {' |- i; u3 p; W" sCANLAM0H=0X7FFF;// 设置邮箱2、3的屏蔽ID寄存器
- M3 q) _/ r1 d4 b. MCANLAM0L=0XFFFF;// 0则ID必须匹配
! ~6 O6 n7 x8 j, ^  RCANMCR=0X1040;//CCR=1 改变配置请求6 k4 ?( M; u0 `3 T; V
while(CANGSR&0X0010==0)continue;// 当CCE=1 时即可配置 BCR2,BCR1 寄存器
% b. a' t; X/ {CANBCR2=0x01;) }/ H0 N0 k$ O. f4 Q6 a1 I
CANBCR1=0x0033;, ?9 M: ?3 X. U
CANMCR=CANMCR&0XEFFF;//CCR=0 改变配置结束请求
- @& q8 p/ T2 d. K; s( hwhile(CANGSR&0X0010!=0)continue; // 只有当CEE=0时,BCR2,BCR1 寄存器配置成功
- D  B) C6 O4 @% L4 ?* iCANMDER=0X040;// 不使能邮箱,邮箱2设为接收方式
2 y: @: T) H2 _* L* c. x& _% n. M2 ]CANMCR=0X0143;//CDR=1,数据区改变请求
  v% x* e; i3 V* a3 X& Y0 fCANID2H=0X2447;// 设置邮箱2的控制字及ID8 }! ?2 Y" d" Y
//IDE=0, AME=0, AAM=0
* v# I6 H" N9 M  e# U9 ^// 标准方式为MSGID2H[12-2]7 S3 C; ~6 L7 J. `
CANID2L=0XFFFF;2 j' _  C- a; R% ~. O4 c: ]) S2 m
CANCTRL2=0X08; // 设置控制域! M$ F7 N. q8 E
// 数据长度DCL = 8,RTR=0 数据帧
. d, p* Q$ L6 _CANBX2A=0X0000;// 邮箱2信息初始化8 b1 k$ g5 y+ W
CANBX2B=0X0000;
. U" H, T7 |+ I  F) V( DCANBX2C=0X0000;
5 y8 ~" K" x- `- c$ f9 UCANBX2D=0X0000;2 m; \! b* i  t* E4 a
CANID3H=0X2447;// 设置邮箱3的标识符/ k0 i8 d+ K0 U$ Y
CANID3L=0XFFFF;; f1 q. Y6 y2 a. F5 j+ u
CANCTRL3=0X08;//RTR=0,DCL=8% Q& ^# O: A! t8 N) z* e8 U
CANBX3A=0X10;// 邮箱3信息初始化0 e- y4 T; a3 x  g  w! f. i/ Q
CANBX3B=0X10;2 h' G$ d; ?, |  n
CANBX3C=0X10;3 c/ y) U- V7 Q( m+ B/ _
CANBX3D=0X10;$ A: r2 o# E& p0 X
CANMCR=0X04C0;//DBO=1,ABO=1,STM=1设置为自测试模式
2 H: f( T3 Y$ G' S% ACANMDER=0X4C;//ME3=1,MBX3 发送, ME2=1 接收
$ p3 R7 g9 `% [  x/ J& cCANIMR=0X0400;// 中断MBX3 不使能 ,MBX2使能, 高中断优先级' Y) c9 v, k( R$ o/ @7 r! W) u
CANIFR=0XFFFF;// 清全部中断标志9 X% |) r+ C( ]; s  e& }: R
}: ^( V* x8 P( Y
, B" I# t3 S" ~1 a& N; K& }

" A$ l1 B+ T+ p- xvoid interruptc_int2()* V8 s; e' F3 v! o9 A
{
2 r6 D* _. o" K" a# ^  q  P1 Z
; K! `. L) z: n/ fif(PIVR!=0x27)7 I$ T) t8 I1 y/ u
{asm(" CLRC INTM ");& P# f2 D0 R3 m7 o* n' c
return;, F2 k8 `( k( T8 u+ z6 p
}6 P. H% e7 D/ Y% F/ o
T1CNT=0;
* r/ H( h4 u! C( g' X4 t4 ?numled++;! o9 m/ p" r2 @. q, v# e

# T$ G8 \# A) a) uEVAIFRA=0x80;
8 D3 P- v/ p9 F+ nasm(" CLRCINTM ");
4 B7 ?  z6 L2 g! u- C
' j' i  y" A5 q' ^* \}, Y2 ?. \# V" ~, M; W5 R
void interruptc_int1() // 中断入口程序
; P: s7 S+ X2 ~! ~/ v{1 ^4 C5 d# f2 S3 b$ F
switch(PIVR)6 h! q# u& c3 c- U2 ]$ ]7 I
{
; O8 O8 c8 F; t! Xcase 0x40:
* O* I( z/ Y8 I7 C; g# C- |! YCANRCR=0X040;// 复位 RMP2 和 MIF2& m: ^5 c1 K- Z, `
CAN_FLAG=1;// 置用户接收标志* v0 b& ?. b) z* `
8 \: ]! m; B! i/ p2 v& a
break;
4 F& H. u5 F) K/ s( y}
9 b/ ^$ Y6 `! `" _1 s2 G}4 L, ~) u2 P; ^* S- y6 X3 K; Q. C

& f) p# V! D- `8 q8 P# ]void KickDog()
1 E8 Q) ~. M; q3 O  L/ ~7 [{$ u0 X; E0 O$ ~* a( @* B
WDKEY=0x5555;+ f; D5 m+ @' n$ n
WDKEY=0xAAAA;& G8 ?; G" G/ {! m5 v& X0 Y
}" G9 M' V# t4 g8 I
但是调试发现,邮箱能正常发送和接受,就是进不去中断,查了一上午才解决问题。对于DSP的外设中断,INT1到INT6,在Define.asm中有相应的中断向量表与之对应,如下:+ I+ r) v1 N% B
;建立中断向量表+ D* F6 P" A7 U! C: _  u4 @/ ~
.sect".vectors"
7 _+ ^# Z$ {, v' U, e& aRSVECTB_c_int0+ p, u3 F+ W/ [6 I5 r1 u* j3 S7 w
INT1B_c_int1
' |- C+ V# U8 p1 yINT2B_c_int2
, l1 W* r' o2 @2 i, q# u9 OINT3BPHANTOM
, W  j: y) z2 D6 O3 |# D8 gINT4BPHANTOM8 k9 |7 z6 j( G0 v" y( h3 Z
INT5BPHANTOM
8 S' O6 R1 B7 g: X8 G2 p- J5 HINT6BPHANTOM9 ]& ^# ~5 d! I6 n9 D* s
对于邮箱2 的高优先级中断c_int2,一开始并没有在此定义,因此无法进入相应的中断,将原先的PHANTOM改为_c_int1就行了,即为其建立中断入口地址。_c_int与C语言的c_int是一样的。
3 g4 i+ i/ |7 b* }# v5 a& R+ s. o" IPIVR是外设中断向量寄存器,用于存储最近一次被应答的外设中断的地址向量,其具体值可在中断源优先级和中断向量表中查的,对于每一个外设都有一个唯一的中断向量入口地址与之对应。7 N+ b8 p' s5 ~* N  x) d- N. v7 i
  • TA的每日心情
    慵懒
    2022-12-26 15:28
  • 签到天数: 1 天

    [LV.1]初来乍到

    2#
    发表于 2021-5-12 15:50 | 只看该作者
    PIVR是外设中断向量寄存器,用于存储最近一次被应答的外设中断的地址向量
  • TA的每日心情
    慵懒
    2022-12-26 15:28
  • 签到天数: 1 天

    [LV.1]初来乍到

    4#
    发表于 2021-5-12 18:34 | 只看该作者
    先收藏了,省的后面找不到
  • TA的每日心情
    开心
    2022-12-5 15:37
  • 签到天数: 2 天

    [LV.1]初来乍到

    5#
    发表于 2021-6-10 18:11 | 只看该作者
    实用的分享
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

    推荐内容上一条 /1 下一条

    EDA365公众号

    关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

    GMT+8, 2025-6-24 05:13 , Processed in 0.093750 second(s), 23 queries , Gzip On.

    深圳市墨知创新科技有限公司

    地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

    快速回复 返回顶部 返回列表