gd32f205 CAN通信程序
时间: 2023-09-14 07:02:27 浏览: 59
下面是一个基于GD32F205芯片的CAN通信程序示例:
```c
#include "gd32f20x.h"
#include "gd32f20x_can.h"
/* CAN初始化函数 */
void CAN_Configuration(void)
{
CAN_InitPara CAN_InitStructure;
CAN_FilterInitPara CAN_FilterInitStructure;
/* 使能CAN时钟 */
RCC_APB1PeriphClock_Enable(RCC_APB1PERIPH_CAN0,ENABLE);
/* CAN单元复位 */
CAN_DeInit(CAN0);
/* CAN单元初始化 */
CAN_InitStructure.CAN_TTCM = DISABLE;
CAN_InitStructure.CAN_ABOM = DISABLE;
CAN_InitStructure.CAN_AWUM = DISABLE;
CAN_InitStructure.CAN_NART = DISABLE;
CAN_InitStructure.CAN_RFLM = DISABLE;
CAN_InitStructure.CAN_TXFP = DISABLE;
CAN_InitStructure.CAN_Mode = CAN_MODE_NORMAL;
CAN_InitStructure.CAN_SJW = CAN_SJW_1TQ;
CAN_InitStructure.CAN_BS1 = CAN_BS1_11TQ;
CAN_InitStructure.CAN_BS2 = CAN_BS2_4TQ;
CAN_InitStructure.CAN_Prescaler = 2;
CAN_Init(CAN0,&CAN_InitStructure);
/* CAN过滤器初始化 */
CAN_FilterInitStructure.CAN_FilterNumber = 0;
CAN_FilterInitStructure.CAN_FilterMode = CAN_FILTERMODE_IDMASK;
CAN_FilterInitStructure.CAN_FilterScale = CAN_FILTERSCALE_32BIT;
CAN_FilterInitStructure.CAN_FilterIdHigh = 0x0000;
CAN_FilterInitStructure.CAN_FilterIdLow = 0x0000;
CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0x0000;
CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0x0000;
CAN_FilterInitStructure.CAN_FilterFIFOAssignment = CAN_FIFO0;
CAN_FilterInitStructure.CAN_FilterActivation = ENABLE;
CAN_FilterInit(&CAN_FilterInitStructure);
}
/* CAN发送函数 */
void CAN_SendData(uint32_t StdId,uint8_t* data,uint8_t len)
{
uint8_t i;
CAN_TransmitPara CAN_TxMessage;
CAN_TxMessage.CAN_IDE = CAN_ID_STD;
CAN_TxMessage.CAN_RTR = CAN_RTR_DATA;
CAN_TxMessage.CAN_DLC = len;
CAN_TxMessage.CAN_STDID = StdId;
for(i=0;i<len;i++)
{
CAN_TxMessage.CAN_Data[i] = data[i];
}
CAN_Transmit(CAN0,&CAN_TxMessage);
}
/* CAN接收函数 */
void CAN_ReceiveData(void)
{
uint8_t i;
CAN_ReceivePara CAN_RxMessage;
if(CAN_MessagePending(CAN0,CAN_FIFO0)==SUCCESS)
{
CAN_Receive(CAN0,CAN_FIFO0,&CAN_RxMessage);
for(i=0;i<CAN_RxMessage.CAN_DLC;i++)
{
printf("%c",CAN_RxMessage.CAN_Data[i]);
}
printf("\r\n");
}
}
```
在主函数中可以这样调用:
```c
int main(void)
{
uint8_t data[8] = {'H','e','l','l','o',' ','C','A'};
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
CAN_Configuration();
while(1)
{
CAN_SendData(0x123,data,8);
CAN_ReceiveData();
}
}
```
注意,这里的例子只是一个简单的示例,实际应用中还需要进行相应的修改。另外,还需要在GPIO配置中将CAN引脚设置为CAN功能,具体可以参考GD32F20x系列的数据手册。