函数:main() — 初始化 CAN(500Kbps,正常模式)和串口,串口收到 's' 指令时发送 8 字节数据帧,同时轮询接收 CAN 报文。
int main(void)
{
uint8_t res, i, key;
uint8_t canbuf[8];
RCC_ClocksTypeDef clocks;
delay_init();
UART_Configuration(115200);
RCC_GetClocksFreq(&clocks);
printf("\n");
printf("SYSCLK: %3.1fMhz, HCLK: %3.1fMhz, PCLK1: %3.1fMhz, "
"PCLK2: %3.1fMhz, ADCCLK: %3.1fMhz\n",
(float)clocks.SYSCLK_Frequency / 1000000,
(float)clocks.HCLK_Frequency / 1000000,
(float)clocks.PCLK1_Frequency / 1000000,
(float)clocks.PCLK2_Frequency / 1000000,
(float)clocks.ADCCLK_Frequency / 1000000);
printf("CAN Normal Test.\n");
/* CAN 初始化:500Kbps,正常模式 */
CAN_Mode_Init(CAN_SJW_1tq, CAN_BS2_8tq, CAN_BS1_9tq, 4, CAN_Mode_Normal);
while (1)
{
/* 串口收到 's' 指令时发送数据 */
if (GetCmd() == 's')
{
for (i = 0; i < DATA_LEN; i++)
{
canbuf[i] = 0x5A + i;
}
res = Can_Send_Msg(canbuf, 8); // 发送 8 字节
if (res == 0)
printf("Can Normal Send Data Success\n");
else
printf("Can Normal Send Data Fail\n");
}
/* 轮询查询是否收到数据 */
key = Can_Receive_Msg(canbuf);
if (key)
{
printf("Can Normal Recv Data Success\n");
for (i = 0; i < key; i++)
{
printf("canbuf[%d] = 0x%x\n", i, canbuf[i]);
}
}
}
}
主循环中,串口收到 's' 指令时发送 8 字节数据(0x5A~0x61),ID=0x12。同时持续轮询 Can_Receive_Msg() 检查是否收到 CAN 报文,收到则逐字节打印。
运行验证
打开 WIZ UartTool V1.0,波特率 115200 / 8N1。下载固件并按 RESET 后,串口先打印系统时钟信息和 "CAN Normal Test."。在串口工具中输入字符 's' 发送,开发板收到后通过 CAN 总线发送 8 字节数据帧(ID=0x12),并打印 "Can Normal Send Data Success"。若总线上有其他节点发来数据,则打印接收内容。如使用 CAN 分析仪软件,可看到总线上的数据帧。
例程在 WIZ UartTool V1.0 上的输出信息,输入“s”执行 CAN 发送数据CAN 分析仪显示总线数据帧
常见问题
Q: CAN 通信无数据收发
确认 CAN 模式设置正确。环回模式(LoopBack)下无需外部收发器即可自测。正常模式(Normal)下必须连接 CAN 收发器芯片和终端电阻(120Ω)。检查波特率参数是否与总线一致。