OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4991|回复: 6

stm32f103vgt6 can发送8个数据有一个字节数据错误

[复制链接]

8

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
129
金钱
129
注册时间
2017-10-27
在线时间
36 小时
发表于 2022-10-3 22:37:58 | 显示全部楼层 |阅读模式
15金钱
芯片stm32f103vgt6   can发送8个数据时在对发送邮箱高字节数据寄存器 (CAN_TDHxR)写入数据时第47个字节时,再次回读时发现字节第5个字节对不上,导致发送但can总线的数据5对不上,用的是HAL库,库函数如下HAL_StatusTypeDef HAL_CAN_AddTxMessage(CAN_HandleTypeDef *hcan, CAN_TxHeaderTypeDef *pHeader, uint8_t aData[], uint32_t *pTxMailbox)
内容赋值部分如下,
WRITE_REG(hcan->Instance->sTxMailBox[transmitmailbox].TDHR,
                ((uint32_t)aData[7] << CAN_TDH0R_DATA7_Pos) |
                ((uint32_t)aData[6] << CAN_TDH0R_DATA6_Pos) |
                ((uint32_t)aData[5] << CAN_TDH0R_DATA5_Pos) |
                ((uint32_t)aData[4] << CAN_TDH0R_DATA4_Pos));
      WRITE_REG(hcan->Instance->sTxMailBox[transmitmailbox].TDLR,
                ((uint32_t)aData[3] << CAN_TDL0R_DATA3_Pos) |
                ((uint32_t)aData[2] << CAN_TDL0R_DATA2_Pos) |
                ((uint32_t)aData[1] << CAN_TDL0R_DATA1_Pos) |
                ((uint32_t)aData[0] << CAN_TDL0R_DATA0_Pos));
th=hcan->Instance->sTxMailBox[transmitmailbox].TDHR;
tl=hcan->Instance->sTxMailBox[transmitmailbox].TDLR;   
仿真数据如下:
发送buff={0x30x40x50x60x70x80x90xa}
写入hcan->Instance->sTxMailBox[transmitmailbox].TDHR=0x0a090807
hcan->Instance->sTxMailBox[transmitmailbox].TDLR=0x06050403
回读时查看hcan->Instance->sTxMailBox[transmitmailbox].TDHR=0x0a090007
可以看到can_tx_data[5]写进寄存器时0x8写进去,回读时却变成00,导致发送到can总线的数据错误,经测试发现第一次发送数据,和第5位数据不变时可以正确发送,一旦第五位数据变化,再次回读寄存器就错了,发送到can总线的数据也是错误的,错误值和错误的寄存器内容一致,不知到什么原因?
/* CAN init function */
void MX_CAN_Init(void)
{
    CAN_FilterTypeDef sFilterConfig ;
    /* USER CODE BEGIN CAN_Init 0 */
    /* USER CODE END CAN_Init 0 */
    /* USER CODE BEGIN CAN_Init 1 */
    /* USER CODE END CAN_Init 1 */
    hcan.Instance = CAN1;
    hcan.Init.Prescaler = 4;
    hcan.Init.Mode = CAN_MODE_NORMAL;
    hcan.Init.SyncJumpWidth = CAN_SJW_1TQ;
    hcan.Init.TimeSeg1 = CAN_BS1_9TQ;
    hcan.Init.TimeSeg2 = CAN_BS2_8TQ;
    hcan.Init.TimeTriggeredMode = ENABLE;
    hcan.Init.AutoBusOff = ENABLE;
    hcan.Init.AutoWakeUp = ENABLE;
    hcan.Init.AutoRetransmission = DISABLE;
    hcan.Init.ReceiveFifoLocked = DISABLE;
    hcan.Init.TransmitFifoPriority = DISABLE;
    if (HAL_CAN_Init(&hcan) != HAL_OK)
    {
        Error_Handler();
    }
    /*CAN过滤器初始化*/
    sFilterConfig.FilterBank = 0;  /* 过滤器组0 */
    sFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK;  /* 工作在标识符屏蔽位模式 */
    sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT; /* 过滤器位宽为单个32位。*/
    /* 使能报文标示符过滤器按照标示符的内容进行比对过滤,扩展ID不是如下的就抛弃掉,是的话,会存入FIFO0*/
    sFilterConfig.FilterIdHigh         = 0x0000; /* 要过滤的ID高位 */
    sFilterConfig.FilterIdLow          = 0x0000; /* 要过滤的ID低位 */
    sFilterConfig.FilterMaskIdHigh     = 0x0000; /* 过滤器高16位每位必须匹配 */
    sFilterConfig.FilterMaskIdLow      = 0x0000; /* 过滤器低16位每位必须匹配 */
    sFilterConfig.FilterFIFOAssignment = 0;           /* 过滤器被关联到FIFO 0 */
    sFilterConfig.FilterActivation = ENABLE;          /* 使能过滤器 */
sFilterConfig.SlaveStartFilterBank = 14;
    HAL_CAN_ConfigFilter(&hcan, &sFilterConfig);
    CAN_Start(&hcan);  /*配置传输过程*/
    /* USER CODE BEGIN CAN_Init 2 */
    /* USER CODE END CAN_Init 2 */
}
  * 函数功能: CAN发送函数
  * 输入参数: notused:结构体 m:数据
  * 返 回 值:
  * 说    明:
  */
uint8_t CANx_SendMessage(CAN_HandleTypeDef *hcan,uint16_t ID, uint8_t *Data,uint16_t Len)
{
    uint32_t transmit_mailbox = 0;
    TxHeader.StdId = 0x601;
    TxHeader.ExtId = 1;
    TxHeader.IDE = CAN_ID_STD;
    TxHeader.RTR = CAN_RTR_DATA;
    TxHeader.DLC = 8;
    if(HAL_CAN_AddTxMessage(hcan, &TxHeader, Data, &transmit_mailbox) != HAL_OK)
    {
      return 1;
    }
    return 0;
}

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

8

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
129
金钱
129
注册时间
2017-10-27
在线时间
36 小时
 楼主| 发表于 2022-10-4 08:53:47 | 显示全部楼层
用了原子的精简库和hal库测试也是在写寄存器的回读数据不正常,不知道是不是芯片问题
回复

使用道具 举报

8

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
129
金钱
129
注册时间
2017-10-27
在线时间
36 小时
 楼主| 发表于 2022-10-4 20:02:25 | 显示全部楼层
问题已解决芯片问题,估计之前买的一批是商用级的,换了个工业级的好了
回复

使用道具 举报

32

主题

183

帖子

0

精华

高级会员

Rank: 4

积分
617
金钱
617
注册时间
2013-1-16
在线时间
131 小时
发表于 2022-10-9 09:19:26 | 显示全部楼层
maqiufeng 发表于 2022-10-4 20:02
问题已解决芯片问题,估计之前买的一批是商用级的,换了个工业级的好了

这个跟芯片没啥关系吧!工业级和商用的同系列的应该也只是温度不一样,看下是不是can接的电阻阻值不对
回复

使用道具 举报

8

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
129
金钱
129
注册时间
2017-10-27
在线时间
36 小时
 楼主| 发表于 2022-10-9 16:32:30 | 显示全部楼层
1597685605 发表于 2022-10-9 09:19
这个跟芯片没啥关系吧!工业级和商用的同系列的应该也只是温度不一样,看下是不是can接的电阻阻值不对

电阻120对的,换了芯片一次接受错误没有,不换之前,高位寄存器4个字节第二个字节很大概率会写不进去,回读时,寄存器的值和usb-can接受的错误一致,当然也有可能芯片有脏东西或者答焊之类的,这个经常发错误的芯片时在淘宝买残次品也说不定,
回复

使用道具 举报

32

主题

183

帖子

0

精华

高级会员

Rank: 4

积分
617
金钱
617
注册时间
2013-1-16
在线时间
131 小时
发表于 2022-10-9 17:31:19 | 显示全部楼层
maqiufeng 发表于 2022-10-9 16:32
电阻120对的,换了芯片一次接受错误没有,不换之前,高位寄存器4个字节第二个字节很大概率会写不进去,回 ...

写进去的同时回读了么
回复

使用道具 举报

8

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
129
金钱
129
注册时间
2017-10-27
在线时间
36 小时
 楼主| 发表于 2022-10-10 12:18:26 | 显示全部楼层
1597685605 发表于 2022-10-9 17:31
写进去的同时回读了么

写进去之后回读的,回读的数据和写的数据经常有一个自己数据错误的,发送到总线也是寄存器里写错的数据,如果读出来数据while判断不正确再写还是一样写不进去的,会死在里面的,好的芯片回读都是正确的
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-16 07:03

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表