精华内容
下载资源
问答
  • CAN通信知识梳理及在Stm32上的应用(HAL库)

    千次阅读 多人点赞 2020-07-18 20:51:52
    CAN是控制器局域网络...CAN是国际标准化的串行通信协议,采用数据块编码的方式,数据块根据帧的类型,能够让挂载在总线上的不同节点接收到相同的数据,再根据每个节点的配置对信息进行选择性处理(处理or丢弃)。
     
    

    一.CAN通信简介

    CAN是控制器局域网络(Controller Area Network, CAN)的简称,1986年被德国研发和生产汽车电子产品著称的BOSCH公司所开发,并最终成为国际标准(ISO11898),是国际上应用最广泛的现场总线之一。 在北美和西欧,CAN总线协议已经成为汽车计算机控制系统和嵌入式工业控制局域网的标准总线。

    CAN是国际标准化的串行通信协议,采用数据块编码的方式,数据块根据帧的类型,能够让挂载在总线上的不同节点接收到相同的数据,再根据每个节点的配置对信息进行选择性处理(接收or丢弃)。

    二.硬件连接

    1. 一个节点一般包含3个部分:微控制器,CAN控制器和CAN收发器。典型的组合有:51单片机+SJA1000+PCA82C250(5V)。

    2. 有的微控制器内部已经包含了CAN控制器,只需要外加CAN收发器,收发器一般都是8个引脚的芯片。 比如STM32:STM32+SN65HVD230(3.3V)。

    3. 所有节点通过两条线连接起来。两条线分别称为CAN_H和CAN_L。如果要求不高,一般用带屏蔽的双绞线就可以了。

    4. 网络的两端必须有120欧的终端电阻。所以在设计线路板的时候都要有一个120欧的电阻。通过跳线或者拨码开关选择是否使用这个电阻。为什么是120Ω,因为电缆的特性阻抗为120Ω,为了模拟无限远的传输线

    三.CAN总线上的电平信号

    1. CANBUS上的总线电平称为隐性电平和显性电平:
     Recessive:隐性(代表逻辑1) CAN_H=2.5V CAN_L= 2.5V 两条线上的电压差:0V
     Dominant :显性(代表逻辑0) CAN_H=3.5V CAN_L =1.5V 两条线上的电压差:2V
    注:CAN标准有两个,即IOS11898和IOS11519,两者差分电平特性不同。这里讲的是IOS11898

    2. 如果CAN控制器发送逻辑1时,CAN收发器使CAN_H和CAN_L都为2.5V,这时,两条线上的电压差为0V。总线上称为隐性电平。

    3. 如果CAN控制器发送逻辑0时,CAN收发器使CAN_H为3.5V,CAN_L为1.5V,这时,两条 线上的电压差为2V。总线上称为显性电平。

    4. 多个节点同时开始发送时,会涉及到总线仲裁(也就是谁可以继续发送)。详情看后面内容。

    四.CAN帧的种类

    • 每一个节点都可以主动发送帧。(帧是CAN协议规定的发送或接收的单位) 。帧由段组成,段由二进制位组成。

    名称帧用途
    数据帧用于发送单元向接收单元传送数据的帧。
    遥控帧用于接收单元向具有相同 ID 的发送单元请求数据的帧。
    错误帧用于当检测出错误时向其它单元通知错误的帧。 (硬件自动完成)
    过载帧当一个节点正忙于处理接收的信息,可以通知其它节点暂缓发送新报文。(硬件自动完成)
    帧间隔用于将数据帧及遥控帧与前面的帧分离开来的帧(硬件自动完成)

    帧的种类有很多,其中错误帧、过载帧、帧间隔都是由硬件完成的,没有办法用软件来控制。对于应用者来说,只需要掌握数据帧与遥控帧。数据帧和遥控帧有标准格式与扩展格式。标准格式有11位标识符,扩展格式有29位标识符。

    (1)遥控帧

    数据帧和远程帧结构上差不多,最大的区别就是远程帧没有数据段。 数据帧也是最复杂的帧,所以我们重点解析下面要讲的数据帧。

    (2)数据帧

    名称描述
    帧起始表示帧的开始,产生一个bit的显性电平。
    仲裁段表示帧的优先级, 由标识符(ID)和传送帧类型(RTR)组成。
    控制端表示数据的字节数,由6个bit构成
    数据段数据的具体内容,可发送0~8 个字节的数据。
    CRC段用于校验传输是否正确。
    ACK段表示确认是否正常接收。
    帧结束表示此帧结束。

    着重讲仲裁段、控制端与数据段。
    (1)仲裁段。 仲裁段分为标准格式(11位)以及扩展格式(29位)。仲裁段里含有CAN通信中一项非常重要的信息(ID),你可以把它当成是每一个报文的名字,每个CAN device可以发送多条不同的ID报文。每一个总线节点的CAN控制器中都有一个东西叫过滤器,通过设置相关寄存器能够配置它,一旦设置好,CAN控制器会根据你的设置,自动去判断要不要接收,完全由硬件实现,这个判断要不要接收的过程,也叫过滤,判断的依据就是每个信息的ID。扩展格式的ID具有比标准格式更多的位数,从而有更高的ID容量,妈妈再也不用担心ID不够用。

    • 标准格式的标识符长度的是11位,紧随其后的是RTR位,用于表明此帧是数据帧还是远程帧。IDE位用于表明此帧是标准帧还是扩展帧。
    • 扩展格式的标识符长度的是29位,紧随其后的是RTR位,用于表明此帧是数 据帧还是远程帧。IDE位用于表明此帧是标准帧还是扩展帧。


    (2)控制端。 控制段表示数据段的字节数。标准格式和扩展格式的构成有所不同。 控制端含有保留位与数据长度码(DLC)。
     保留位(r0、r1)必须全部以显性电平发送。但接收方可以接收显性、隐性及其任意组合的电平。
     数据长度码(DLC)与数据的字节数的对应关系下表所示。数据的字节数必须为 0~8字节。但接收方对 DLC=9~15的情况并不视为错误。
    在这里插入图片描述

    (3)数据段。

    数据段就是你需要发送的数据,可能包含字符0~8个字节数据,CAN控制器有对应的寄存器,只需要把数据直接填进去就可以了。

    五.CAN的仲裁方法

    1. 在总线空闲时,最先开始发送的节点获得发送权,一旦开始发送,不会被其他节点抢占。

    2. 多个节点同时开始发送时,各发送节点从仲裁段的第一位开始进行仲裁。连续输出显性电平最多的节点可继续发送。(Dominant :显性优先)

    3. 具有相同ID的数据帧和遥控帧在总线上竞争时,仲裁段的最后一位(RTR)为显性位的数据帧具有优先权可继续发送。

    3. ​标准格式ID与具有相同ID的遥控帧或者扩展格式的数据帧在总线上竞争时,标准格式的RTR 位为显性位的具有优先权可继续发送。

    六.CAN在Stm32上的应用

    上面梳理了一下CAN通信协议的知识,内容虽然很多,但是很多东西都是硬件自动实现的。对于只需要做软件的人,只需要配置好CAN的相关寄存器,其他的事情只需要交由硬件自己去做就可以了。对于实现CAN通信,我把它分为四个步骤:

    (1) CubeMX上配置CAN
    (2) 配置CAN的过滤器
    (3) 报文的发送、接受
    (4) 通电测试
    开发环境:CubeMX   Vesion 5.4.0
         Keil      Vesion 5.28

    (1)CubeMX上CAN的配置

    (1) 首先需要配置CAN通信的波特率。 以我自己为例,我用的是Stm32F405,分频系数设为3后,cubeMX会自动完成 Time Quantum(TQ)的计算,将得到的TQ乘以TBS1、TBS2、SJY之和刚好就是1us,对应的波特率是1M,这是CAN总线支持的最高通讯频率。通信频率需要根据自己需要设置,注意的是同一条CAN总线上的设备的波特率需要一致。

    71.42857142857143ns*(10+3+1)=1000ns=1us

    即公式:

    CAN波特率=TQ*(TBS1+TBS2+SJY)

    也能够直接用公式:

    CAN波特率=APB总线频率/分频系数/(TBS1+TBS2+SJY)

    (2) 其次就是打开CAN的接受中断。 打开中断是为了CPU能够及时接受和处理放在 “接受邮箱” 中的报文。CAN中具有两个“接受邮箱”,即FIFO0与FIFO1,每一个邮箱又有三层,每一层都可以存放一条报文,即每一个接收邮箱可以接收三条报文。CAN中受到的消息不是直接送入CPU,而是以报文的形式存在邮箱中,CPU需要时再去邮箱里取,读取时只能读到最先收到的报文,等这个读完之后,才能读下一个报文。每一个接受邮箱接受数据端都有一个过滤器,它会根据使用者的配置来判断每一条报文的ID,决定它是接受还是丢弃。这里我只打开FIFO0的中断(RX0),也能够同时打开RX0和RX1,这样能够提高接受报文的容量。

    既然讲到“接受邮箱”那么也讲讲“发送邮箱”。 发送邮箱是用于CAN总线数据发送的,总共有3个,并且存在优先级关系。优先级越高表示其里面的数据会被优先发送。数据在发送前都会被送到优先级最高且空闲的发送邮箱,然后依次发送。最后说明一点:“发送邮箱有3个,且每个邮箱只能装一个报文”。

    (2)配置CAN过滤器

    1.CAN过滤器有两种工作模式:列表模式与掩码模式
    列表模式: 列出ID名字,过滤器通过判断报文ID与其是否一致来决定是接受还是舍弃这份报文。这种列表的方式受到列表容量大小的限制,实际上,bxCAN的一个过滤器若工作在列表模式下,scale为32时,每个过滤器的列表只能写入两个报文ID,若scale为16时,每个过滤器的列表最多可写入4个CAN ID 。

    掩码模式: 通过确定ID特定位的值来判断报文的接受与丢弃。就像你想筛选出国内生日为1999年9月29日的人,你只需要选出身份证号码的第7~14位为19990929的人,其他位则不用关心。CAN通信中,掩码模式的实现主要是通过设定屏蔽妈与验证码的方式来实现筛选出特定位上特定数值的ID报文。掩码模式不受容量大小的局限。


    2.对于配置过滤器,还需知道三个重要的寄存器:CAN_FS1R、CAN_FxR1和CAN_FxR2
    CAN_FS1R寄存器。 我们知道标准ID位11位,而扩展CAN ID有29位。对于标准的ID来说,我们用一个16位的寄存器来处理他足够了,而扩展CAN ID,我们就必须使用32位的寄存器来处理它。有些时候,我们自始至终都只需要处理标准ID,所以出于对资源最有效利用,Stm32设立了CAN_FS1R寄存器来表示ID位宽,标志是否需要处理32位的ID。依据模式与位数的不同也就出现了4种组合:32位宽的列表模式,16位宽的列表模式,32位宽掩码模式,16位宽的掩码模式。

    CAN_FxR1寄存器和CAN_FxR2寄存器。 每个过滤器都存在这么两个寄存器CAN_FxR1和CAN_FxR2,这两个寄存器都是32位的,他们的定义并非固定的,针对不同的工作模式组合它们的定义是不一样的。

    工作模式CAN_FxR1寄存器和CAN_FxR2寄存器定义
    32位宽的列表模式两寄存器的定义一样,都用来存储某个期望通过的CAN ID,这样就可以存入2个期望通过的CAN ID(标准CAN ID和扩展CAN ID均可)。
    16位宽的列表模式两寄存器定义一样,且各自拆成两个,则总共可以写入4个标准CAN ID。
    32位宽掩码模式CAN_FxR1用做32位宽的验证码,而CAN_FxR2则用作32位宽的屏蔽码。
    16位宽的掩码模式可以当做2对验证码+屏蔽码组合来用,但它只能对标准CAN ID进行过滤。

    32位列表模式

    在这里插入图片描述

    /**
     * @brief  32位列表模式过滤器配置(这里举一个标准ID一个扩展ID)
     * @param  hcan   CAN的句柄
     * @param  StdId  标准ID
     * @param  ExtId  扩展ID
     */
    void CANFilterConfig_Scale32_IdList(CAN_HandleTypeDef * hcan,uint32_t StdId,uint32_t ExtId,uint8_t Filter_Nunber )  
    {  
      CAN_FilterConfTypeDef  sFilterConfig;  
      sFilterConfig.FilterNumber = Filter_Nunber ;        //使用过滤器编号  
      sFilterConfig.FilterMode = CAN_FILTERMODE_IDLIST;  //设为列表模式  
      sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT; //配置为32位宽  
      sFilterConfig.FilterIdHigh = StdId<<5;      //基本ID放入到STID中  
      sFilterConfig.FilterIdLow = 0|CAN_ID_STD;     //设置IDE位为0  
      sFilterConfig.FilterMaskIdHigh = ((ExtId<<3)>>16)&0xffff;  
      sFilterConfig.FilterMaskIdLow = (ExtId<<3)&0xffff|CAN_ID_EXT;//设置IDE位为1  
      sFilterConfig.FilterFIFOAssignment = 0;    //接收到的报文放入到FIFO0中  
      sFilterConfig.FilterActivation = ENABLE;  
      sFilterConfig.BankNumber = 14;  
      HAL_CAN_ConfigFilter(hcan, &sFilterConfig) ;
    }  
    

    由于我们使用的是cube库,在cube库中,CAN_FxR1与CAN_FxR2寄存器分别被拆成两段,CAN_FxR1寄存器的高16位对应着上面代码中的FilterIdHigh,低16位对应着FilterIdLow,而CAN_FxR2寄存器的高16位对应着FilterMaskIdHigh,低16位对应着FilterMaskIdLow,这个CAN_FilterConfTypeDef的的4个成员FilterIdHigh,FilterIdLow,FilterMaskIdHigh,FilterMaskIdLow,不应该单纯看其名字,被其名字误导。

    16位列表模式

    在这里插入图片描述

    /**
     * @brief  16位列表模式过滤器配置
     * @param  hcan   CAN的句柄
     * @param  StdId1~StdId4  4个标准ID
     */
    void CANFilterConfig_Scale16_IdList(CAN_HandleTypeDef * hcan,uint32_t StdId1,uint32_t StdId2,uint32_t StdId3,uint32_t StdId4,uint8_t Filter_Nunber)  
    {  
      CAN_FilterConfTypeDef  sFilterConfig;  
      sFilterConfig.FilterNumber = Filter_Nunber;         //使用过滤器1  
      sFilterConfig.FilterMode = CAN_FILTERMODE_IDLIST;   //设为列表模式  
      sFilterConfig.FilterScale = CAN_FILTERSCALE_16BIT;  //位宽设置为16位  
      sFilterConfig.FilterIdHigh = StdId1<<5;  //4个标准CAN ID分别放入到4个存储中  
      sFilterConfig.FilterIdLow = StdId2<<5;  
      sFilterConfig.FilterMaskIdHigh = StdId3<<5;  
      sFilterConfig.FilterMaskIdLow = StdId4<<5;  
      sFilterConfig.FilterFIFOAssignment = 0;   //接收到的报文放入到FIFO0中  
      sFilterConfig.FilterActivation = ENABLE;  
      sFilterConfig.BankNumber = 14;  
      HAL_CAN_ConfigFilter(&hcan, &sFilterConfig); 
    }
    

    32位掩码模式

    /**
     * @brief  32位掩码模式过滤器配置
     * @param  hcan     CAN的句柄
     * @param  ID       验证码
     * @param  Mask     屏蔽码
     * @param  ID_Type  ID类型(标准帧为0,其他则为扩展帧)
     */
    void CANFilterConfig_Scale32_IdMask(CAN_HandleTypeDef * hcan,uint32_t ID,uint32_t Mask,uint8_t ID_Type,uint8_t Filter_Nunber)  
    {
    
      if(ID_Type==0) //标准ID
      {
      CAN_FilterConfTypeDef  sFilterConfig;  
      sFilterConfig.FilterNumber = Filter_Nunber;           //使用过滤器2  
      sFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK;     //配置为掩码模式  
      sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT;    //设置为32位宽  
      sFilterConfig.FilterIdHigh =ID<<5;     
      sFilterConfig.FilterIdLow =0;  
      sFilterConfig.FilterMaskIdHigh =(Mask<<5);  
      sFilterConfig.FilterMaskIdLow =0|0x02;        //只接收数据帧  
      sFilterConfig.FilterFIFOAssignment = 0;       //设置通过的数据帧进入到FIFO0中  
      sFilterConfig.FilterActivation = ENABLE;  
      sFilterConfig.BankNumber = 14;  
      HAL_CAN_ConfigFilter(hcan, &sFilterConfig);
      }
      else //扩展ID
      {
       CAN_FilterConfTypeDef  sFilterConfig;  
       sFilterConfig.FilterNumber = Filter_Nunber;                   //使用过滤器3  
       sFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK;         //配置为掩码模式  
       sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT;        //设为32位宽  
       sFilterConfig.FilterIdHigh =((ID<<3) >>16) &0xffff;
       sFilterConfig.FilterIdLow =((ID<<3)&0xffff) | CAN_ID_EXT; 
       sFilterConfig.FilterMaskIdHigh = (Mask>>16)&0xffff;  
       sFilterConfig.FilterMaskIdLow = (Mask&0xffff)|0x02;       //只接收数据帧  
       sFilterConfig.FilterFIFOAssignment = 0;  
       sFilterConfig.FilterActivation = ENABLE;  
       sFilterConfig.BankNumber = 14;  
       HAL_CAN_ConfigFilter(hcan, &sFilterConfig)}
    
    }
    

    16位掩码模式

    16位掩码模式用得不多,这里就不介绍了。

    (3)CAN数据的发送与接收

    /**
     * @brief  发送标准ID的数据帧
     * @param  hcan     CAN的句柄
     * @param  ID       数据帧ID
     * @param  pData    数组指针
     * @param  Len      字节数0~8
     */
    uint8_t CANx_SendStdData(CAN_HandleTypeDef* hcan,uint16_t ID,uint8_t *pData,uint16_t Len)
    {
      static CAN_TxHeaderTypeDef   Tx_Header;
    	
    	Tx_Header.StdId=ID;
    	Tx_Header.ExtId=0;
    	Tx_Header.IDE=0;
    	Tx_Header.RTR=0;
    	Tx_Header.DLC=Len;
            /*找到空的发送邮箱,把数据发送出去*/
    	if(HAL_CAN_AddTxMessage(hcan, &Tx_Header, pData, (uint32_t*)CAN_TX_MAILBOX0) != HAL_OK) //
    	{
    		if(HAL_CAN_AddTxMessage(hcan, &Tx_Header, pData, (uint32_t*)CAN_TX_MAILBOX1) != HAL_OK)
    		{
    			HAL_CAN_AddTxMessage(hcan, &Tx_Header, pData, (uint32_t*)CAN_TX_MAILBOX2);
    }
    
    
    /**
     * @brief  发送扩展ID的数据帧
     * @param  hcan     CAN的句柄
     * @param  ID       数据帧ID
     * @param  pData    数组指针
     * @param  Len      数据长度0~8
     */
     uint8_t CANx_SendExtData(CAN_HandleTypeDef* hcan,uint32_t ID,uint8_t *pData,uint16_t Len)
    {
    	static CAN_TxHeaderTypeDef   Tx_Header;
    
    	Tx_Header.RTR=0;
    	Tx_Header.DLC=Len;
    	Tx_Header.StdId=0;
    	Tx_Header.ExtId=ID;
    	Tx_Header.IDE=CAN_ID_EXT;
            /*找到空的发送邮箱,把数据发送出去*/
    	if(HAL_CAN_AddTxMessage(&hcan, &Tx_Header, pData, (uint32_t*)CAN_TX_MAILBOX0) != HAL_OK) //
    	{
    		if(HAL_CAN_AddTxMessage(&hcan, &Tx_Header, pData, (uint32_t*)CAN_TX_MAILBOX1) != HAL_OK)
    		{
    			HAL_CAN_AddTxMessage(&hcan, &Tx_Header, pData, (uint32_t*)CAN_TX_MAILBOX2);
    		}
    }
    
    
    /**
     * @brief  CAN FIFO0的中断回调函数,在里面完成数据的接收
     * @param  hcan     CAN的句柄
     */
     
     uint8_t date_CAN1[8];//设为全局变量,用于接收CAN1数据
     uint8_t date_CAN2[8];//设为全局变量,用于接收CAN2数据
     
    void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan)
    {
    	if(hcan->Instance ==CAN1)
    	{
    	  CAN_RxHeaderTypeDef RxHeader;  //接受句柄
    	  HAL_CAN_GetRxMessage(&hcan1, CAN_RX_FIFO0, &RxHeader, date_CAN1); //接收,CAN邮箱为0
    	  return ;
    	}
    	else if(hcan->Instance == CAN2)
    	{
    	  CAN_RxHeaderTypeDef RxHeader;  //接受句柄
    	  HAL_CAN_GetRxMessage(&hcan2, CAN_RX_FIFO0, &RxHeader, date_CAN2); //接收,CAN邮箱为0
    	}
    }
    

    在启用CAN时不要忘记了进行初始化。

    void CAN_Start(CAN_HandleTypeDef *hcan)
    {
    	HAL_CAN_ActivateNotification(hcan ,CAN_IT_RX_FIFO0_MSG_PENDING);
    	HAL_CAN_Start(hcan);
    }
    

    (4)通电测试

    六.参考文档

    一.can入门教程PDF文档学习手册

    二.CANBUS协议培训文档

    七.同系列博客

    1. GPIO相关函数解析(HAL库)
    2. Stm32延时与计时方法(HAL库)
    3. 串口通讯知识梳理及在Stm32上的应用(HAL库)
    4. 串口DMA知识梳理以及在Stm32的应用(HAL库)
    5. CAN通信知识梳理及在Stm32上的应用(HAL库)
    展开全文
  • CAN总线知识梳理

    2021-02-24 03:16:03
    嵌入式的工程师一般都知道CAN总线广泛应用到汽车中,其实船舰电子设备通信也广泛使用CAN,随着国家对海防的越来越重视,对CAN的需求也会越来越大。这个暑假,通过参加苏州社会实践,去某船舶电气公司实习几周,也借...
  • 汽车CAN通信协议整理

    万次阅读 2019-07-25 11:49:23
    目录 1.CAN数据操作类型 2.重点说一下几个关键命令 2.1诊断会话控制(命令标识符-10) 2.2安全访问 (命令标识符-27) 2.2.1请求种子(01) ...每个汽车ECU都会有相应的CANID,CANID通常分为物理CA...

    目录

    1.CAN数据操作类型

    2.重点说一下几个关键命令

    2.1诊断会话控制(命令标识符-10)

    2.2安全访问 (命令标识符-27)

    2.2.1请求种子(01)

    2.2.2发送密钥(02)

    3.CAN数据通行格式说明

    4.汽车故障诊断(命令标识符-19)

    4.1获取故障码数量(01)

    4.2获取故障码(02)


    每个汽车ECU都会有相应的CANID,CANID通常分为物理CANID和功能CANID,根据实际需要使用相应类型的CANID;

    1.CAN数据操作类型

    2.重点说一下几个关键命令

    2.1诊断会话控制(命令标识符-10)

    诊断会话控制常见模式,01-默认会话模式,02-编程模式,03-扩展诊断模式;

    读数据使用默认会话模式,涉及动作测试或者写入数据需要扩展诊断模式;

    诊断会话请求和响应示例参考:

    大概说一下数据结构:

    请求:7E0表示请求的CANID,10表示请求诊断会话控制,01表示:打开默认会话模式;02表示数据长度;

    响应:7E8表示响应的CANID,10表示响应诊断会话控制,01表示:已打开默认会话模式;06表示数据长度;

    2.2安全访问 (命令标识符-27)

    涉及动作测试时通常会涉及安全访问,参考相应汽车厂商的文档说明;

    以上是打开安全访问的流程;

    2.2.1请求种子(01)

    请求相应的ECU单元下的种子(key),基于汽车厂商的算法生成密钥;

    2.2.2发送密钥(02)

    将密钥发送给相应的ECU单元打开安全访问;然后继续执行下一步动作测试等;

    3.CAN数据通行格式说明

    CAN数据通信大概分为四种类型:单帧,首帧,连续帧,流控制;

    相应参数说明:

    注:表 2 数据域信息

    1) SF_DL:单帧数据长度,其长度最大不超过最大理论值(最大理论值:在地址信息扩展模式下,最 大理论值为 6;在标准模式下,最大理论值为 7)也不得等于 0,错误处理:若超出最大理论值或者等于 0, 则接收器将忽略此消息。

    2) FF_DL: 多帧模式中数据总长度,用 12 位表示,可表示 8-4095。 错误处理:若不大于单帧所能 容纳的最大值,则接收器将忽略此消息;若大于接收器所能利用的最大值,网络层将终止发送和接收并标 记溢出。

    3) SN:连续帧模式中的帧编号,首帧的编号被默认为 0,因此紧接着的连续帧的编号为 1,每帧自 动增加 1,当到达 F 后,下一个连续帧的 SN 编号重置为 0。 例如:0、1、2......E、F、0、1......。错误处 理:如果 SN 序列号错误,网络层终止接收,并向上层发送 SN 错误指示以示拒绝。

    4) FS:流控制帧,有三种状态:继续发送、保持等待、数据溢出。

    5) 三种状态的定义见表 3。
    错误处理:网络层终止接收,并向上层发送 FS 无效错误指示以示拒绝。
    6) BS:连续帧发送中,在等待接收方的下一流控制帧前,接收方容许发送方发送的连续帧帧数的最

    大值,该值的有效范围:0~255。若当此值为 0 时,表示不再发送流控制帧,发送器可以将其余连续帧依 次发出。

    7) ST:表示接收器接收到数据到发送器再次发送的最小时间间隔(见表 4)。

    如果接收到的 ST 值是一个保留值,则发送实体将在整个后续帧的传输过程中,用 127ms 来取代从接收 实体那返回的值。

    8)未占用数据域字节需要用数据填充。推荐请求消息填充 0x55,应答消息填充 0xaa。

    4.汽车故障诊断(命令标识符-19)

    4.1获取故障码数量(01)

    可以获取故障码数量、解析故障码需要的解析协议规则;

    故障码协议解析规则大概分为如下三种,前两种比较常见和使用的:

    ISO15031-6DTCFormat

    ISO14229-1DTCFormat

    SAEJ1939-73DTCFormat

    4.2获取故障码(02)

    故障码通常都是4字节,从 ECU 中读取存储的诊断故障代码。一个故障码用 4 个字节描述,前三个字节分别表 示故障码高位、中间位和低位,第四个字节表示故障码状态(Status of DTC)。

    StatusOfDTC的各个bit位说明:

    具体开发需要参考相应厂商的文档,以上知识基础需要了解内容;

    参考:

    03_ISO 14229-1 统一诊断服务解析

    https://wenku.baidu.com/view/ad417881370cba1aa8114431b90d6c85ec3a88d5.html

    BS ISO 14229-1-201

    http://www.doc88.com/p-4961798574516.html

    ISO 14229+统一诊断服务

    https://wenku.baidu.com/view/e0c24a37941ea76e59fa040f.html

    J1939-73

    https://www.docin.com/p-2068932615.html

    ISO14229

    http://read.pudn.com/downloads191/doc/899044/ISO+14229+(2006).pdf

    以上是汽车CAN诊断开发最基础的整理,希望大家有帮助

     

    展开全文
  • CAN总线知识点总结

    2019-11-20 17:38:23
    借鉴总结的can总线知识点。CAN(Controller Area Network)即控制器局域网,是一种能够实现分布式实时控制的串行通信网络。
  • CAN总线基础知识(一)

    万次阅读 多人点赞 2014-01-03 17:32:12
     CAN(Controller Area Network)是ISO国际标准化的串行通信协议。广泛应用于汽车、船舶等。具有已经被大家认可的高性能和可靠性。  CAN控制器通过组成总线的2根线(CAN-H和CAN-L)的电位差来确定总线的电平,在任...

    1.CAN总线是什么?

        CAN(Controller Area Network)是ISO国际标准化的串行通信协议。广泛应用于汽车、船舶等。具有已经被大家认可的高性能和可靠性。

        CAN控制器通过组成总线的2根线(CAN-H和CAN-L)的电位差来确定总线的电平,在任一时刻,总线上有2种电平:显性电平和隐性电平。

        “显性”具有“优先”的意味,只要有一个单元输出显性电平,总线上即为显性电平,并且,“隐性”具有“包容”的意味,只有所有的单元都输出隐性电平,总线上才为隐性电平。(显性电平比隐性电平更强)。

        总线上执行逻辑上的线“与”时,显性电平的逻辑值为“0”,隐性电平为“1”。

        下图显示了一个典型的CAN拓扑连接图。

        连接在总线上的所有单元都能够发送信息,如果有超过一个单元在同一时刻发送信息,有最高优先级的单元获得发送的资格,所有其它单元执行接收操作。


    2.CAN总线的特点

         CAN总线协议具有下面的特点:

        1) 多主控制

        当总线空闲时,连接到总线上的所有单元都可以启动发送信息,这就是所谓的多主控制的概念。

        先占有总线的设备获得在总线上进行发送信息的资格。这就是所谓的CSMA/CR(Carrier Sense MultipleAccess/Collosion Avoidance)方法

        如果多个设备同时开始发送信息,那么发送最高优先级ID消息的设备获得发送资格。

        2) 信息的发送

        在CAN协议中,所有发送的信息要满足预先定义的格式。当总线没有被占用的时候,连接在总线上的任何设备都能起动新信息的传输,如果两个或更多个设备在同时刻启动信息的传输,通过ID来决定优先级。ID并不是指明信息发送的目的地,而是指示信息的优先级。如果2个或者更多的设备在同一时刻启动信息的传输,在总线上按照信息所包含的ID的每一位来竞争,赢得竞争的设备(也就是具有最高优先级的信息)能够继续发送,而失败者则立刻停止发送并进入接收操作。因为总线上同一时刻只可能有一个发送者,而其它均处于接收状态,所以,并不需要在底层协议中定义地址的概念。

        3) 系统的灵活性

        连接到总线上的单元并没有类似地址这样的标识,所以,添加或去除一个设备,无需改变软件和硬件,或其它设备的应用层软件。

        4) 通信速度

        可以设置任何通讯速度,以适应网络规模。

        对一个网络,所有单元必须有相同的通讯速度,如果不同,就会产生错误,并妨碍网络通讯,然而,不同网络间可以有不同的通讯速度。

        5) 远程数据请求

    可以通过发送“遥控帧”,请求其他单元发送数据。

        6) 错误检测、错误通知、错误恢复功能

    所有单元均可以检测出错误(错误检测功能)。

    检测到错误的单元立刻同时通知其它所有的单元(错误通知功能)。如果一个单元发送信息时检测到一个错误,它会强制终止信息传输,并通知其它所有设备发生了错误,然后它会重传直到信息正常传输出去(错误恢复功能)。

        7) 错误隔离

    在CAN总线上有两种类型的错误:暂时性的错误(总线上的数据由于受到噪声的影响而暂时出错);持续性的错误(由于设备内部出错(如驱动器坏了、连接有问题等)而导致的)。CAN能够区别这两种类型,一方面降低常出错单元的通讯优先级以阻止对其它正常设备的影响,另一方面,如果是一种持续性的错误,将这个设备从总线上隔离开。

        8) 连接

    CAN总线允许多个设备同时连接到总线上且在逻辑上没有数目上的限制。然而由于延迟和负载能力的限制,实际可连接得设备还是有限制的,可以通过降低通讯速度来增加连接的设备个数。相反,如果连接的设备少,通讯的速度可以增加。

    3.错误

    3.1 错误状态

        设备总是处于下面三个状态之一:

        1)主动错误状态

        在此状态下,设备能够参加总线上的正常通讯。如果处于主动错误状态的设备检测到一个错误,它会发送一个主动错误标志,更细节见第6章的“CAN协议”。

        2)被动错误状态

        是指易于引起错误的状态。

        尽管处于被动错误状态的设备能够参加总线上的通讯,但是在接收期间,它不可能主动地向其它设备发送错误通知,以避免影响它们的通讯。处于被动错误状态的设备即使检测到一个错误,如果其它处于主动错误状态的设备没曾检测到错误,那么也认为在总线上未曾出现过任何错误。

        当处于被动错误状态的设备检测到一个错误的时候,它发送一个被动错误标志。

        另外,处于被动错误状态的单元在发送结束后不能立刻再次开始发送。在开始下次发送前,在间隔帧期间内必须插入“暂停发送期”(由8个位的隐性位组成)。

    更细节见第6章的“CAN协议”。

        3)总线切断状态

        处于此状态下时,设备不能参加总线的通讯。设备所有的收发操作都被禁止。

        这些状态是通过发送错误计数器和接收错误寄存器来管理,相关错误状态由这些计数器值的组合来标识,错误状态和计数器值之间的关系见表1和图4。




    3.2 错误计数器的值

        发送和接收错误计数器的值按照规定的条件来改变。

        表2小结了错误计数器值改变的条件。

        在一个数据收发操作中可能会发生多个条件重叠。

        错误计数器增加的时间发生在错误标志的第一bit位置。


    4.CAN协议的基本概念

        CAN协议包括OSI参考模型的传输层、数据链路层、物理层。图5显示了CAN协议每个层的定义。

        数据链路层划分为MAC(Medium Access Control媒体存取控制)和LLC(Logical Link Control罗辑链路控制)。MAC子层组成CAN协议的核心。数据链路层的功能是将从物理层接收到的信号组织成有意义的信息,提供如传输错误控制等数据传输控制流程。更具体来说,包括:信息如何封装成一帧,数据冲突仲裁、应答、错误的检测或通知。数据链路层的这些功能通常由CAN控制器硬件来实现。

        物理层定义信号的实际传输方式、位的时序、位的编码、同步的过程步骤,然而,CAN协议并没有定义了信号电平、通讯速度、采样点值、驱动器和总线电气特征、连接器形式。对每个系统,这些特征由用户自行确定。

        在BOSCH公司的CAN协议中,并没有关于收发器和总线的电气特征的定义,而在ISO CAN协议中,如ISO11898和ISO11519-2却对此有明确的定义。





    展开全文
  • CAN 总线知识整理(一)CAN特点

    千次阅读 2019-01-02 15:56:38
    1.CAN 是 Controller Area Network .由1986年德国博世公司开发出,后通过ISO11898 ISO 11519标准。 2.主要特征有安全性、舒适性、方便性、低公害、低成本等特点。  车载网络图形  ...

    1.CAN 是 Controller Area Network .由1986年德国博世公司开发出,后通过ISO11898  ISO 11519标准。

    2.主要特征有安全性、舒适性、方便性、低公害、低成本等特点。

                                                                     车载网络图形

                                                        总线 连接图

    3.CAN特点

    1) 多主控 多个单元在总线空闲都可以发送消息。

    在总线空闲时,所有的单元都可开始发送消息(多主控制)。
    最先访问总线的单元可获得发送权(CSMA/CA 方式 *1 )。
    多个单元同时开始发送时,发送高优先级 ID 消息的单元可获得发送权。

    2)消息发送

    在 CAN 协议中,所有的消息都以固定的格式发送。

    两个以上的单元同时开始发送消息时,根据标识符(Identifier 以下称为 ID)决定优先级

    3)系统柔软性

    总线添加单元时,连接在总线上的其他单元的软硬件及应用层都不需要改变。

    4)通讯速度

    同一网络中,所有单元必须设定成统一的通讯速度。(根据规模选择速度)

    5)远程数据请求

    可通过发送“遥控帧”请求其他单元发送数据。

    6)错误检测功能·错误通知功能·错误恢复功能
    所有的单元都可以检测错误(错误检测功能)。
    检测出错误的单元会立即同时通知其他所有单元(错误通知功能)。
    正在发送消息的单元一旦检测出错误,会强制结束当前的发送。强制结束发送的单元会不断反复地重新发送
    此消息直到成功发送为止(错误恢复功能)。

    (7) 故障封闭
    CAN 可以判断出错误的类型是总线上暂时的数据错误(如外部噪声等)还是持续的数据错误(如单元内部
    故障、驱动器故障、断线等)。由此功能,当总线上发生持续数据错误时,可将引起此故障的单元从总线上
    隔离出去。
    (8) 连接
    CAN 总线是可同时连接多个单元的总线。可连接的单元总数理论上是没有限制的。但实际上可连接的单元
    数受总线上的时间延迟及电气负载的限制。降低通信速度,可连接的单元数增加;提高通信速度,则可连接
    的单元数减少。

    4.错误(单元始终处于3种状态之一)

    1)主动错误状态

            可以正常参加总线通讯状态。

    2)被动错误状态

           是易引起错误的状态。

           处于此状态的单元虽能参加通讯,但为不妨碍其他通讯,接收时不能积极发送错误通知。

           此状态的单元即使检测出错误,而其他处于主动错误单元未发现错误,整个总线也被认为是没有错误。

          处于被动错误状态的单元检测出错误时,输出被动错误标志。

           此状态的单元发送结束后不能立马再次开始发送,在开始下次发送前,在间隔帧期间内
    必须插入“延迟传送”(8 个位的隐性位)。

    3)总线关闭态

           不能参加总线上通信的状态。

           信息的接收发送均被禁止。

     状态切换靠下面的状态机

    REC TEC 计数的方法(一次收发可能满足多个条件)

     

    展开全文
  • CAN 总线知识整理

    2021-08-02 22:36:18
    CAN总线(Controller Area Network,控制器局域网络),是一种能够实现分布式实时控制的串行通信网络。传输速度最高到1Mbps,通信距离最远到10km,无损位仲裁机制,多主结构。 二、CAN总线网络模型 各个CAN节点...
  • 依照瑞萨公司的《CAN入门书》的组织思路来学习CAN通信的相关知识,并结合网上相关资料以及学习过程中的领悟整理成笔记。好记性不如烂笔头,加油!
  • CAN总线学习笔记(1)- CAN基础知识

    万次阅读 多人点赞 2018-03-07 20:13:46
    依照瑞萨公司的《CAN入门书》的组织思路来学习CAN通信的相关知识,并结合网上相关资料以及学习过程中的领悟整理成笔记。好记性不如烂笔头,加油! 1 CAN的一些基本概念 1.1 什么是CAN总线 CAN 是 ...
  • ISO11898 是通讯速度125kbps-1Mbps CAN 高速通信标准,追加新规后,成为ISO11898-1新标准 ISO11519 是通讯速度125kbps及以下的CAN低速通讯标准。 ISO11519-2是追加新规后的版本。 长度与通讯速度的关系...
  • CAN 总线知识整理(六)同步方法

    千次阅读 2019-01-02 18:42:41
    1.硬件同步 接收单元在总线空闲状态检测出帧起始时进行的同步调整 在检测出边沿的地方不考虑SJW的值而认为是SS段。 2.再同步
  • 由于涉及到汽车CAN数据通信,难免需要C和Java之间的交互,我简单整理了一下C和Java之间数据的转换问题;31 3.1Java中的byte和c中的unsigned char *str转换问题 3.1.2Java中byte转为unsigned char *str Java...
  • 汽车CAN通信基础知识-数据类型(Java,C,JS之间转换) https://blog.csdn.net/ahou2468/article/details/97117367 汽车CAN通信基础知识-Java之Socket通信实战 ... 汽车CAN通信基础知识-CAN数据结构 ...
  • CAN总线知识点概述

    2020-11-24 11:54:26
    CAN全称为...为了适应“减少线束的数量”、“通过多个LAN,进行大量数据的高速通信”的需求,1986年德国电气商博世公司开发出面向汽车的CAN通信协议。此后,CAN通过IS011898及IS0 11519进行了标准
  • CAN总线知识整理

    2019-11-28 14:44:47
    1.can总线节点在发送报文的过程中进行“回读”,判断发送的和回读的是否一致; 2.can2.0标准 can2.0A:可以识别11位数据帧,29位数据帧报错; can2.0B passive:可以识别11位数据帧,忽略29位数据帧; can2.0B active...
  • CAN 2.0总线协议消息报文详解4.1 CAN2.0总线的通信报文帧格式(Message Frame Format)4.2 CAN2.0总线的通信报文帧类型(Message Frame Type)4.3 CAN2.0总线的通信报文之标准/扩展数据帧4.4 CAN2.0总...
  • CAN 总线知识整理(五)位时序

    千次阅读 2019-01-02 17:39:24
    由发送单元在非同步的情况下发送的每秒钟得到位数为位速率。...CAN 协议的通信方法为 NRZ(Non-Return to Zero)方式。各个位的开头或者结尾都没有附加同步信号。发送 单元以与位时序同步的方式开始发...
  • CAN开发 入门知识总结

    千次阅读 2020-07-12 17:30:55
    知乎大佬的CAN总结: https://www.zhihu.com/question/35630289

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 5,638
精华内容 2,255
关键字:

can通信知识梳理