打印
[DSP编程]

关于28035的编程问题

[复制链接]
2190|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寄存器怎么会是小于零的,在什么情况下是小于零的?

相关帖子

沙发
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位的变量吗?

使用特权

评论回复
板凳
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

粉丝