一、CAN总线通信 发送
1. CAN总线通信发送配置流程
1.写入标识符
2.写入标识符类型(标准帧/扩展帧)
3.写入帧类型(远程帧/数据帧)
4.写入数据长度
5.写入数据
6.发送数据
2. CAN总线通信发送相关库函数
发送数据结构体:
- typedef struct
- {
- uint32_t StdId; /*!<指定标准标识符
- 该参数可以是0到0x7FF之间的值,11位数据 */
- uint32_t ExtId; /*!< 指定扩展标识符
- 该参数可以是0到0x1FFFFFFF之间的值,29位数据 */
- uint8_t IDE; /*!< 指定要传输的消息的标识符类型
- 标准帧:CAN_ID_STD
- 扩展帧:CAN_ID_EXT */
- uint8_t RTR; /*!< 指定要传输的消息的帧类型
- 数据帧:CAN_RTR_DATA
- 远程帧:CAN_RTR_REMOTE */
- uint8_t DLC; /*!< 指定将要传输的帧的长度。
- 取值范围为0 ~ 8 */
- uint8_t Data[8]; /*!< 包含要传输的数据。
- 取值范围是0 ~ 0xFF */
- } CanTxMsg;
复制代码
发送库函数:
- /**
- * @brief Initiates the transmission of a message.
- * @param CANx: where x can be 1 or 2 to to select the CAN peripheral.
- * @param TxMessage: pointer to a structure which contains CAN Id, CAN
- * DLC and CAN data.
- * @retval The number of the mailbox that is used for transmission
- * or CAN_TxStatus_NoMailBox if there is no empty mailbox.
- */
- uint8_t CAN_Transmit(CAN_TypeDef* CANx, CanTxMsg* TxMessage);
复制代码
3.CAN总线通信发送程序
标准帧具体代码如下:
- CanTxMsg TxMessage; //定义结构体变量
- /* 发送数据*/
- void CAN_TX(void)
- {
- TxMessage.StdId=0x01; //标准标识符为0x01
- TxMessage.IDE=CAN_ID_STD; //使用标准标识符 CAN_ID_STD
- TxMessage.RTR=CAN_RTR_DATA; //为数据帧
- TxMessage.DLC=0x08; //消息的数据长度为8个字节
- TxMessage.Data[0]=0x01; //第1个字节数据
- TxMessage.Data[1]=0x02; //第2个字节数据
- TxMessage.Data[2]=0x03; //第3个字节数据
- TxMessage.Data[3]=0x04; //第4个字节数据
- TxMessage.Data[4]=0x05; //第5个字节数据
- TxMessage.Data[5]=0x06; //第6个字节数据
- TxMessage.Data[6]=0x07; //第7个字节数据
- TxMessage.Data[7]=0x08; //第8个字节数据
- CAN_Transmit(CAN1, &TxMessage); //发送数据
- }
复制代码
扩展帧具体代码如下:
- CanTxMsg TxMessage; //定义结构体变量
- /* 发送两个字节的数据*/
- void CAN_TX(void)
- {
- TxMessage.ExtId=0x1FFFFFFF; //扩展标识符 0x1FFFFFFF
- TxMessage.IDE=CAN_ID_EXT; //使用标准标识符 CAN_ID_EXT
- TxMessage.RTR=CAN_RTR_DATA; //为数据帧
- TxMessage.DLC=0x08; //消息的数据长度为8个字节
- TxMessage.Data[0]=0x01; //第1个字节数据
- TxMessage.Data[1]=0x02; //第2个字节数据
- TxMessage.Data[2]=0x03; //第3个字节数据
- TxMessage.Data[3]=0x04; //第4个字节数据
- TxMessage.Data[4]=0x05; //第5个字节数据
- TxMessage.Data[5]=0x06; //第6个字节数据
- TxMessage.Data[6]=0x07; //第7个字节数据
- TxMessage.Data[7]=0x08; //第8个字节数据
- CAN_Transmit(CAN1, &TxMessage); //发送数据
- }
复制代码
二、CAN总线通信 接收
1. CAN总线通信接收配置流程
进入CAN总线接收中断
CAN总线接收库函数接收数据
解析接收数据
实现对应功能
2. CAN总线通信接收相关库函数
接收数据结构体:
- typedef struct
- {
- uint32_t StdId; /*!<指定标准标识符
- 该参数可以是0到0x7FF之间的值 */
- uint32_t ExtId; /*!< 指定扩展标识符
- 该参数可以是0到0x1FFFFFFF之间的值 */
- uint8_t IDE; /*!< 指定要传输的消息的标识符类型
- 标准帧:CAN_ID_STD
- 扩展帧:CAN_ID_EXT */
- uint8_t RTR; /*!< 指定要传输的消息的帧类型
- 数据帧:CAN_RTR_DATA
- 远程帧:CAN_RTR_REMOTE */
- uint8_t DLC; /*!< 指定将要传输的帧的长度。
- 取值范围为0 ~ 8 */
- uint8_t Data[8]; /*!< 包含要传输的数据。
- 取值范围是0 ~ 0xFF */
-
- uint8_t FMI; /*!< 指定存储在邮箱中的消息所经过的筛选器的索引
- 该参数可以是0到0xFF之间的值 */
- } CanRxMsg;
复制代码
接收库函数:
- /**
- * @brief Receives a message.
- * @param CANx: where x can be 1 or 2 to to select the CAN peripheral.
- * @param FIFONumber: Receive FIFO number, CAN_FIFO0 or CAN_FIFO1.
- * @param RxMessage: pointer to a structure receive message which contains
- * CAN Id, CAN DLC, CAN datas and FMI number.
- * @retval None.
- */
- void CAN_Receive(CAN_TypeDef* CANx, uint8_t FIFONumber, CanRxMsg* RxMessage);
复制代码
3. CAN总线通信接收程序
标准帧:
具体代码如下:
- CanRxMsg RxMessage;//定义结构体变量
- //接收中断
- void USB_LP_CAN1_RX0_IRQHandler(void)
- {
- CAN_Receive(CAN1, CAN_FIFO0, &RxMessage); //接收FIFO0中的数据
- get_data(&RxMessage); //接收数据处理函数
- }
- //接收数据处理函数
- void get_data(CanRxMsg* rxMsg)
- {
- switch(rxMsg->StdId) //判断标准帧标识符
- {
- case 0x001:
- //要实现的功能
- break;
- /*
- *
- 其他标识未列出
- */
- case 0x7ff:
- //要实现的功能
- break;
- default :
- break;
- }
- }
复制代码
扩展帧:
具体代码如下:
- CanRxMsg RxMessage;//定义结构体变量
- //接收中断
- void USB_LP_CAN1_RX0_IRQHandler(void)
- {
- CAN_Receive(CAN1, CAN_FIFO0, &RxMessage); //接收FIFO0中的数据
- get_data(&RxMessage); //接收数据处理函数
- }
- //接收数据处理函数
- void get_data(CanRxMsg* rxMsg)
- {
- switch(rxMsg->ExtId) //判断扩展帧标识符
- {
- case 0x00000001:
- //要实现的功能
- break;
- /*
- *
- 其他标识未列出
- */
- case 0x1FFFFFFF:
- //要实现的功能
- break;
- default :
- break;
- }
- }
复制代码
|