求助如何做网站推广,网销每天需要怎么做,人像摄影作品网站,中学建设校园网站方案STM32 CAN波特率计算简介CAN总线收发#xff0c;中断方式接收配置代码部分reference简介
CAN通信帧共分为数据帧、远程帧、错误帧、过载帧和帧间隔#xff0c;本文这里以数据帧为例。 显性电平对应逻辑0#xff0c;CAN_H和CAN_L之差为2.5V左右。而隐性电平对应逻辑1#x…
STM32 CAN波特率计算简介CAN总线收发中断方式接收配置代码部分reference简介
CAN通信帧共分为数据帧、远程帧、错误帧、过载帧和帧间隔本文这里以数据帧为例。 显性电平对应逻辑0CAN_H和CAN_L之差为2.5V左右。而隐性电平对应逻辑1CAN_H和CAN_L之差为0V. 数据帧有标准帧和扩张帧两种格式一个11位一个29位.
标准帧和扩张帧两种格式区别
1.扩展帧的仲裁域有29位可以出现2^29中报文且在数据链路上是有间隙的(对操作者透明)帧ID的范围是0000 0000-1FFF FFFF。PS目的就是构造29位的CAN ID可以实现更加庞大的ID群2.标准帧的仲裁域是连续的11位可以出现2^11种报文也就是帧ID的范围是000-7FF3.标准帧和扩张帧的控制帧中的DLC(数据长度)完全相同但保留位不同标准帧为IDE、R0扩展帧为R1、R0必须以显性电平发送(由数据链路层操作)
注意这里的帧ID 并不是表示发送的目的地址而是表示访问总线的消息的优先级帧ID值越小优先级越高最小是0x00000000
CAN协议特点 1、多主控制。 2、系统柔软性。 3、通讯速度快通讯距离远。 4、具有错误检测、错误通知、错误恢复功能。 5、故障封闭功能。 6、连接节点多
CAN总线具有自动仲裁功能这样就提高了总线的利用率。
CAN总线没有被发送出去的隐性信号会由CAN控制器后续发送出去。这里牵涉到CAN总线优先级的问题后续进一步讲述。 当然CAN相比485具有明显优势主要原因还是在于CAN控制器。
CAN直接通过TX连接对方的RX引脚单向传输可以双向传输就不行因为CAN控制器会实时监测发送出去的信号是否正确。也就是说TX要与RX信号一致才行否则CAN控制器认为你发送失败。
CAN总线收发中断方式接收配置
平台STM32F407VEt6 STM32CUBEMX V5.3
配置CAN CAN的波特率最大为1Mbps。
波特率计算方法时钟主频 / 分频 / (tq1 tq2 swj)以500K的波特率配置为例 stm32f407的CAN的时钟主频是42M分24频就是1.75M在除以(3 3 1)得到250K的波特率。 注意stm32cubemx生成的CAN代码是不带过滤器的需要自己手动添加。 CAN之数据帧格式
代码部分
CAN初始化
/* CAN1 init function */
void MX_CAN1_Init(void)
{//hz 42 / 24 / (331)hcan1.Instance CAN1;hcan1.Init.Prescaler 24;hcan1.Init.Mode CAN_MODE_NORMAL;hcan1.Init.SyncJumpWidth CAN_SJW_1TQ;hcan1.Init.TimeSeg1 CAN_BS1_3TQ;hcan1.Init.TimeSeg2 CAN_BS2_3TQ;hcan1.Init.TimeTriggeredMode DISABLE;hcan1.Init.AutoBusOff DISABLE;hcan1.Init.AutoWakeUp DISABLE;hcan1.Init.AutoRetransmission DISABLE;hcan1.Init.ReceiveFifoLocked DISABLE;hcan1.Init.TransmitFifoPriority DISABLE;if (HAL_CAN_Init(hcan1) ! HAL_OK){Error_Handler();}
}覆写接收中断回调函数 注意上面的配置我们使用的式FIFO0所以要覆写FIFO0的中断回调函数
//CANÖжϽÓÊջص÷º¯Êý£¬½ÓÊÕµ½µÄÖ¡Í·´æRxMessage£¬Êý¾Ý´ædataÊý×é
void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan)
{uint8_t data[8];HAL_StatusTypeDef status;if (hcan hcan1) {status HAL_CAN_GetRxMessage(hcan, CAN_RX_FIFO0, RxMessage, data);if (HAL_OK status){CAN_IDRxMessage.StdId;//±ê×¼Ö¡ID¸´ÖÆ//memcpy(SendBuff,data,8);//½ÓÊÕµ½µÄÊý¾Ý¿½±´µ½·¢ËÍÊý×é}HAL_GPIO_WritePin(GPIOB, GPIO_PIN_4, GPIO_PIN_RESET);}
}CA发送函数
/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
//CAN ·¢Ëͺ¯Êý
void CAN_SendMsg(uint16_t msgID, uint8_t *Data)
{CAN_TxHeaderTypeDef TxHeader;TxHeader.StdId msgID; //stdIDTxHeader.RTR CAN_RTR_DATA; //Êý¾ÝÖ¡,CAN_RTR_DATATxHeader.IDE CAN_ID_STD; //±ê×¼¸ñʽTxHeader.DLC 8; //Êý¾Ý³¤¶ÈTxHeader.TransmitGlobalTime DISABLE;uint8_t TxData[8]; //×î¶à8¸ö×Ö½ÚTxData[7] *(Data0);TxData[6] *(Data1);TxData[5] *(Data2);TxData[4] *(Data3); TxData[3] *(Data4);TxData[2] *(Data5);TxData[1] *(Data6);TxData[0] *(Data7);while(HAL_CAN_GetTxMailboxesFreeLevel(hcan1) 1) {} //µÈ´ýÓпÉÓõķ¢ËÍÓÊÏäuint32_t TxMailbox; //ÁÙʱ±äÁ¿, ÓÃÓÚ·µ»ØÊ¹ÓõÄÓÊÏä±àºÅ/* ·¢Ë͵½ÓÊÏ䣬ÓÉCANÄ£¿é¸ºÔð·¢Ë͵½CAN×ÜÏß */if(HAL_CAN_AddTxMessage(hcan1, TxHeader, TxData, TxMailbox) ! HAL_OK){}
}reference
STM32 CAN通讯配置