既然是HAL库的话怎么配置代码此处就省略了哈…
CAN通讯原理详情什么的请看这篇文章STM32(HAL)——CAN通信
这篇文章写的已经很详细了,也可以去看看原子哥的视屏介绍,两节课,介绍的很详细。
上代码:
usr_can.h
#ifndef USR_CAN_USR_CAN_H_
#define USR_CAN_USR_CAN_H_
#include "main.h"
#include "can.h"
typedef struct
{
uint8_t can_rxDat:1;//can接收到数据
}Can_RXTX_FLAG;
void CANx_SendMessage(CAN_HandleTypeDef *hcan,uint16_t ID, uint8_t *Data,uint16_t Len);
uint8_t CANx_SendExtData(CAN_HandleTypeDef* hcan,uint32_t ID,uint8_t *pData,uint16_t Len);
void CAN_Start(CAN_HandleTypeDef *hcan);
#endif /* USR_CAN_USR_CAN_H_ */
usr_can.c
#include "usr_can.h"
CAN_DATA_Packeg canTX_Packeg,canRX_Packeg;
Can_RXTX_FLAG canFlag;
uint8_t CanRecBuffer[256];
//发送标准帧的函数
void CANx_SendMessage(CAN_HandleTypeDef *hcan,uint16_t ID, uint8_t *Data,uint16_t Len)
{
static CAN_TxHeaderTypeDef TxHeader;
TxHeader.StdId = ID;
TxHeader.ExtId = 0;
TxHeader.IDE = CAN_ID_STD;
TxHeader.RTR = CAN_RTR_DATA;
TxHeader.DLC = 8;
if(HAL_CAN_AddTxMessage(hcan, &TxHeader, Data, (uint32_t *)CAN_TX_MAILBOX0) != HAL_OK)
{
if(HAL_CAN_AddTxMessage(hcan, &TxHeader, Data, (uint32_t *)CAN_TX_MAILBOX1) != HAL_OK)
{
HAL_CAN_AddTxMessage(hcan, &TxHeader, Data, (uint32_t *)CAN_TX_MAILBOX2);
}
}
}
void CAN_Start(CAN_HandleTypeDef *hcan)
{
HAL_CAN_ActivateNotification(hcan ,CAN_IT_RX_FIFO0_MSG_PENDING);
HAL_CAN_Start(hcan);
}
/*******************************************************************************
* Function Name : HAL_CAN_RxFifo0MsgPendingCallback
* Description : 消息接收回调函数
* Input : hcan
* Output : None
* Return : None
*******************************************************************************/
void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan)
{
if(hcan->Instance == CAN1)
{
CAN_RxHeaderTypeDef RxHeader;//接收句柄
if( HAL_CAN_GetRxMessage(hcan, CAN_RX_FIFO0, &RxHeader, (uint8_t *)&CanRecBuffer) == HAL_OK)
{
canFlag.can_rxDat = true;
}
}
}
需要注意的是在初始化阶段需要先调用
CAN_Start(&hcan1);
main.c
#include "can.h"
int main()
{
uint16_t CAN_ID = 0x1234;
uint8_t canTxAarray[7]="hello\r\n"
//此处省略初始化代码
CAN_Start(&hcan1);
while(1)
{
CANx_SendMessage(&hcan1,CAN_ID ,(uint8_t *)&canTxAarray,sizeof(canTxAarray));
HAL_Delay(1000);
}
}
至此 你的Can 的另一个接收端就能收到 "hello"字符了
不然发送函数不能使用哈
can配置如下
波特率500kbps
代码亲测可用哦,有啥问题欢迎私信或者评论在下方