CAN高速与低速/容错:
高速:5K-1M的通信速率,在每个端点接上120欧姆的电阻。
低速:也叫容错CAN,通信速率为5K-125K,此标准下,允许CAN通信连线失败的情况下通信继续。
显性电平的逻辑值为“0”,隐性电平为“1”。
加入120欧姆电阻是为了匹配总线抗阻,提高数据的抗干扰性以及可靠性。
CAN通信的特点:
优点:
1.采用两线串行通讯方式,具有较强的错误检测能力,可以在高噪声干扰环境下工作
2.具有实时性强,传输距离长,抗电磁干扰强,成本低的优点。
3.可靠的错误处理和错误检测机制
4.可根据报文的ID决定接收或屏蔽该报文
5.具有通过CAN控制器将多个控制模块连接到CAN总线以形成多主机本地网络的优先级和仲裁功能
6.消息的身份可以决定接收还是屏蔽消息
7.如果传输的信息已损坏,则可以自动重新传输
8.该消息不包含源地址和目标地址,仅使用标志来指示功能信息和优先级信息
9.节点在错误严重的情况下具有自动退出总线的功能
缺点:
1.不一致性:节点A认为帧出错,节点B不认为出错
2.不可预测性:由接收错误计数器的值,进而影响节点状态
3.信道出错堵塞:数据帧正确,但是因为一些原因数据一直发送不出去
CAN速率与距离:
通信距离最远可达10KM(速率低于5Kbps),速率最高可达到1Mbps(通信距离小于40M)。传输距离和速率成反比,且对线材要求比较高。
CAN帧格式:
CAN远程帧与数据帧:
远程用于向某一can节点请求数据,相对于数据帧缺少数据段,且数据帧的发送优先级远高于远程帧的优先级。
远程帧就像命令,请求指定的ID节点返回数据。主要用于请求某个指定的节点发送数据,避免总线冲突。
CAN标准帧与扩展帧:
can的标准帧与扩展帧相差不大,扩展帧的仲裁段ID部分有29位而标准帧只有11位(仲裁段还包括1位远程帧标识符,1:远程帧 0:数据帧)。扩展帧主要是帧ID的扩展,即为了增加更多的can节点。
注意:帧ID不是表示发送的目的地址,表示的是其优先级,ID越小,优先级越高,最高优先级为0X000。
CAN总线仲裁:
CAN控制器在发送数据时,实时监测数据线的电平是否与发送数据对应电平相同,如果不同则做其他处理。如果处于仲裁段则退出总线竞争,处于其他段则产生错误事件(除去帧ACK时间段或被动错误标志传输期间)。
CAN协议:
CAN协议的保温传输过程中有数据帧、远程帧、错误帧、过载帧和帧间隔。
1.数据帧:用于发送节点向接收节点传输数据的帧(传统数据发送)。
2.远程帧:用于接收节点向具有相同ID的发送节点传送数据的帧(请求某一节点发送数据)。
3.错误帧:用于当检测出错误时向其他节点通知错误的帧(数据有问题)。
4.过载帧:用于接收节点通知其尚未做好准备的帧(接收不过来了)。
5.帧间隔:用于将数据帧及远程帧与前面的帧分隔开来(间隔时间)。
CAN在STM32中的应用:
STM32F4中can的发送:
ptx_msg->StdId = m->cob_id;//帧ID
if(m->rtr){
ptx_msg->RTR = CAN_RTR_REMOTE;
}
else{
ptx_msg->RTR = CAN_RTR_DATA;
}
ptx_msg->IDE = CAN_ID_STD;
ptx_msg->DLC = m->len;
for(int i = 0; i < m->len; i++){
ptx_msg->Data[i] = m->data[i];
}
if( CAN_Transmit( CAN1, ptx_msg )==CAN_NO_MB ){
//发送 并判断是否发送失败
}
STM32H7中can的发送:
while(!(HAL_FDCAN_GetTxFifoFreeLevel(&FDCANx_Handler))){
delay_100us(100);
//查询队列是否满
}
FDCANx_TxHeader.Identifier = canID;//帧ID
FDCANx_TxHeader.IdType = FDCAN_STANDARD_ID;//标准ID
FDCANx_TxHeader.TxFrameType = FDCAN_DATA_FRAME;//数据帧
FDCANx_TxHeader.DataLength = FDCAN_DLC_BYTES_8;//数据长度
FDCANx_TxHeader.ErrorStateIndicator = FDCAN_ESI_ACTIVE;//激活错误状态指示
FDCANx_TxHeader.BitRateSwitch = FDCAN_BRS_OFF;//关闭速率切换
FDCANx_TxHeader.FDFormat = FDCAN_CLASSIC_CAN;//传统的CAN模式
FDCANx_TxHeader.TxEventFifoControl = FDCAN_NO_TX_EVENTS;//无事件
FDCANx_TxHeader.MessageMarker = 0; //标识状态
if(HAL_FDCAN_AddMessageToTxFifoQ(&FDCANx_Handler,&FDCANx_TxHeader,msg)!= HAL_OK){
//msg是8字节的数组指针 此处发送数据
Error_Handler(__FILE__, __LINE__);
}
//接收can数据
//FDCAN_HandleTypeDef *hfdcan
HAL_FDCAN_GetRxMessage(hfdcan,FDCAN_RX_FIFO0,&FDCANx_RxHeader,rxdata);
STM32H7中的CAN是可以为FDCAN的,其是在CAN上的升级版本。
具有
1.数据长度由8个字节上升到64字节。
2.通信速率由1M上升到5M。其在仲裁段的通信速率跟CAN一样最高为1M,这样可以保证总线的健壮性,但是在数据段的速率可以达到5M,一个数据帧采用不同的速率发送,这就是FD的由来。
3.向下兼容CAN。