jianhong_wu 发表于 2016-3-21 21:57:23

LPC1788单片机的CAN通讯只能发送不能接收数据,怎么办?发送函数要注意什么?已解答。

本帖最后由 jianhong_wu 于 2016-3-21 22:20 编辑

问:
LPC1788单片机的CAN通讯只能发送不能接收数据,怎么办?

★坚鸿-深圳:
这两天在调试LPC1788的CAN通讯,我用的是在淘宝新买的LPC1788开发板自带的程序范例,用的是其中带滤波功能的程序范例,用USB_CAN工具在电脑上位机上调试观察,结果,发现CAN只能往电脑发送数据,不能接收从电脑端发来的数据。
后来我发现,原来是我随手把原程序初始化代码的波特率从CAN_Init(CAN_1, 125000)改成了CAN_Init(CAN_1, 250000)导致的问题,把它改回CAN_Init(CAN_1, 125000)就好了。具体原因我没有深入研究,一方面有可能是这款单片机本身不支持250K波特率(但是感觉这个可能性不大),另一方面有可能是我所调的某些函数内部某个参数需要调整才能支持250K波特率,总之详细的原因我也没有再深入去挖掘,因为125K波特率已经够我项目上用了。
把这个问题写出来,希望给后来者提个醒,这里可能容易出错的地方。


问:
发送函数要注意什么?

★坚鸿-深圳:
有网友提醒,因为LPC1788内部有3个发送缓冲器,所以在发送数据前要先检测这三个缓冲是否全部为空,就是检测TBS位是否为1,否则发送的数据有可能颠倒。我修改后的程序代码如下:
void CAN1_WriteData(u32 u32Id)
{
               
        static u16 i;
        static u32 Su32Status;
       
        TXMsg.format = STD_ID_FORMAT;
        TXMsg.id = u32Id;
        TXMsg.len = 8;
        TXMsg.type = DATA_FRAME;
       
       
        for(i = 0;i < 4; i ++)
        {
                TXMsg.dataA = Gu8CanSendBuffer;
        }
       
       
        for(i = 0;i < 4; i ++)
        {
                TXMsg.dataB = Gu8CanSendBuffer;
        }
       
        i=0;
        while(1)
        {
    Su32Status=CAN_GetCTRLStatus (CAN_1, CANCTRL_GLOBAL_STS);
                if(0!=(Su32Status&CAN_GSR_TBS))
                {
                   break;
                }
               
                i++;
                if(0xffff==i)
                {
                   break;
                }
        }
       
       

        CAN_SendMsg(CAN_1, &TXMsg);
       

       

       
}


页: [1]
查看完整版本: LPC1788单片机的CAN通讯只能发送不能接收数据,怎么办?发送函数要注意什么?已解答。