【STM32G4xx的CAN驱动记录】
本文主要记录了基于STM32G4xx的CAN接口解析某型号雷达数据遇到的问题及规避方法,CAN总线波特率500Kbps,采样点要求80%附近。
注意CAN总线同步段的时间!!!
注意CAN总线同步段的时间!!!
注意CAN总线同步段的时间!!!
CAN说明
网上对于CAN的原理说明以及太多,这里就不再过多废话,主要把遇到的错误进行梳理。
CAN的波特率计算
手册内提到的波特率计算方法如下:
从手册中可知,只需根据时钟及设备要求的采样点配置同步段(SyncSeg)、位段1(Bit segment1)、位段2(Bit segment1)。
前期因为分频系数设置太低,导致CAN时钟较高,使得同步段的时间很小,与雷达相差太大导致无法同步,一般标准CAN的时钟在16MHz,当前10分频后CAN主频为17MHz,基本满足要求。
数据测试
采用RXFIFO0中断接收数据,利用双缓存存储数据
// 数据定义
FDCAN_RxHeaderTypeDef RxHeader;
typedef struct {
uint8_t buf[255];
uint8_t head;
uint8_t size;
} ByteFIFO;
bool radar_buf1_idle = true;
bool radar_buf2_idle = true;
ByteFIFO radar_fifo1, radar_fifo2;
// CAN中断处理
void HAL_FDCAN_RxFifo0Callback(FDCAN_HandleTypeDef *hfdcan, uint32_t RxFifo0ITs)
{
if((RxFifo0ITs & FDCAN_IT_RX_FIFO0_NEW_MESSAGE) != RESET)
{
if(radar_buf1_idle == true)
{
// 帧头
radar_fifo1.buf[radar_fifo1.head] = 0xAA;
radar_fifo1.buf[radar_fifo1.head+1] = 0xAA;
// 雷达数据ID
radar_fifo1.buf[radar_fifo1.head+2] = RxHeader.Identifier & 0Xff;
radar_fifo1.buf[radar_fifo1.head+3] = (RxHeader.Identifier>>8) & 0Xff;
/* Retrieve Rx messages from RX FIFO0 */
// 雷达数据
HAL_FDCAN_GetRxMessage(hfdcan, FDCAN_RX_FIFO0, &RxHeader, &radar_fifo1.buf[radar_fifo1.head+4]);
// 帧尾
radar_fifo1.buf[radar_fifo1.head+12] = 0x55;
radar_fifo1.buf[radar_fifo1.head+13] = 0x55;
radar_fifo1.size = radar_fifo1.size + 14;
radar_fifo1.head = radar_fifo1.head + 14;
}
else if(radar_buf2_idle == true)
{
radar_fifo2.buf[radar_fifo2.head] = 0xAA;
radar_fifo2.buf[radar_fifo2.head+1] = 0xAA;
radar_fifo2.buf[radar_fifo2.head+2] = RxHeader.Identifier & 0Xff;
radar_fifo2.buf[radar_fifo2.head+3] = (RxHeader.Identifier>>8) & 0Xff;
/* Retrieve Rx messages from RX FIFO0 */
HAL_FDCAN_GetRxMessage(hfdcan, FDCAN_RX_FIFO0, &RxHeader, &radar_fifo2.buf[radar_fifo2.head+4]);
radar_fifo2.buf[radar_fifo2.head+12] = 0x55;
radar_fifo2.buf[radar_fifo2.head+13] = 0x55;
radar_fifo2.size = radar_fifo2.size + 14;
radar_fifo2.head = radar_fifo2.head + 14;
}
}
}
总结
当前不论是ST还是国产MCU,基本都要GUI工具进行工程配置,只要理解了相关驱动的原理,简单配置就能够使用了,再也不会被N多寄存器支配的恐惧了,但是针对某些要求高效运行的场合还是需要使用寄存器,可采用GUI配置完成后在特定地方采用寄存器即可。
原文地址:https://blog.csdn.net/qq_39016531/article/details/145257891
免责声明:本站文章内容转载自网络资源,如侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!