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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
一个项目要用到TMS320LF2407 DSP,之前没用过,花了一天时间了解了一下基本操作,就开始调试CAN控制器。
* }) F& [, y9 A# G% Q6 z) P使用CAN自测模式,设置邮箱3发送、邮箱2接收,并使能邮箱2的接收中断、高优先级,main.c如下:
. T0 {5 ~& r- R( C
. h9 `: S: M7 @- B- \% H#include "global.c": k( K1 u! v8 N1 [3 K% F
void SystemInit();
, r" q# b2 I8 D. g, P6 G$ D! mvoid Timer1Init();
8 I0 W5 r0 o+ m$ H( P, F' w3 g9 Bvoid KickDog();/ o& Q. N- A- S# J& ?8 j; g
void CANMBX_ISR();
- V, p$ q# C& ^: rvoid CAN_INIT();4 o0 G- C+ |( r' v3 h. L
unsigned int numled=0;
5 ^, s$ _2 n, x# U9 W& [, ]8 Hunsigned int CAN_FLAG;// 定义标志寄存
/ p/ [1 f) a0 L0 s
# E/ G8 C/ Y- O# b. o; J) l- |& z3 q, F
main()
8 u/ a% K  L- w{6 D: K) B/ k/ ?0 F3 D' |
unsigned int i=0;
* L9 f% {- g6 h# [6 p/ a1 h, L- ]unsigned int RCA0=0,RCB0=0,RCC0=0,RCD0=0,RCA1=0,RCB1=0,RCC1=0,RCD1=0;
+ U, X1 c( B$ E1 NSystemInit();//系统初始化
3 K' Q( ^1 {* P0 Q1 r, p4 X, D! I+ F& `3 r. e+ t
MCRC=MCRC & 0xFF00; //IOE0-7设为IO口模式
& K* ~8 Z* ?+ e8 O9 j( NPEDATDIR=0xFF00;//所有LED=0,1 I( n4 [/ e3 ^
asm(" CLRC INTM ");// 中断使能1 M* G% T0 D/ _2 |! ^0 t4 r8 S& G
CAN_FLAG=0X00;// 清CAN用户标志,CAN_FLAG=01表示接收到数据
5 Y( r" A+ X- d, ZCAN_INIT();// CAN初始化程序
9 N1 S/ [6 \8 Jwhile(1)
/ V( r1 F8 T$ l, m1 K1 |1 q3 `6 q{: U+ @6 J+ z' m+ x" }1 [- E6 p& Z+ J' d) Y
CANTCR=0X20;// MBX3请求发送5 u5 U4 u3 U$ E) F* l! Y( m9 ]
while(CANTCR&0X2000==0)// 等待发送应答: |& _1 M  W2 D' D
continue;' b' R( A5 Y; N' x3 Z' t* x1 ?& I
CANTCR=0X2000; // 清 TA3 和MIF3标志位! Q+ Z* X4 G6 L
while(CAN_FLAG==0)
; r+ J2 ^1 X) Z//while(CANRCR&0x0040!=0x0040)) ?6 w" z4 T6 D; w5 r
continue;// 等待接收数据
# J0 Y; ?( J+ y% bCANRCR=0x0040;//清接收悬挂位
2 C. M  f. l1 ^. l* X7 MCAN_FLAG=0;
/ R1 o4 \- e- s1 p& y) C3 L; ki++;// 清接收到标志
/ J& W$ l1 a$ S" k( \9 aCANMDER=0X0000;// 邮箱不使能
3 A& F( {. ]+ U! MCANMCR=0X0140;//CDR=1,数据改变请求
( d6 l# f  G3 {
( ?' u$ |# S- iCANBX3A=CANBX3A+1;// 邮箱2中数据加1用来更新邮箱3中的数据  \4 r- G4 c/ k$ g
CANBX3B=CANBX3B+1;
/ r# G3 |. V) S) XCANBX3C=CANBX3C+1;  F" K1 l! F9 i( C9 k& `  y
CANBX3D=CANBX3D+1;
6 ?8 j1 f3 T6 }) w( z/ iCANMCR=0X04C0;//DBO=1,CDR=0,ABO=1,STM=11 _" f0 p3 S5 H0 ?8 ?* n
CANMDER=0X04C;//ME2=ME3=1,MBX2接收, MBX3发送
1 B# U5 N+ W5 C0 c" ~/ P( o
' K1 m: h5 p6 d! Z5 LRCA1=CANBX2A;
3 I# H, m* g1 FRCB1=CANBX2B;
0 m& I& r/ l, |- W2 ERCC1=CANBX2C;% `) W1 V1 ?/ L+ n
RCD1=CANBX2D;3 I; u: q( y* w& ]) d

* g/ _6 a3 L8 _5 l0 h# w
) F% M7 j$ e5 T8 A5 ?}* `/ R3 c3 K: H' V9 V
}. l/ D6 z$ u( v6 k$ T
void SystemInit()* J. @4 y4 a; `# t: r* \6 Z; R  v
{
" N. I1 `; L* L0 W- V0 @% f! k7 B# u! k& F: }
asm(" SETCINTM ");
" f; H5 M/ `1 W' A7 a( x& m; Sasm(" CLRCSXM");% V/ Z. b& h% X! p5 M/ w8 Y1 U
asm(" CLRCCNF");
# J! v0 G& c! b( g6 masm(" CLRCOVM");
" d2 G. h& N% E4 ASCSR1=0x02FC;# g$ S, \# o5 A4 ]
WDCR=0x006F;
* W/ ]2 B7 b0 G8 s( E( q' W2 lKickDog();
% ?) v9 c) `) d4 cIFR=0xFFFF;
) ^% k. x5 H! e' I1 v6 b% ]! LIMR=0x0003;
* G; `* f' F! p5 k0 G4 u# t. L8 I! j
}5 G2 x2 d# X2 `) @8 S( d

' W+ u- e1 B- A$ s9 U/ G0 F$ nvoid Timer1Init()/ P( Q: A7 g+ X- I4 n. e
{9 n" L6 ?' T9 Z# T% o
' `" H% K0 x  X. Y1 A- h0 Z
EVAIMRA=0x0080;//定时器1周期中断使能
/ x# k% i) }4 b" C& L4 _EVAIFRA=0xFFFF;//清除中断标志
: Q/ }; v1 X; tGPTCONA=0x0000;
- g# A. t1 [4 b' u8 ]T1PR=2500;//定时器1初值,定时0.4us*2500=1ms* i& L- y# I1 |! x
T1CNT=0;
6 ]( T  {" L# ]; W3 F/ OT1CON=0x144E;//增模式, TPS系数40M/16=2.5M,T1使能; @; `3 K, M) Y

  ^8 P( E( Q# o; h2 o" l6 F}
' |7 |: g! ]. |/ b5 F4 q7 R/ Uvoid CAN_INIT()2 i" ?) T( v* P- `! y* ~2 g
{0 ~# j9 y1 n0 Z$ g7 d
MCRB=MCRB|0X0C0;// 设置IOPC6、IOPC7 为 CANRX,CANTX; V+ }1 l' ^4 T& q: @  X
CANIFR=0XFFFF;// 清所有CAN中断标志7 E, M: \* }9 D
CANLAM0H=0X7FFF;// 设置邮箱2、3的屏蔽ID寄存器. C6 H8 q) \( p: A
CANLAM0L=0XFFFF;// 0则ID必须匹配
: X. x- m# `. i+ e) c9 p8 A- B- `CANMCR=0X1040;//CCR=1 改变配置请求
- R2 Z8 y4 B: B' m6 e7 uwhile(CANGSR&0X0010==0)continue;// 当CCE=1 时即可配置 BCR2,BCR1 寄存器
! g+ I1 Q/ ]# {CANBCR2=0x01;% u/ P, J/ |1 h8 ~
CANBCR1=0x0033;  f1 c2 u) g4 h$ c6 a' a9 l
CANMCR=CANMCR&0XEFFF;//CCR=0 改变配置结束请求# I2 h2 Z3 q. W. h
while(CANGSR&0X0010!=0)continue; // 只有当CEE=0时,BCR2,BCR1 寄存器配置成功
% Y6 [( x" a" m6 U; D- }. i5 tCANMDER=0X040;// 不使能邮箱,邮箱2设为接收方式
& E; T' o! W# w2 M+ S7 f2 k3 ACANMCR=0X0143;//CDR=1,数据区改变请求( ^6 _; h: @4 z
CANID2H=0X2447;// 设置邮箱2的控制字及ID6 H4 ?$ y- k" }# G
//IDE=0, AME=0, AAM=0+ N8 d' K" M! [& l: q. h  O( @
// 标准方式为MSGID2H[12-2]) s6 U! ]6 n# P- ~) k0 {! Y$ D
CANID2L=0XFFFF;- ^! ~; O3 h1 D( o. \+ ]* P
CANCTRL2=0X08; // 设置控制域
; N  C' d8 R( ^// 数据长度DCL = 8,RTR=0 数据帧
& P- v; H1 B6 e7 e. f* y7 rCANBX2A=0X0000;// 邮箱2信息初始化
  ^6 G9 ^3 y8 k$ D2 rCANBX2B=0X0000;
- k: w8 q% @$ _5 N! ]5 I' ~CANBX2C=0X0000;
/ M- g* B5 {' P* y5 K/ f* `, nCANBX2D=0X0000;7 n, M' G% r6 J- O% J) z9 {
CANID3H=0X2447;// 设置邮箱3的标识符% _0 P% n( r. t) ^$ ~& _  p
CANID3L=0XFFFF;
' J& B" z3 O, n( m( R( Q* qCANCTRL3=0X08;//RTR=0,DCL=8
" r# e& E0 c% T, Z3 O* SCANBX3A=0X10;// 邮箱3信息初始化+ ^% H+ c) n( v, i3 p' X7 P
CANBX3B=0X10;
, l& ]4 u. R" R* b% jCANBX3C=0X10;4 X, `  t' n" ?$ {, S6 \% p
CANBX3D=0X10;: V0 ^0 g$ \9 W; n2 }
CANMCR=0X04C0;//DBO=1,ABO=1,STM=1设置为自测试模式/ l3 O# O6 q2 z& I" z
CANMDER=0X4C;//ME3=1,MBX3 发送, ME2=1 接收& {: q/ K6 m3 }0 F0 f1 U7 E' ~
CANIMR=0X0400;// 中断MBX3 不使能 ,MBX2使能, 高中断优先级) j7 |$ u( \9 e, B
CANIFR=0XFFFF;// 清全部中断标志9 }$ g; W( h( w5 s+ W* T
}
5 N" B3 y& x; h6 S; b3 O) `' c9 N. Z# A
& Z1 T4 c4 L* a9 o3 f
void interruptc_int2()) K0 C% p  i! o4 V' n
{, Q* u3 a! g3 W" l( O# V# D2 f

/ p* U0 R' K. [1 O& }- ^if(PIVR!=0x27)  g; G! C" s* i5 E' y  @( _
{asm(" CLRC INTM ");0 Z+ f0 [! O, X) [2 A( ?( Y
return;
9 @" |. i2 u3 p! V}- ?1 R, C, U% c, w& {
T1CNT=0;5 H- R4 x: P7 v4 N. L: c& E( t
numled++;( y5 H, a0 y. f, Z, q

  M- Z8 k9 K# TEVAIFRA=0x80;; t) Q  W9 }( y  w8 o8 G
asm(" CLRCINTM ");. b* r9 w2 B) F! g
& S4 H1 P" p- R4 g: c
}
- A4 z& |7 }: `( l3 d2 l, v; O& Vvoid interruptc_int1() // 中断入口程序
( e* a4 j" }  ?: W' A4 ^{
: Z9 }) Z) {2 r0 sswitch(PIVR)
2 B0 e: w9 ^" a" u: D{4 N8 c' `$ g$ p% m' f# p
case 0x40:
$ g/ ^8 _! Q2 d6 BCANRCR=0X040;// 复位 RMP2 和 MIF2
, H; t: X' {6 N" c% Z4 h0 s6 `+ d" pCAN_FLAG=1;// 置用户接收标志
$ |( U0 W  J) f: ~3 k" I
5 t6 d2 m: X2 V2 ^, f, ybreak;
+ g0 {- W5 E  ]3 Q}
  i# T! y* Q( R$ O}0 |6 _3 H) @& v% r- V/ j
* a8 h' Z- b5 s* r0 @8 V1 K" Y  P
void KickDog()* c, \' |( |  q; c1 k6 d8 l  m
{: R1 J2 f9 w/ Q5 x% w* ^/ a9 G
WDKEY=0x5555;
5 T& d7 T% A, w. x& uWDKEY=0xAAAA;
! z# R1 A. [' B6 X. A. o) b8 L}4 d2 C" l- \# o/ |9 T  x
但是调试发现,邮箱能正常发送和接受,就是进不去中断,查了一上午才解决问题。对于DSP的外设中断,INT1到INT6,在Define.asm中有相应的中断向量表与之对应,如下:
% n+ ^3 }7 @, }/ U5 |9 k;建立中断向量表& ~* O( w! |$ @, M' W* {# i1 o2 k% Y
.sect".vectors"5 C  S! f( Q" ^* W% y5 n7 r
RSVECTB_c_int0
9 D. f4 a) u$ a! QINT1B_c_int18 @6 v% E2 x5 D4 s
INT2B_c_int2
& L4 V7 z& Q  cINT3BPHANTOM, ~7 y9 e  L0 u2 o! b
INT4BPHANTOM
3 y/ y- V8 r( D" ^3 G4 FINT5BPHANTOM
, k* G! S5 I$ }5 o! v/ _: iINT6BPHANTOM
' ?; W1 X9 x' x6 ^# o" Y3 B对于邮箱2 的高优先级中断c_int2,一开始并没有在此定义,因此无法进入相应的中断,将原先的PHANTOM改为_c_int1就行了,即为其建立中断入口地址。_c_int与C语言的c_int是一样的。  E" ?# \$ C/ ]$ m# @+ k& E/ D1 A
PIVR是外设中断向量寄存器,用于存储最近一次被应答的外设中断的地址向量,其具体值可在中断源优先级和中断向量表中查的,对于每一个外设都有一个唯一的中断向量入口地址与之对应。- y0 M4 P6 o' w  c) X( w2 K5 V
  • 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 08:18 , Processed in 0.171875 second(s), 23 queries , Gzip On.

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

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

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