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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
一个项目要用到TMS320LF2407 DSP,之前没用过,花了一天时间了解了一下基本操作,就开始调试CAN控制器。, M( V; X% H7 f
使用CAN自测模式,设置邮箱3发送、邮箱2接收,并使能邮箱2的接收中断、高优先级,main.c如下:7 m7 P) D2 _4 w! k# {" [

6 K* W% q) a( D: l#include "global.c"+ n6 K. f' Y$ w
void SystemInit();
6 s. h* t. e- H& a' l+ @  c% Wvoid Timer1Init();6 u1 E& Y: G7 N: p, x& y# @3 B, ]9 ?
void KickDog();
$ }$ U) e; [5 v7 H! Ivoid CANMBX_ISR();
' p& V3 ^5 f% _9 \* ]void CAN_INIT();- a1 \+ e( I" R8 x
unsigned int numled=0;
( b# Y5 F% n8 T* U" ^( ~unsigned int CAN_FLAG;// 定义标志寄存
0 r7 u7 j3 |" \; Q/ D) n& R, S4 W  }, s9 V

) t' [. I# o- umain()
  Q# Z6 R4 Q1 Q, \  _" _9 b; Z. \{
4 ]& x# ~; d6 f# |0 l& T, zunsigned int i=0;  Y$ a3 f1 g: t! L5 Y' l9 R
unsigned int RCA0=0,RCB0=0,RCC0=0,RCD0=0,RCA1=0,RCB1=0,RCC1=0,RCD1=0;
- S+ A* x- \/ O6 j$ s9 zSystemInit();//系统初始化
# e4 q6 \5 T1 E  s% b4 d1 y" M, R- L7 N- O( r
MCRC=MCRC & 0xFF00; //IOE0-7设为IO口模式
4 b4 a# R, _! z& i3 APEDATDIR=0xFF00;//所有LED=0,5 @$ L/ Y0 P, ]* e) ?
asm(" CLRC INTM ");// 中断使能
6 B$ t" g; r' {CAN_FLAG=0X00;// 清CAN用户标志,CAN_FLAG=01表示接收到数据2 R' m) M6 m2 \) Z& {  V% p
CAN_INIT();// CAN初始化程序
: q" k5 C( ]( |, l- \5 Nwhile(1)$ r" |/ ]! @, ?: g- d8 h: l
{! n# w9 |! `2 i" K
CANTCR=0X20;// MBX3请求发送
" I6 @* A" j! }* T! awhile(CANTCR&0X2000==0)// 等待发送应答
3 P4 Y8 x" s/ u( j6 Rcontinue;
  q: L" ]' o' E0 T3 r% l8 MCANTCR=0X2000; // 清 TA3 和MIF3标志位; K: n4 R) R" a' H7 S
while(CAN_FLAG==0)
2 Q& k3 r5 p" C5 k//while(CANRCR&0x0040!=0x0040)
+ E$ X0 _' s2 I* O9 E& f  Bcontinue;// 等待接收数据
' g' `7 H/ u" t  ~& K* xCANRCR=0x0040;//清接收悬挂位* m' r3 L2 o  \5 i
CAN_FLAG=0;
, y* j. |! T) y$ w5 c8 ri++;// 清接收到标志1 a% \8 A# @1 N) b9 j
CANMDER=0X0000;// 邮箱不使能( V7 e; h, h( R& t; L
CANMCR=0X0140;//CDR=1,数据改变请求: N& [  c% L! E5 q( y) e* k

  t4 y2 S; O3 G$ r9 R, @; h# mCANBX3A=CANBX3A+1;// 邮箱2中数据加1用来更新邮箱3中的数据
) Z' C, N* R! ]9 Y3 Z: l+ \CANBX3B=CANBX3B+1;! ], e4 G7 N# f4 q5 q' ~2 }5 z: `
CANBX3C=CANBX3C+1;" {6 ~" F# e7 g9 m
CANBX3D=CANBX3D+1;, D2 y9 o( u2 g8 z
CANMCR=0X04C0;//DBO=1,CDR=0,ABO=1,STM=1
: \# J+ J% v. Q/ t; d: ACANMDER=0X04C;//ME2=ME3=1,MBX2接收, MBX3发送
+ D0 }: w* C* p( g0 u
  ]7 d. n4 F8 d; e% ?7 a9 oRCA1=CANBX2A;
# f. O: w1 q, T: C& J; mRCB1=CANBX2B;
' M! y0 \4 ?9 ^. W3 F6 K# oRCC1=CANBX2C;
8 X+ U& ]1 c- `RCD1=CANBX2D;
. b- h8 ~9 b3 U8 S, y( `
4 n0 e* C% l8 |- v4 z
% @6 n+ I# w8 M) Q  u& w( j}8 C4 f( X  l4 g* Z2 h
}/ w  }. t3 g* s! o9 {# j; o
void SystemInit(); w  |+ ^3 V- M$ B: ?, S& ]0 a
{
/ ?4 ]0 t3 O2 c; F) a4 x( m) N0 w* v3 m  o4 |
asm(" SETCINTM ");) X0 P! W' q& k2 s. k6 V7 e' J
asm(" CLRCSXM");
; T6 p& S9 s& h8 e/ Tasm(" CLRCCNF");7 x4 d; P6 ]& \' Y* b
asm(" CLRCOVM");
/ P' o7 Q$ q0 {) |& e4 MSCSR1=0x02FC;
4 ^- `6 i1 j/ P  r6 S4 {' H1 qWDCR=0x006F;
' W6 D7 [, @" ~! H, N# eKickDog();
% B& `% w8 m7 v# t* [IFR=0xFFFF;
) s( y2 X9 @8 C# r: sIMR=0x0003;% M# q* v5 Y2 n

" ~" j! h0 `- P" l3 N9 M}' s& H7 I2 U6 W+ t2 \3 V% }. x; h. Q
; j4 Q. I# Z( b
void Timer1Init(): z$ U- E" v( b# T7 x: q" G$ f, o
{5 f, s1 m' x: @6 x, z

; u, Y; Y; C# I- bEVAIMRA=0x0080;//定时器1周期中断使能
) M: }' u7 ^$ l8 H# O$ B6 W& AEVAIFRA=0xFFFF;//清除中断标志  Q3 R+ |4 @3 O1 S( o
GPTCONA=0x0000;+ W1 a; D! I- t0 T
T1PR=2500;//定时器1初值,定时0.4us*2500=1ms
0 B" Z) G) B5 j. a1 Y) {. DT1CNT=0;8 V, W9 p% l# y/ t$ [
T1CON=0x144E;//增模式, TPS系数40M/16=2.5M,T1使能
4 X. @- \% U% w: o/ W' i. [, _2 F8 Q
4 h; m  s$ N# r& Z) F/ _4 t}
2 l. G/ H9 f$ A/ R7 rvoid CAN_INIT()
* H+ [6 L% J/ ?& d{* X# ^3 @4 |% v. Z
MCRB=MCRB|0X0C0;// 设置IOPC6、IOPC7 为 CANRX,CANTX
4 n9 A% o7 }7 A; ?; ~CANIFR=0XFFFF;// 清所有CAN中断标志! n$ |/ c/ z/ U0 S& R: F- y
CANLAM0H=0X7FFF;// 设置邮箱2、3的屏蔽ID寄存器1 U" P  x% C8 k! O
CANLAM0L=0XFFFF;// 0则ID必须匹配: c' C" b" Y2 m/ ~6 m4 Y
CANMCR=0X1040;//CCR=1 改变配置请求
- C2 ]2 k5 o$ v  N& v* Owhile(CANGSR&0X0010==0)continue;// 当CCE=1 时即可配置 BCR2,BCR1 寄存器, Y2 u! ]' {3 I# V
CANBCR2=0x01;
. M% z4 k# o; {4 W1 [: FCANBCR1=0x0033;4 S! s, m; z$ f7 A: Q& M
CANMCR=CANMCR&0XEFFF;//CCR=0 改变配置结束请求2 _& D! u) w) J( `
while(CANGSR&0X0010!=0)continue; // 只有当CEE=0时,BCR2,BCR1 寄存器配置成功
! G& }0 P+ Z0 t& j! ]CANMDER=0X040;// 不使能邮箱,邮箱2设为接收方式* U% N) Y" G) Z3 N( I( S* ?# l; E
CANMCR=0X0143;//CDR=1,数据区改变请求. x0 t( M$ C: {. B* V
CANID2H=0X2447;// 设置邮箱2的控制字及ID1 \# B2 {" p5 {9 c% `
//IDE=0, AME=0, AAM=0. p6 @, E2 ?0 w* k: J
// 标准方式为MSGID2H[12-2]- q1 X9 X& ^; J
CANID2L=0XFFFF;
, m" j0 c) d% O, L% tCANCTRL2=0X08; // 设置控制域
- A' {' p# b9 c* g// 数据长度DCL = 8,RTR=0 数据帧: E( c. w- Y3 z: x8 c
CANBX2A=0X0000;// 邮箱2信息初始化
! N4 R3 i" U* q3 q# Y! s( h# Q5 ^CANBX2B=0X0000;; X3 f0 a1 u2 R' R5 \5 i$ D/ I
CANBX2C=0X0000;* k$ g9 X) ]; C: e
CANBX2D=0X0000;& n/ ^4 {, e( a, Q- e0 |! U. q) x
CANID3H=0X2447;// 设置邮箱3的标识符6 `4 g1 _* k1 r0 V
CANID3L=0XFFFF;
( I" u9 o% u9 k6 T. X( D/ e+ G2 _CANCTRL3=0X08;//RTR=0,DCL=8) t% g" y  n  w5 k
CANBX3A=0X10;// 邮箱3信息初始化: B! q/ t+ q. C( |( @2 }
CANBX3B=0X10;$ {$ @7 x6 b) o0 M8 d5 j
CANBX3C=0X10;
0 l: A' v1 [3 k$ [  ACANBX3D=0X10;& D* A! N& R+ `. K
CANMCR=0X04C0;//DBO=1,ABO=1,STM=1设置为自测试模式
* D3 \, v& i# w6 B9 RCANMDER=0X4C;//ME3=1,MBX3 发送, ME2=1 接收7 C' [6 ?  s+ \* A
CANIMR=0X0400;// 中断MBX3 不使能 ,MBX2使能, 高中断优先级
! h1 _' U/ m' z8 r7 I! W* MCANIFR=0XFFFF;// 清全部中断标志
, ~( t! T# o' D: A1 T0 _}
6 ~; B6 a. a2 v1 j# D( v& _& g) d9 A) x# y
$ g, N1 n' O- T5 L0 L( e$ }/ z
void interruptc_int2()
6 ?# R' M5 L  M/ M2 ^{
( e9 F* @. |1 K
% `( M! F2 J# l. C& jif(PIVR!=0x27)4 |& ]6 N$ E9 D4 ~' T5 K0 p/ ^0 _- C
{asm(" CLRC INTM ");
& o7 U+ j9 Q0 I/ E, n7 _! ^return;
6 y$ o: n$ f7 B8 U4 Q}
. A3 D- X* U# C( {, RT1CNT=0;2 \1 Y/ I4 M0 i8 `, I: ]: K- v9 |
numled++;' j, V5 |$ b; x! K+ S* M# m
- z& ~! C! g: X6 v' f2 T2 ?
EVAIFRA=0x80;1 N* u& _% \( A/ [
asm(" CLRCINTM ");
4 ?; `2 H! D8 m( ^+ d- i: o
) n6 D) Z, `. o; W& B}) C5 j* k2 Q) t( S2 w0 k# t7 K+ r3 G
void interruptc_int1() // 中断入口程序7 p3 a8 x9 H& L% T8 S
{
$ }, {* v+ k: R: d* A" i) b9 aswitch(PIVR)
* v3 a+ D/ @/ u- U3 K2 e6 W{
$ r: v. j; Z9 e: ?% Vcase 0x40:3 H4 d6 P, v+ f. {, r' Q* q
CANRCR=0X040;// 复位 RMP2 和 MIF2
$ O$ W2 [8 u3 K: ]. cCAN_FLAG=1;// 置用户接收标志
5 ~- y, j: I) `& ?# I2 Y" l# P: H' v% V% \# v. O
break;  T( V# q: L; s
}- v4 E( M5 b$ g0 b) ?2 b
}2 q/ [3 u) G: ]. _0 e: ]: n
! P9 R, G* n+ I% J" G
void KickDog()
: a$ m! ?, v; {$ d) G) ]{$ q8 E: d+ [3 w: r
WDKEY=0x5555;' n0 `; [) Z9 N# C; S$ q; y$ [' O4 L
WDKEY=0xAAAA;9 T1 q  K  K" n" w, A
}
' Q. @' m4 A7 L# }但是调试发现,邮箱能正常发送和接受,就是进不去中断,查了一上午才解决问题。对于DSP的外设中断,INT1到INT6,在Define.asm中有相应的中断向量表与之对应,如下:1 T) P. h) S* C. X3 \4 U! [
;建立中断向量表* d3 e+ i8 p" i" |* Q3 a# {+ t
.sect".vectors"
. W5 N1 W; O( p0 A) ~RSVECTB_c_int0/ y: Q/ h" P& f' e' ]( N; k& w
INT1B_c_int1
' r  r' g  I" |& GINT2B_c_int2
  C3 g3 b" J0 `! s% hINT3BPHANTOM
" w8 D: L2 j' D0 Z) LINT4BPHANTOM
+ X5 l$ F# K5 @) L+ E! FINT5BPHANTOM
* v* _& B+ ~, \/ z8 b+ AINT6BPHANTOM
, v5 s/ z, I% a  s* l* Q对于邮箱2 的高优先级中断c_int2,一开始并没有在此定义,因此无法进入相应的中断,将原先的PHANTOM改为_c_int1就行了,即为其建立中断入口地址。_c_int与C语言的c_int是一样的。9 U; W! t% z) s$ g( \
PIVR是外设中断向量寄存器,用于存储最近一次被应答的外设中断的地址向量,其具体值可在中断源优先级和中断向量表中查的,对于每一个外设都有一个唯一的中断向量入口地址与之对应。( Y$ F& E8 Z6 V# s
  • 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-11-24 06:15 , Processed in 0.171875 second(s), 24 queries , Gzip On.

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

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

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