当前做的项目需要100米距离的CAN通信,亲自体验了一番通信速率与距离的关系。在项目中要想数据传送得远就需要把波特率降低。我刚开始设置的波特率为100K,实测有时候会掉线。后面把速率降低到50K,通信就稳定了。
// 其他,初始化失败;
/* // 100K
CAN_InitStructure.CAN_SJW=CAN_SJW_1tq; //重新同步跳跃宽度(Tsjw)为tsjw+1个时间单位 CAN_SJW_1tq~CAN_SJW_4tq
CAN_InitStructure.CAN_BS1=CAN_BS1_7tq; //时间段1的时间单元. Tbs1范围CAN_BS1_1tq ~CAN_BS1_16tq
CAN_InitStructure.CAN_BS2=CAN_BS2_6tq; //时间段2的时间单元. Tbs2范围CAN_BS2_1tq ~ CAN_BS2_8tq
CAN_InitStructure.CAN_Prescaler=6; //分频系数(Fdiv)为brp+1
*/
/* // 50K
CAN_InitStructure.CAN_SJW=CAN_SJW_3tq; //重新同步跳跃宽度(Tsjw)为tsjw+1个时间单位 CAN_SJW_1tq~CAN_SJW_4tq
CAN_InitStructure.CAN_BS1=CAN_BS1_6tq; //时间段1的时间单元. Tbs1范围CAN_BS1_1tq ~CAN_BS1_16tq
CAN_InitStructure.CAN_BS2=CAN_BS2_1tq; //时间段2的时间单元. Tbs2范围CAN_BS2_1tq ~ CAN_BS2_8tq
CAN_InitStructure.CAN_Prescaler=84; //分频系数(Fdiv)为brp+1
*/
// 25K
CAN_InitStructure.CAN_SJW=CAN_SJW_1tq; //重新同步跳跃宽度(Tsjw)为tsjw+1个时间单位 CAN_SJW_1tq~CAN_SJW_4tq
CAN_InitStructure.CAN_BS1=CAN_BS1_6tq; //时间段1的时间单元. Tbs1范围CAN_BS1_1tq ~CAN_BS1_16tq
CAN_InitStructure.CAN_BS2=CAN_BS2_1tq; //时间段2的时间单元. Tbs2范围CAN_BS2_1tq ~ CAN_BS2_8tq
CAN_InitStructure.CAN_Prescaler=210; //分频系数(Fdiv)为brp+1
/*// 20K
CAN_InitStructure.CAN_SJW=CAN_SJW_3tq; //重新同步跳跃宽度(Tsjw)为tsjw+1个时间单位 CAN_SJW_1tq~CAN_SJW_4tq
CAN_InitStructure.CAN_BS1=CAN_BS1_6tq; //时间段1的时间单元. Tbs1范围CAN_BS1_1tq ~CAN_BS1_16tq
CAN_InitStructure.CAN_BS2=CAN_BS2_1tq; //时间段2的时间单元. Tbs2范围CAN_BS2_1tq ~ CAN_BS2_8tq
CAN_InitStructure.CAN_Prescaler=210; //分频系数(Fdiv)为brp+1
*/
/* // 10K
CAN_InitStructure.CAN_SJW=CAN_SJW_3tq; //重新同步跳跃宽度(Tsjw)为tsjw+1个时间单位 CAN_SJW_1tq~CAN_SJW_4tq
CAN_InitStructure.CAN_BS1=CAN_BS1_6tq; //时间段1的时间单元. Tbs1范围CAN_BS1_1tq ~CAN_BS1_16tq
CAN_InitStructure.CAN_BS2=CAN_BS2_2tq; //时间段2的时间单元. Tbs2范围CAN_BS2_1tq ~ CAN_BS2_8tq
CAN_InitStructure.CAN_Prescaler=420; //分频系数(Fdiv)为brp+1
*/
上面是CAN不同波特率下的配置,可以参照我前面发的文章,里面有工程文件,需要自取。