在一个项目中,笔者触摸过这样一个通讯体系,整个体系的通讯架构大约如下图,典型的一主多从。
假如Slave_N的N超越10,那这样一个通讯体系仍是比较复杂的。
笔者以为要这套体系有以下几点需求考虑:
1、通讯毛病处理
(1)假如整个体系中,主机或这从机呈现通讯毛病,此刻应该怎样处理?
笔者现在的做法是,每个DSP的CAN的收发函数,首要有一个毛病检测,一旦检测到毛病,则CAN中止收发数据,进入软件复位状况,假如没有检测到毛病,则继续进行通讯。这毛病是CAN寄存器总的毛病位。但这个做法,笔者还没细心测试过,是否有用,由于现在这套通讯体系还能够正常运转,没有呈现特别古怪的通讯毛病问题。
Uint16 ECanFaultHandle(void) //从机的毛病检测函数
{
struct ECAN_REGS ECanaShadow;
//ECanaRegs.CANTEC.bit.TEC //发送过错计数器
//ECanaRegs.CANREC.bit.REC //接纳过错计数器
if (ECanaRegs.CANES.bit.EW == 1) //呈现正告状况
{
EALLOW;
ECanaShadow.CANMC.all = ECanaRegs.CANMC.all;
ECanaRegs.CANMC.bit.SRES = 1; //开端软件复位
ECanaRegs.CANMC.bit.ABO = 1; //主动总线衔接使能
ECanaRegs.CANMC.all= ECanaShadow.CANMC.all;
EDIS;
return 0;
}
else if(ECanaRegs.CANES.bit.EP == 1) //被迫过错
{
EALLOW;
ECanaShadow.CANMC.all = ECanaRegs.CANMC.all;
ECanaRegs.CANMC.bit.SRES = 1; //开端软件复位
ECanaRegs.CANMC.bit.ABO = 1; //主动总线衔接使能
ECanaRegs.CANMC.all= ECanaShadow.CANMC.all;
EDIS;
return 0;
}
else if(ECanaRegs.CANES.bit.BO == 1) //离线
{
EALLOW;
ECanaShadow.CANMC.all = ECanaRegs.CANMC.all;
ECanaRegs.CANMC.bit.SRES = 1; //开端软件复位
ECanaRegs.CANMC.bit.ABO = 1; //主动总线衔接使能
ECanaRegs.CANMC.all= ECanaShadow.CANMC.all;
EDIS;
return 0;
}
else return 1;
}
(2)假如主机通讯没有毛病,而从机呈现毛病怎样办?
笔者的做法是,主机会对从机的CAN通讯进行检测,一旦检测到某个从机不再发送数据,则主机会报一个CAN通讯毛病,提示用户查看毛病源。
2、总线的带宽
一主多从的通讯体系,假如主机和从机一起进行向CAN总线发送数据,此刻CAN总线的数据必然十分多,但CAN总线的带宽是有约束的,当从机越来越多的时分,这必然会影响数据传输的速度,为了防止这个现象,怎样办?
当Slave_N的N超越20之后,该主机与从机该选用怎样的方法进行通讯呢?
笔者现在的做法,是选用的是主机恳求,从机呼应的方法,即一问一答,这有点相似Modbus协议。这样的方法,必然能够确保单位时刻CAN总线的带宽不会影响数据传输的速度,但这种做法的缺陷,假如从机数量过多,主机遍历从机的时刻必定越来越长,笔者以为,针对这种状况,一方面能够进步CAN通讯的波特率,另一方面能够缩短主机拜访从机的周期。
3、通讯的功率
通讯功率,这个词或许描绘得不行恰当,但针对这个一主多从的体系,咱们确实得考虑,数据交流的数量,数据交流的便利性,代码量等方面的问题。在本次体系设计时,从机作为仅仅作为被迫相应者,只要主机恳求时,从机才会呼应,一切从机只对主机担任,一个从机不恳求另一个从机,也不呼应另一个从机。
现在本次体系选用简化版的CANOpen协议,真实的CANOpen协议,笔者没有还触摸过,这个CANOpen协议是根据CAN的规范帧而拟定的。
下面详细介绍下整个体系的一些细节
CAN通讯格局:规范帧
暂时由于项目中进行CAN的主机与从机数量有限,故选用规范帧即可,今后项目假如需求进步,能够选用扩展帧,扩展帧与规范帧的格局仅仅是ID长度的差异。
通讯速率:100Kbps
这是一个比较保存的波特率,由于暂时能够满意项目需求,故没有寻求更高的波特率,在闭环总线上,CAN通讯速率最高可达1Mbps。
通讯周期:100ms
这是主机恳求从机的周期,即主机每隔100ms,恳求一个从机,然后相应的从机收到恳求后,再呼应。
CAN总线的物理衔接方法:闭环总线通讯网络
即主机与最终一个从机的CAN通讯接口,会并联一个120欧姆的电阻,这是为了阻抗匹配,那什么叫阻抗匹配,笔者也不明白,百度了下,我们自行了解下:阻抗匹配是指负载阻抗与鼓励源内部阻抗相互适配,得到最大功率输出的一种作业状况。关于不同特性的电路,匹配条件是不一样的。阻抗匹配(Impedance matching)是微波电子学里的一部分,首要用于传输线上,来达至一切高频的微波信号皆能传至负载点的意图,不会有信号反射回来源点,然后提高动力效益。
通讯协议
通讯协议,怎样解说呢,笔者以为一方面是主机与从机的通讯的时分,详细的数据交流方法,这种方法决议着通讯数据的误码率、可靠性,决议整个体系的数据交流功率。另一方面,进行通讯的数据,怎么存储,这决议着代码量等。
现在本体系中选用的通讯协议为简化版别的CANOpen协议,根据这套协议,从机能够将要和主机交流的数据都放在一个int型的数组中,该数组的长度为256,当然也能够更长,仅仅下面的协议要随之更改。
然后从机的数据存储方法,决议着整个体系的通讯协议,这套协议是根据CAN规范帧的最小单元而定的,也便是一帧规范帧数据而定的。主机在每帧数据中,能够拜访不同从机,能够对从机中不同的数组元素进行拜访,能够是读数组中的元素,也能够赋值给数组中的元素。然后从机收到主机的恳求后,经处理之后,再发送给主机一个规范帧,这帧数据,是从机告知主机通讯是否成功,一起也包括主机想要的内容。