芯片stm32f103vgt6 can发送8个数据时在对发送邮箱高字节数据寄存器 (CAN_TDHxR)写入数据时第4到7个字节时,再次回读时发现字节第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={0x3,0x4,0x5,0x6,0x7,0x8,0x9,0xa} 写入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; } |