打印
[PIC®/AVR®/dsPIC®产品]

PIC18F2580的CAN发送中断

[复制链接]
2919|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
smileage|  楼主 | 2015-4-2 17:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
第一次用PIC18F2580的ECAN模块通信,两块板子一发一收,发送板调试程序的时候发现CAN发送中断进不去,发送部分的程序如下:
                        TXB0CON=TXB0CON&0xf7;        /*bit3:TXREQ=0, 关请求发送*/
                        TXB0D0=key_num;                        /* 用接收数据来更新发送数据 */
                        TXB0D1=0;
                        TXB0D2=0;
                        TXB0D3=0;
                        TXB0D4=0;
                        TXB0D5=0;
                        TXB0D6=0;
                        TXB0D7=0;
                        TXB0CON=TXB0CON|0x08;        /* 请求发送,bit3:TXREQ=1 */
                        while(TXB0IF!=1) //while(TXB0REQ==1)
                        {
                                ;
                        }
程序一直在while循环里面,然后换成while(TXB0REQ==1) ,发现同样是在while循环里面一直没出来。将while循环去掉,程序能正常运行,而且接收板能正常接收数据了。
现在问题是为什么CAN发送中断进不去,而且TXB0REQ也不会清零呢?
我看了网上说CAN发送中断只有在接收方正确接收确认ACK以后才置位,我用示波器看了接收板的CAN发送端,也是有低电平的脉冲回应的。
沙发
cherry5174| | 2015-4-3 09:40 | 只看该作者
void CAN_TRA(u8t *pRegValue)
{
    while(TXB0REQ);

    TXB0REQ = 0;

    TXB0D0 = *pRegValue;
    TXB0D1 = *(pRegValue+1);
    TXB0D2 = *(pRegValue+2);
    TXB0D3 = *(pRegValue+3);
    TXB0D4 = *(pRegValue+4);
    TXB0D5 = *(pRegValue+5);
    TXB0D6 = *(pRegValue+6);
    TXB0D7 = *(pRegValue+7);

    TXB0REQ = 1;
    while( TXB0REQ == 1 );
}


我自己的发送函数供楼主参考

TXB0IF置位代表什么LZ仔细看一下手册

TXB0IF: CAN Transmit Buffer 0 Interrupt Flag bit
1 = Transmit Buffer 0 has completed transmission of a message and may be reloaded
0 = Transmit Buffer 0 has not completed transmission of a message

使用特权

评论回复
板凳
smileage|  楼主 | 2015-4-3 17:16 | 只看该作者
cherry5174 发表于 2015-4-3 09:40
我自己的发送函数供楼主参考

TXB0IF置位代表什么LZ仔细看一下手册

谢谢回答,你的程序和我的基本是一样的,
我用你的,while( TXB0REQ == 1 );也是过不去,不知道什么原因

使用特权

评论回复
地板
tdh03z| | 2015-4-4 19:11 | 只看该作者
CAN调试,必须要有一个正确的节点能够进行数据收发,你的板子一发一收能确定正常吗?
你可以在网上买个USBCAN调试器,这样会方便很多。

while( TXB0REQ == 1 );过不去还有可能是节点波特率不对

使用特权

评论回复
5
smileage|  楼主 | 2015-4-13 13:47 | 只看该作者
tdh03z 发表于 2015-4-4 19:11
CAN调试,必须要有一个正确的节点能够进行数据收发,你的板子一发一收能确定正常吗?
你可以在网上买个USBC ...

您好,我用CAN分析仪测试了,分析仪能收到数据,波特率一致的。但是while( TXB0REQ == 1 );这一句还是过不去,在这个循环内单片机一直发同样的数据,不知道是什么原因?

用两张板子一发一收我也试了,用了while( TXB0REQ == 1 );这一句就有问题,不用这句通信都正常。

使用特权

评论回复
6
smileage|  楼主 | 2015-4-13 15:38 | 只看该作者
谢谢大家,我的问题原因找到了,是因为CANH和CANL上并了104电容造成的,这个电容太大了,造成接收端反馈的显性确认ACK信号在发送端识别错误,造成发送失败的假象。

使用特权

评论回复
7
cherry5174| | 2015-9-1 10:22 | 只看该作者
smileage 发表于 2015-4-13 15:38
谢谢大家,我的问题原因找到了,是因为CANH和CANL上并了104电容造成的,这个电容太大了,造成接收端反馈的 ...

哈,问题还是得先从硬件查起啊

使用特权

评论回复
8
dogglove| | 2015-9-1 21:18 | 只看该作者
这个查找错误的过程很重要,善于总结,就是经验啊

使用特权

评论回复
来自Meizu MX4
9
coken491| | 2016-3-25 16:56 | 只看该作者
你好楼主,能分享下你这个源程序给我参考下吗?大侠。谢谢了,麻烦发下到suijianqi@sina.com

使用特权

评论回复
10
taogaowei| | 2017-1-3 10:43 | 只看该作者
记下来一个程序,虽然不完整

使用特权

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

本版积分规则

36

主题

266

帖子

3

粉丝