打印
[DSP编程]

关于28035的编程问题

[复制链接]
1977|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
cjystar|  楼主 | 2014-3-17 14:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
__interrupt void ecan_rec_isr(void)
{
        int ax,mailbox_num;
        ax=ECanaRegs.CANGIF0.all;
        if(ax<0)
        {
                mailbox_num=ax&0x0f;
                can_msg[msg_cnt].mail_num=mailbox_num;
                switch(mailbox_num)
                {
                case 0:        can_msg[msg_cnt].MDH=ECanaMboxes.MBOX0.MDH.all;
                        can_msg[msg_cnt].MDL=ECanaMboxes.MBOX0.MDL.all;
                        ECanaRegs.CANRMP.bit.RMP0=1;  //clear receive int;
                        break;
                case 1:        can_msg[msg_cnt].MDH=ECanaMboxes.MBOX1.MDH.all;
                        can_msg[msg_cnt].MDL=ECanaMboxes.MBOX1.MDL.all;
                        ECanaRegs.CANRMP.bit.RMP1=1;  //clear receive int;
                        break;
                case 2:        can_msg[msg_cnt].MDH=ECanaMboxes.MBOX2.MDH.all;
                        can_msg[msg_cnt].MDL=ECanaMboxes.MBOX2.MDL.all;
                        ECanaRegs.CANRMP.bit.RMP2=1;  //clear receive int;
                        break;
                case 3:        can_msg[msg_cnt].MDH=ECanaMboxes.MBOX3.MDH.all;
                        can_msg[msg_cnt].MDL=ECanaMboxes.MBOX3.MDL.all;
                        ECanaRegs.CANRMP.bit.RMP3=1;  //clear receive int;
                        break;
                case 4:        can_msg[msg_cnt].MDH=ECanaMboxes.MBOX4.MDH.all;
                        can_msg[msg_cnt].MDL=ECanaMboxes.MBOX4.MDL.all;
                        ECanaRegs.CANRMP.bit.RMP4=1;  //clear receive int;
                        break;
                case 5:        can_msg[msg_cnt].MDH=ECanaMboxes.MBOX5.MDH.all;
                        can_msg[msg_cnt].MDL=ECanaMboxes.MBOX5.MDL.all;
                        ECanaRegs.CANRMP.bit.RMP5=1;  //clear receive int;
                        break;

                }
                msg_cnt++;
        }
        else
        {
                ECanaRegs.CANGIF0.all|=0xffffffff;        //clear undesired   int
        }

        PieCtrlRegs.PIEACK.bit.ACK9 = 1;    // Enables PIE to drive a pulse into the CPU

}
以上是一段eCAN的接收中断的程序,我的疑问是ax=ECanaRegs.CANGIF0.all;
        if(ax<0)
这里的判断ax也就是CANGIF0寄存器怎么会是小于零的,在什么情况下是小于零的?

相关帖子

沙发
wangch_sh| | 2014-3-17 17:48 | 只看该作者
ax是int型,超过32767就小于0啦!也就是16进制最高位为1.

使用特权

评论回复
评分
参与人数 1威望 +4 收起 理由
zhangmangui + 4 赞一个!
板凳
zhangmangui| | 2014-3-17 18:39 | 只看该作者
28035的CAN熟悉的朋友帮忙解决一下

使用特权

评论回复
地板
cjystar|  楼主 | 2014-3-17 18:39 | 只看该作者
本帖最后由 cjystar 于 2014-3-17 18:44 编辑
wangch_sh 发表于 2014-3-17 17:48
ax是int型,超过32767就小于0啦!也就是16进制最高位为1.

呵呵,是的,把这个忽略了。但是CANGIF0寄存器是32位的,而ax是int的是16位的,用ax=ECanaRegs.CANGIF0.all;这个时候是不是ax中就是自动存放的是CANGIF0寄存器的前16位呢?32位的寄存器能赋值给16位的变量吗?

使用特权

评论回复
5
wangch_sh| | 2014-3-17 18:56 | 只看该作者
28035没用过,但是28335的CANGIF0寄存器的31到18位是保留的。17位是邮箱超时标志位,16位是定时邮递计数器溢出标志位。
15位是全局邮箱中断标志位。当这位为1时,邮箱成功发送或者接受一个消息。此时ax<0.
这时,17位和16位用不到,主要是第15位。

使用特权

评论回复
6
cjystar|  楼主 | 2014-3-17 19:01 | 只看该作者
wangch_sh 发表于 2014-3-17 18:56
28035没用过,但是28335的CANGIF0寄存器的31到18位是保留的。17位是邮箱超时标志位,16位是定时邮递计数器 ...

嗯,是的,28035的pdf上这点是跟28335的是一样的,谢谢你热心的解答。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

19

主题

80

帖子

1

粉丝