API GUIDE / CAN / LL
G32S10 CAN LL 接口
LL 层接口:控制器仅提供一个 CAN 侧 DMA mode bit:
1. DMA 寄存器窗口
控制器仅提供一个 CAN 侧 DMA mode bit:
request,其目标/源地址通过以下接口获得:
HAL 不申请 DMA 通道、不创建 descriptor、不管理 cache coherency,也不决定内存中 如何表示帧流;这些职责属于更高层。
2. LL 接口
ll_can.h 提供无软件状态的寄存器级 inline helper。接口按照寄存器功能可分为:
| 分组 | 代表接口 | 作用 |
|---|---|---|
| Mode/reset | ll_can_enter_reset()、ll_can_exit_reset()、ll_can_get_reset() | 控制和读取 RSTM,以及 FD、DMA、自恢复、自测、只听等 mode bit |
| Command | ll_can_tx_req()、ll_can_abort_tx()、ll_can_release_rx_buf() | 发送、终止发送、释放 RX buffer 和清除 overrun |
| Status | ll_can_get_stat_raw()、ll_can_get_tx_buffer_status()、ll_can_get_rx_buffer_status() | 读取原始或单项控制器状态 |
| IRQ | ll_can_set_all_irq_en()、ll_can_read_and_clear_irq_status()、ll_can_decode_irq_events() | 配置外设中断源并解码 pending event |
| Timing | ll_can_set_tseg1()、ll_can_set_tseg2()、ll_can_set_cancs() | 写入仲裁域和数据域原始时序字段 |
| Filter | ll_can_set_filter_id()、ll_can_set_filter_mask()、ll_can_enable_filter() | 配置四组 acceptance filter |
| Error | ll_can_get_err_raw()、ll_can_get_tx_err_cnt()、ll_can_reset_error_state() | 读取或复位控制器错误状态 |
| Frame window | ll_can_set_tx_*()、ll_can_get_rx_*() | 访问 TFIR/TXID/TXDATA 和 RFIR/RXID/RXDATA |
| DMA address | ll_can_get_tx_frame_buffer_addr()、ll_can_get_rx_frame_buffer_addr() | 获得 TX/RX 寄存器窗口地址 |
| Self-loop/security | ll_can_set_sl_key()、ll_can_set_ip_reset()、ll_can_set_tx_off() | 访问 SL 安全寄存器字段 |
直接调用 LL 时,调用方必须自行保证:
CAN 模块时钟和 gate 已由平台层正确使能;
所有仅允许在 RSTM 状态修改的字段均在 reset 中配置;
command、RX release、IRQ read-to-clear 等有副作用操作只执行一次且顺序正确;
不与 HAL 或其他调用者并发访问同一控制器;
自行实现参数检查、timeout、错误恢复和软件状态管理。
CANINT 的 pending bit 为 read-to-clear。ll_can_read_and_clear_irq_status() 应在一次
IRQ 处理中只调用一次,再把返回快照交给 ll_can_decode_irq_events(),不能为了逐项
判断而重复读取寄存器。
SL 中受保护的字段应在 RSTM=1 时访问,并先显式调用:
ll_can_set_sl_key(canx, 0x6U);
随后再调用 ll_can_set_ip_reset()、ll_can_set_tx_off() 或 self-loop 相关 helper。
LL 不会替调用方维护 unlock 生命周期。