add bsp_spi

This commit is contained in:
TuxMonkey
2025-11-03 22:08:14 +08:00
parent 38ecee9603
commit 7a113a32dd
6 changed files with 385 additions and 150 deletions

View File

@@ -1,10 +1,11 @@
# bsp_fdcan.c/bsp_fdcan.h
# 请注意使用FDCAN设备的时候务必保证总线只接入了2个终端电阻开发板一般都有一个6020电机、c620/c610电调、LK电机也都有终端电阻注意把多于2个的全部断开通过拨码
> 请注意使用FDCAN设备的时候务必保证总线只接入了2个终端电阻开发板一般都有一个6020电机、c620/c610电调、LK电机也都有终端电阻注意把多于2个的全部断开通过拨码
## 使用说明
若你希望新增一个基于FDCAN的module首先在该模块下应该有一个包含`FDCANInstance`指针的module结构体或当功能简单的时候可以是单独存在的`FDCANInstance`,但不推荐这样做)。
若你希望新增一个基于FDCAN的module首先在该模块下应该有一个包含`FDCANInstance`指针的module结构体或当功能简单的时候可以是单独存在的
`FDCANInstance`,但不推荐这样做)。
## 代码结构
@@ -64,7 +65,9 @@ typedef void (*fdcan_callback)(FDCANInstance *);
- `MX_CAN_FILTER_CNT`是最大的FDCAN接收过滤器数量三个FDCAN共享多个过滤器。当前为简单起见每个过滤器只设置一组规则用于控制一个id的过滤。
- `DEVICE_CAN_CNT`是MCU拥有的FDCAN硬件数量H7有3个
- `FDCANInstance`是一个FDCAN实例。注意FDCAN作为一个总线设备一条总线上可以挂载多个设备因此多个设备可以共享同一个FDCAN硬件。其成员变量包括发送id发送邮箱发送buff以及接收buff还有接收id和接收协议解析回调函数。**FDCAN支持最大64字节的数据帧**因此收发buff长度设置为64字节。
- `FDCANInstance`
是一个FDCAN实例。注意FDCAN作为一个总线设备一条总线上可以挂载多个设备因此多个设备可以共享同一个FDCAN硬件。其成员变量包括发送id发送邮箱发送buff以及接收buff还有接收id和接收协议解析回调函数。
**FDCAN支持最大64字节的数据帧**因此收发buff长度设置为64字节。
- `FDCAN_Init_Config_s`是用于初始化FDCAN实例的结构在调用FDCAN实例的初始化函数时传入。
@@ -80,7 +83,8 @@ uint8_t FDCANTransmit(FDCANInstance *_instance, float timeout);
void bsp_fdcan_set_baud(FDCAN_HandleTypeDef *hfdcan, uint8_t mode, uint8_t baud);
```
`FDCANRegister`是用于初始化FDCAN实例的接口module层的模块对象也应当为一个结构体内要包含一个`FDCANInstance`。调用时传入初始化配置的指针。`FDCANRegister`应当在module的初始化函数内被调用推荐config采用以下的方式定义更加直观明了
`FDCANRegister`是用于初始化FDCAN实例的接口module层的模块对象也应当为一个结构体内要包含一个`FDCANInstance`
。调用时传入初始化配置的指针。`FDCANRegister`应当在module的初始化函数内被调用推荐config采用以下的方式定义更加直观明了
```c
FDCAN_Init_Config_s config = {
@@ -92,7 +96,8 @@ FDCAN_Init_Config_s config = {
};
```
`FDCANTransmit()`是通过模块通过其拥有的FDCAN实例发送数据的接口调用时传入对应的instance。在发送之前应当给instance内的`tx_buff`赋值。
`FDCANTransmit()`是通过模块通过其拥有的FDCAN实例发送数据的接口调用时传入对应的instance。在发送之前应当给instance内的
`tx_buff`赋值。
`bsp_fdcan_set_baud()`用于设置FDCAN的波特率和模式经典CAN或CAN FD
@@ -119,11 +124,14 @@ void HAL_FDCAN_ErrorStatusCallback(FDCAN_HandleTypeDef *hfdcan, uint32_t ErrorSt
- `FDCANServiceInit()`会被`FDCANRegister()`调用对FDCAN外设进行硬件初始化并开启接收中断和消息提醒。
- `FDCANAddFilter()`在每次使用`FDCANRegister()`的时候被调用,用于给当前注册的实例添加过滤器规则并设定处理对应`rx_id`的接收FIFO。过滤器的作用是减小FDCAN收发器的压力只接收符合过滤器规则的报文否则不会产生接收中断
- `FDCANAddFilter()`在每次使用`FDCANRegister()`的时候被调用,用于给当前注册的实例添加过滤器规则并设定处理对应`rx_id`
的接收FIFO。过滤器的作用是减小FDCAN收发器的压力只接收符合过滤器规则的报文否则不会产生接收中断
- `FDCANDlcToLen()``FDCANLenToDlc()`是FDCAN特有的数据长度码转换函数用于在数据长度码和实际字节数之间转换。
- `HAL_FDCAN_RxFifo0Callback()``HAL_FDCAN_RxFifo1Callback()`都是对HAL的FDCAN回调函数的重定义原本的callback是`__weak`修饰的弱定义当发生FIFO0或FIFO1有新消息到达的时候对应的callback会被调用。`FDCANFIFOxCallback()`随后被前两者调用并根据接收id和硬件中断来源哪一个FDCAN硬件调用对应的instance的回调函数进行协议解析。
- `HAL_FDCAN_RxFifo0Callback()``HAL_FDCAN_RxFifo1Callback()`都是对HAL的FDCAN回调函数的重定义原本的callback是`__weak`
修饰的弱定义当发生FIFO0或FIFO1有新消息到达的时候对应的callback会被调用。`FDCANFIFOxCallback()`
随后被前两者调用并根据接收id和硬件中断来源哪一个FDCAN硬件调用对应的instance的回调函数进行协议解析。
- `HAL_FDCAN_ErrorStatusCallback()`处理FDCAN的错误状态包括总线关闭和错误被动状态的恢复。
@@ -148,9 +156,12 @@ __weak void fdcan3_rx_callback(void);
- CAN FD模式下支持最高64字节的数据帧
- 支持更高的通信速率最高5Mbps
3. **发送超时**由于FDCAN总线自带发送检测如果总线上没有挂载目标设备那么发送FIFO会被占满而无法发送。在`FDCANTransmit()`中会对发送FIFO是否已满进行检查。当超出`timeout`之后函数会返回零,说明发送失败。
3. **发送超时**由于FDCAN总线自带发送检测如果总线上没有挂载目标设备那么发送FIFO会被占满而无法发送。在`FDCANTransmit()`
中会对发送FIFO是否已满进行检查。当超出`timeout`之后函数会返回零,说明发送失败。
4. **任务阻塞**:由于卡在`while(1)`处不断检查FIFO是否空闲调用`FDCANTransmit()`的任务可能无法按时挂起导致任务定时不精确。建议在没有连接FDCAN进行调试时按需注释掉有关FDCAN发送的代码部分或设定一个较小的`timeout`值,防止对其他需要精确定时的任务产生影响。
4. **任务阻塞**:由于卡在`while(1)`处不断检查FIFO是否空闲调用`FDCANTransmit()`
的任务可能无法按时挂起导致任务定时不精确。建议在没有连接FDCAN进行调试时按需注释掉有关FDCAN发送的代码部分或设定一个较小的
`timeout`值,防止对其他需要精确定时的任务产生影响。
5. **模式选择**:使用`bsp_fdcan_set_baud()`函数可以在经典CAN模式和CAN FD模式之间切换注意不同模式支持的波特率范围不同。