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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
一个项目要用到TMS320LF2407 DSP,之前没用过,花了一天时间了解了一下基本操作,就开始调试CAN控制器。
/ l- r6 }) [) y' Q- E/ ^使用CAN自测模式,设置邮箱3发送、邮箱2接收,并使能邮箱2的接收中断、高优先级,main.c如下:
4 c/ u9 d3 `! c% v
0 H  S0 t# a: z+ d( d- G6 h#include "global.c": @( Y) X0 ~# p+ \" Y! r, n- E
void SystemInit();, R7 b' H* D8 Y' R4 Q
void Timer1Init();. L) L  o6 Q% l2 t1 F
void KickDog();8 V/ E; U! }* P3 \4 ^
void CANMBX_ISR();
5 a% s: w, C6 z2 `( l0 Q) U: s2 m+ bvoid CAN_INIT();1 b* l. e% ^) x$ Q
unsigned int numled=0;
: ]3 I3 E7 g& R! ^unsigned int CAN_FLAG;// 定义标志寄存) k+ z: \+ b" \5 U7 y
/ r2 i$ v* s8 j4 L" j
2 V, g. _8 o( q& @6 g; n
main()
# o% |5 J. Q2 c3 r7 q' K" K{
8 R8 ^. Y1 j- c2 A( cunsigned int i=0;& D0 M5 w7 O; C/ i& c5 {' u9 L
unsigned int RCA0=0,RCB0=0,RCC0=0,RCD0=0,RCA1=0,RCB1=0,RCC1=0,RCD1=0;
4 c: C' B$ f; B' T; T5 L: J0 qSystemInit();//系统初始化
7 p* X$ f; j/ d$ u
' O2 m/ j% i: P+ ?: V" bMCRC=MCRC & 0xFF00; //IOE0-7设为IO口模式( `: U8 C, u; x. h- [
PEDATDIR=0xFF00;//所有LED=0,, n" x2 o5 t; L% u
asm(" CLRC INTM ");// 中断使能
. g' _# V3 s3 l) r8 i* [" MCAN_FLAG=0X00;// 清CAN用户标志,CAN_FLAG=01表示接收到数据
4 O: ]- ]! d2 b  [CAN_INIT();// CAN初始化程序
. s9 p. }* @+ b' ^; l. e& zwhile(1)* h* m8 G% n! {, W1 f- O1 W
{
/ @( G" ]9 P1 u0 o7 P* l: ]CANTCR=0X20;// MBX3请求发送
7 S4 ~0 r8 t, v6 c3 g5 Pwhile(CANTCR&0X2000==0)// 等待发送应答5 D% Q& E+ N; P
continue;
  f) j& S7 B! O8 T5 qCANTCR=0X2000; // 清 TA3 和MIF3标志位2 S' X1 s. ~$ j# y- _
while(CAN_FLAG==0)
0 S% h# O& S3 }6 n" T" I9 B9 h* W( q//while(CANRCR&0x0040!=0x0040)  ?: p) B  X  B4 v$ [  q
continue;// 等待接收数据, g& z, h! S6 u0 T2 v
CANRCR=0x0040;//清接收悬挂位6 G9 b  f! |! t4 Y$ p' L! _+ w3 `# T
CAN_FLAG=0;
: {9 ~0 ~4 b; R" c1 R/ z4 ^' |3 z" li++;// 清接收到标志
  L& l) K; [9 g4 NCANMDER=0X0000;// 邮箱不使能
* @3 l2 ?( l3 H. G4 ^7 l* yCANMCR=0X0140;//CDR=1,数据改变请求8 v/ I3 p5 ]! }- q

" ?2 O, v: c1 A1 ICANBX3A=CANBX3A+1;// 邮箱2中数据加1用来更新邮箱3中的数据( L& A0 s) [4 b
CANBX3B=CANBX3B+1;
: H, ~& R: o- I4 y6 HCANBX3C=CANBX3C+1;! T& D8 j( y( S- z" ?. j
CANBX3D=CANBX3D+1;
" Q: |- Y2 ~0 D+ M) [% r: \5 nCANMCR=0X04C0;//DBO=1,CDR=0,ABO=1,STM=18 Z0 b* i3 j% j/ M0 Q2 G
CANMDER=0X04C;//ME2=ME3=1,MBX2接收, MBX3发送, h2 ]; c  T3 d4 ]- [
2 r( ]) u9 s$ `$ j3 g
RCA1=CANBX2A;( l/ @) T4 r8 o* ]0 ~
RCB1=CANBX2B;) n4 c3 M" N; b  z
RCC1=CANBX2C;
# G* f3 p% d# b4 TRCD1=CANBX2D;0 \2 {$ x& E. s- q# K' I; m, C: U3 w

$ U5 ?; i# ?. f# t- {* ~8 U
9 O# b0 p4 Y$ h' b, B% C}
& u( j" B$ N6 i0 z( m}
" l& _4 w# g2 w" Z$ Uvoid SystemInit()
2 M* ~! z9 `/ o$ f9 O9 E{
8 |$ E/ t* u. b+ ^4 y
% E  Y$ q' m- q1 N/ qasm(" SETCINTM ");; s: C3 @, I5 h; H% F1 u1 W- N0 @
asm(" CLRCSXM");. g3 W( R5 W( E
asm(" CLRCCNF");9 K- b# x/ u$ h6 R# H1 T4 U0 L/ N
asm(" CLRCOVM");3 |- y9 S1 d; u6 Q1 D
SCSR1=0x02FC;
  P" x! M1 m& q2 W5 ?WDCR=0x006F;
* s; P% R) l( e6 w: ~KickDog();; K( W! Q% }0 J* |7 s& p
IFR=0xFFFF;2 h5 R0 x; [5 ^' D# z' v* ?+ h
IMR=0x0003;: Y1 p! A, W! q; h; |

' ~! v' f+ R4 Y6 n- P5 H}& Y# H) W' `  R3 W1 |
' x9 ^, G+ P! {% _
void Timer1Init()
& W( p  P- M/ _& V) a4 k4 p{" a1 t  h* L) F- f+ J0 j- v+ _

$ J4 m+ W/ p. L* x: fEVAIMRA=0x0080;//定时器1周期中断使能
' ~( F2 S1 o1 T) rEVAIFRA=0xFFFF;//清除中断标志. ^  j# W& I4 ?% [7 p+ @
GPTCONA=0x0000;0 z5 s8 ?* |" ^# j) c# q
T1PR=2500;//定时器1初值,定时0.4us*2500=1ms* z* ]( ~. F; {9 T6 G$ A( i$ z! e4 W: F8 c
T1CNT=0;8 c, |9 x" H( u! ~) s# N
T1CON=0x144E;//增模式, TPS系数40M/16=2.5M,T1使能; @$ T0 {5 R$ R& O" N

2 e$ G# B; k. x6 V6 d6 W, `}
, k) ^! V+ c5 Zvoid CAN_INIT()) W* R: @4 ?9 z' g) w! h- v0 R
{8 L7 j& S' P* @; t5 O" b
MCRB=MCRB|0X0C0;// 设置IOPC6、IOPC7 为 CANRX,CANTX1 w4 a; n: y- l
CANIFR=0XFFFF;// 清所有CAN中断标志
! H8 p1 n8 [" q! V; p3 y8 ~$ b6 DCANLAM0H=0X7FFF;// 设置邮箱2、3的屏蔽ID寄存器' p4 I" l0 c. \, ^$ Q  |5 m: g: T
CANLAM0L=0XFFFF;// 0则ID必须匹配
4 E- F) y1 D! {8 dCANMCR=0X1040;//CCR=1 改变配置请求
7 l6 f5 e' A$ X. Vwhile(CANGSR&0X0010==0)continue;// 当CCE=1 时即可配置 BCR2,BCR1 寄存器
* J5 y6 c  K; u. i7 y# DCANBCR2=0x01;! k* Z! @: r" R7 ^
CANBCR1=0x0033;! {8 n; U! h- o
CANMCR=CANMCR&0XEFFF;//CCR=0 改变配置结束请求
6 h0 ~( B- x3 N8 Q  R4 c: T7 @while(CANGSR&0X0010!=0)continue; // 只有当CEE=0时,BCR2,BCR1 寄存器配置成功- z) ~7 e1 Y! v1 h  b
CANMDER=0X040;// 不使能邮箱,邮箱2设为接收方式
3 I. h" D  j5 i) |! C2 kCANMCR=0X0143;//CDR=1,数据区改变请求
4 {7 j! K! M" i2 T, F1 M+ ZCANID2H=0X2447;// 设置邮箱2的控制字及ID
# @7 ]* r8 |2 _- b8 r8 ?//IDE=0, AME=0, AAM=0
/ G3 l: X8 `% N$ v// 标准方式为MSGID2H[12-2]) x, D' d- |$ G9 N0 E" {/ w
CANID2L=0XFFFF;
# J8 X0 v4 A" j& jCANCTRL2=0X08; // 设置控制域
( Y4 |  D" C9 o* i% q% _// 数据长度DCL = 8,RTR=0 数据帧
' f. c2 x1 J8 f& m* g) ACANBX2A=0X0000;// 邮箱2信息初始化, d6 n- r1 z; D
CANBX2B=0X0000;
9 t$ }" O* g5 a& \4 Y5 ECANBX2C=0X0000;/ _: q  B1 v( a' b0 m
CANBX2D=0X0000;
- _8 ]9 d" u& u& f2 Q/ ACANID3H=0X2447;// 设置邮箱3的标识符
8 F5 r  w+ s( S2 g! |0 XCANID3L=0XFFFF;9 ^0 s, C3 N, _$ v; L- b+ ^
CANCTRL3=0X08;//RTR=0,DCL=86 q2 S5 ^* U1 p, s+ @; i; v4 t
CANBX3A=0X10;// 邮箱3信息初始化
) X/ ~8 t1 s! `5 mCANBX3B=0X10;
/ l0 j6 `; d* p8 K3 aCANBX3C=0X10;3 S# b# @" c, j
CANBX3D=0X10;
4 R7 C/ x5 ]  {5 Y  L7 ?CANMCR=0X04C0;//DBO=1,ABO=1,STM=1设置为自测试模式
" u+ G. U& f7 |9 l/ I- m! |CANMDER=0X4C;//ME3=1,MBX3 发送, ME2=1 接收) x& S+ p: T8 _( {
CANIMR=0X0400;// 中断MBX3 不使能 ,MBX2使能, 高中断优先级
, _6 m; O1 K1 ~8 x/ f! fCANIFR=0XFFFF;// 清全部中断标志. A, \; _, J2 y7 {: j7 B
}
+ U4 P' M$ v, W" ~! [% l1 E3 r( Y# t0 V* \& O
7 H# f$ p* f6 W9 w
void interruptc_int2(), f- g  C) }5 r# t; g" D; y
{
* z& i* {) \$ c* v8 ~. N5 J( ?$ Y" d* B5 `
if(PIVR!=0x27)
# H; S. f" Y2 m( f{asm(" CLRC INTM ");# E/ T. m$ h: D# `3 H1 ~' w
return;  `; g; G! @+ P' n  `0 q# _$ N
}! R$ v  l2 e6 R; N
T1CNT=0;/ V4 V- _$ t. {+ z
numled++;( p0 N# ^7 r+ V0 s; x2 L

$ _9 C7 ~/ v4 ^; b+ N5 pEVAIFRA=0x80;. Z  i* \# y1 t9 p3 `1 C; N+ j
asm(" CLRCINTM ");
  U0 r2 j7 ^( d4 B6 P8 n& f5 a8 H
5 z* I4 ]; W; \& |6 `* m}
" l% l4 H( `1 I  F  nvoid interruptc_int1() // 中断入口程序
1 L" O" G6 W7 U% i{
5 R1 A/ f' P* b5 Y" Gswitch(PIVR)
2 S/ O) L6 O8 j{" U1 E0 _9 N# H; g  j; q
case 0x40:; y2 F% O( e4 I, V, B! v' z. a; ~$ P
CANRCR=0X040;// 复位 RMP2 和 MIF27 @  L' P4 R% x! l- O2 O7 Z
CAN_FLAG=1;// 置用户接收标志9 i: F' Z$ }+ X  p7 X; j7 E( c8 G

. z+ o/ m9 y: k) gbreak;8 q9 ^) a1 b2 d( V1 p+ ~
}
; Z# }6 f; d. V- S}
/ y% S: N4 Y' L9 m
& j" i) M; ]2 t3 D, e3 d) o4 L8 Fvoid KickDog()
* s6 q0 ~! h8 x: z, x{1 k3 K' w8 z& `, ?2 O
WDKEY=0x5555;
: u, H3 h" K0 L/ sWDKEY=0xAAAA;" R4 D( R3 t  o) i0 h
}3 {" m8 M0 h7 ~2 o3 h
但是调试发现,邮箱能正常发送和接受,就是进不去中断,查了一上午才解决问题。对于DSP的外设中断,INT1到INT6,在Define.asm中有相应的中断向量表与之对应,如下:
6 u  p+ u( ^; l& E$ o5 j;建立中断向量表! i6 ^; G  y) g) a  U
.sect".vectors"7 |5 W4 Q' g2 u7 y' u$ O
RSVECTB_c_int0
4 O6 m6 S7 o. d3 B: z5 |% h: q" ^INT1B_c_int1
% [1 J2 K) `- s3 U! N% H) KINT2B_c_int2
1 \8 B& J) R) P3 h* F+ W( S" ?INT3BPHANTOM
! L6 ~# m; {( J7 S) [1 TINT4BPHANTOM
, L9 c% M# q2 V* G5 B7 oINT5BPHANTOM
2 Z6 k6 F' u& t, T, w4 I  \' qINT6BPHANTOM' x9 \3 L9 W0 v8 n
对于邮箱2 的高优先级中断c_int2,一开始并没有在此定义,因此无法进入相应的中断,将原先的PHANTOM改为_c_int1就行了,即为其建立中断入口地址。_c_int与C语言的c_int是一样的。
! Y8 s+ _4 n, }3 yPIVR是外设中断向量寄存器,用于存储最近一次被应答的外设中断的地址向量,其具体值可在中断源优先级和中断向量表中查的,对于每一个外设都有一个唯一的中断向量入口地址与之对应。5 ]8 h" N# ~/ I7 `& R/ v! q+ Y
  • TA的每日心情
    开心
    2022-12-5 15:37
  • 签到天数: 2 天

    [LV.1]初来乍到

    5#
    发表于 2021-6-10 18:11 | 只看该作者
    实用的分享
  • TA的每日心情
    慵懒
    2022-12-26 15:28
  • 签到天数: 1 天

    [LV.1]初来乍到

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

    [LV.1]初来乍到

    2#
    发表于 2021-5-12 15:50 | 只看该作者
    PIVR是外设中断向量寄存器,用于存储最近一次被应答的外设中断的地址向量
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

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

    EDA365公众号

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

    GMT+8, 2025-11-24 12:07 , Processed in 0.187500 second(s), 24 queries , Gzip On.

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

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

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