380091044 发表于 2024-4-26 10:37:14

CAN发送标准帧函数存在疑问点?


疑问问题:见代码中的问号处
//========================================================================
// 函数: void CanSendMsg(CAN_DataDef *CAN)
// 描述: CAN发送标准帧函数。
// 参数: *CANx: 存放CAN总线发送数据..
// 返回: none.
// 版本: VER1.0
// 日期: 2020-11-19
// 备注:
//========================================================================
void CanSendMsg(CAN_DataDef *CAN)
{
      u32 CanID;
    u8 RX_Index,i;

    i = 200;
    while((--i) && (B_CanSend));//等待上次发送完成

    if(CAN->FF)   //判断是否扩展帧
    {
      CanID = CAN->ID << 3;
      CanWriteReg(TX_BUF0,CAN->DLC|((u8)CAN->RTR<<6)|0x80);      //这里的0x80把FF位置1是扩展帧,下面同样位置处标准帧没有清零呢?????
      CanWriteReg(TX_BUF1,(u8)(CanID>>24));
      CanWriteReg(TX_BUF2,(u8)(CanID>>16));
      CanWriteReg(TX_BUF3,(u8)(CanID>>8));

      CanWriteReg(TX_BUF0,(u8)CanID);

      RX_Index = 1;
      for(i=0;((i<CAN->DLC) && (i<8));i++)      //数据长度为DLC,最多不超过8
      {
            CanWriteReg((u8)(TX_BUF0 + (RX_Index++&3)),CAN->DataBuffer);   //写入有效数据
      }
      while(RX_Index&3)   //判断已读数据长度是否4的整数倍
      {
            CanWriteReg((u8)(TX_BUF0 + (RX_Index++&3)),0x00);//写入填充数据,一帧数据占据4的整数倍缓冲区空间,不足补0
      }
    }
    else    //发送标准帧
    {
      CanID = (u16)(CAN->ID << 5);
                        CanWriteReg(TX_BUF0,CAN->DLC|((u8)CAN->RTR<<6)); //前面发送扩展帧时,把FF位进行了置1处理,这里为啥没有把FF置0操作呢???
      CanWriteReg(TX_BUF1,(u8)(CanID>>8));
      CanWriteReg(TX_BUF2,(u8)CanID);

      RX_Index = 3;
      for(i=0;((i<CAN->DLC) && (i<8));i++)      //数据长度为DLC,最多不超过8
      {
            CanWriteReg((u8)(TX_BUF0 + (RX_Index++&3)),CAN->DataBuffer);   //写入有效数据
      }
      while(RX_Index&3)   //判断已读数据长度是否4的整数倍
      {
            CanWriteReg((u8)(TX_BUF0 + (RX_Index++&3)),0x00);//写入填充数据,一帧数据占据4的整数倍缓冲区空间,不足补0
      }
    }
      CanWriteReg(CMR ,0x04);                //发起一次帧传输
    B_CanSend = 1;   //设置发送忙标志
}

乘风飞扬 发表于 2024-4-26 11:08:47

标准帧 TX_BUF0 写入第一个字节的内容是 CAN->DLC|((u8)CAN->RTR<<6)
CAN->DLC 有效内容只有4位,bit7本来就是0,所以不用清除。

380091044 发表于 2024-4-26 11:21:26

乘风飞扬 发表于 2024-4-26 11:08
标准帧 TX_BUF0 写入第一个字节的内容是 CAN->DLC|((u8)CAN->RTR

哦哦,谢谢老师指点,明白了
页: [1]
查看完整版本: CAN发送标准帧函数存在疑问点?