API GUIDE / SPI / LL
G32S10 SPI LL 接口
LL 层接口:重要边界:
1. 分层关系与文件组织
APPLICATION SPI Middleware / Advanced Driver 总线抽象、设备访问或直接使用 HAL
↓
PIN CONTROL GPIO pinmux 选择 SPI 信号引脚与复用功能
INTERRUPT SoC IRQ request / routing 把 SPI 中断接入统一中断分发
↓ 平台资源就绪后进入 SPI 数据通路
HAL HAL SPI 控制、FIFO、IRQ 源与 DMA 请求语义
↓
LL LL SPI 寄存器访问与字段级控制
↓
HARDWARE REGISTERS SPI0 / SPI1 Registers 实例地址、寄存器布局与位域定义
| 层次 | 负责内容 | 不负责内容 |
|---|---|---|
| Platform/Application | GPIO pinmux、控制器选择、SoC IRQ 申请和路由 | SPI 寄存器细节和 HAL 内部状态 |
| HAL SPI | CPM module clock/gate、参数校验、寄存器组合、FIFO、状态、控制器 IRQ source、DMA request 语义和 callback 分发 | SoC im_irq_request()、板级 pinmux、完整传输状态机和 timeout |
| LL SPI | 寄存器位级读写 | 参数保护、软件状态、传输流程和并发保护 |
重要边界:
HAL 只记录 TX underrun 和 RX overrun 等硬件错误,不表达完整传输的 busy、timeout 或完成状态机。
2. 硬件能力与资源模型
2.1 寄存器映射
| SDK 寄存器 | 偏移 | 主要用途 |
|---|---|---|
SSIDR | 0x0000 | TX/RX FIFO 数据寄存器 |
SSICR0 | 0x0004 | 使能、IRQ、endian、loopback、接收和 FIFO flush |
SSICR1 | 0x0008 | 协议、阈值、帧长、CPHA/CPOL、interval 和 CS 时序 |
SSISR | 0x000C | FIFO 数量、状态、错误和 END |
SSIITR | 0x0010 | interval 计数时钟和间隔时间 |
SSIICR | 0x0014 | 两次 interval 之间的连续帧数组编码 |
SSIGR | 0x0018 | 串行时钟分频 CGV |
SSIRCNT | 0x001C | 接收帧计数 |
SSITEN | 0x0020 | surplus 功能使能 |
SSITLOAD | 0x0024 | surplus 计数装载/复位 |
SSITCNT | 0x0028 | surplus 计数值 |
3. LL 接口与寄存器约定
3.1 LL 使用边界
LL 函数全部为 static inline,直接读写寄存器:
不检查
spix是否有效。不检查字段范围。
不维护 HAL 配置快照。
不提供并发保护。
调用方必须理解寄存器的 write-one、write-zero、auto-clear 和 level 状态语义。
普通应用不应绕过 HAL 直接使用 LL。
3.2 数据、使能和 IRQ helper
| 功能 | LL 接口 |
|---|---|
| 数据 FIFO | ll_spi_write_data、ll_spi_read_data |
| END IRQ | ll_spi_enable_end_intr、ll_spi_disable_end_intr、ll_spi_get_end_intr_status |
| 控制器 | ll_spi_enable、ll_spi_disable、ll_spi_is_enabled |
| TX threshold IRQ | ll_spi_enable_tie、ll_spi_disable_tie、ll_spi_tie_is_enabled |
| RX threshold IRQ | ll_spi_enable_rie、ll_spi_disable_rie、ll_spi_rie_is_enabled |
| TX error IRQ | ll_spi_enable_teie、ll_spi_disable_teie、ll_spi_teie_is_enabled |
| RX error IRQ | ll_spi_enable_reie、ll_spi_disable_reie、ll_spi_reie_is_enabled |
3.3 SSICR0 helper
| 功能 | LL 接口 |
|---|---|
| TX endian | ll_spi_set_txendian、ll_spi_get_txendian |
| RX endian | ll_spi_set_rxendian、ll_spi_get_rxendian |
| Loopback | ll_spi_enable_loop、ll_spi_disable_loop、ll_spi_get_loop_status |
| Receive finish | ll_spi_enable_rfine、ll_spi_disable_rfine、ll_spi_rfine_is_enabled、ll_spi_enable_rfinc、ll_spi_disable_rfinc、ll_spi_get_rfinc_status、ll_spi_get_receive_finish_condition |
| Error auto clear/run | ll_spi_enable_eaclrun、ll_spi_disable_eaclrun、ll_spi_eaclrun_is_enabled |
| Hardware CS select | ll_spi_set_fsel、ll_spi_get_fsel_selection |
| Receive count enable | ll_spi_enable_rcnt、ll_spi_disable_rcnt、ll_spi_rcnt_is_enabled |
| TX FIFO empty mode | ll_spi_set_new_tfmode、ll_spi_set_old_tfmode、ll_spi_get_tfmode_status |
| FIFO flush | ll_spi_set_tflush、ll_spi_set_rflush |
| Receive enable | ll_spi_enable_receive、ll_spi_disable_receive、ll_spi_get_receive_status |
3.4 SSICR1 helper
| 功能 | LL 接口 |
|---|---|
| CS active level | ll_spi_set_frmhl、ll_spi_get_frmhl |
| Frame timing | ll_spi_set_tfvck、ll_spi_get_tfvck、ll_spi_set_tckfi、ll_spi_get_tckfi |
| GPC mode/level | ll_spi_set_gpc_special、ll_spi_set_gpc_normal、ll_spi_get_gpc_status、ll_spi_set_gpc_high、ll_spi_set_gpc_low、ll_spi_get_gpc_level |
| Interval | ll_spi_enable_itfrm、ll_spi_disable_itfrm、ll_spi_get_itfrm_status |
| Continue on underrun | ll_spi_enable_unfin、ll_spi_disable_unfin、ll_spi_get_unfin_status |
| Protocol | ll_spi_set_fmat、ll_spi_get_fmat |
| Threshold | ll_spi_set_ttrg、ll_spi_get_ttrg、ll_spi_set_rtrg、ll_spi_get_rtrg |
| Microwire command | ll_spi_set_mcom、ll_spi_get_mcom |
| Frame length | ll_spi_set_flen、ll_spi_get_flen |
| CPHA/CPOL | ll_spi_set_pha_value、ll_spi_get_pha_value、ll_spi_set_pol_value、ll_spi_get_pol_value |
3.5 SSISR helper
| 功能 | LL 接口 |
|---|---|
| END | ll_spi_clear_end、ll_spi_get_end_flag |
| DMA/request 状态 | ll_spi_get_treqn_dma_status、ll_spi_get_treqn_status、ll_spi_get_tsurplus_status、ll_spi_get_rreqn_dma_status、ll_spi_get_rreqn_status、ll_spi_get_rsurplus_status |
| FIFO count | ll_spi_get_tfifo_num、ll_spi_get_rfifo_num |
| Raw status | ll_spi_status_raw_get |
| Busy/FIFO | ll_spi_is_busy、ll_spi_is_tx_fifo_full、ll_spi_is_rx_fifo_empty |
| Threshold level | ll_spi_is_tfhe、ll_spi_is_rfhf |
| TX underrun | ll_spi_is_tundr、ll_spi_clear_tundr |
| RX overrun | ll_spi_is_rover、ll_spi_clear_rover |
3.6 Interval、clock 和 count helper
| 寄存器 | LL 接口 |
|---|---|
SSIITR | ll_spi_set_cntclk、ll_spi_get_cntclk_selection、ll_spi_set_ivltm、ll_spi_get_ivltm |
SSIICR | ll_spi_set_icc、ll_spi_get_icc |
SSIGR | ll_spi_set_cgv、ll_spi_get_cgv |
SSIRCNT | ll_spi_set_rcnt、ll_spi_get_rcnt |
ICC 是编码值,实际两次 interval 之间连续传输帧数为 ICC + 1。
3.7 Surplus helper
| 功能 | LL 接口 |
|---|---|
| Enable | ll_spi_enable_sen_rff、ll_spi_disable_sen_rff、ll_spi_sen_rff_is_enabled、ll_spi_enable_sen_tff、ll_spi_disable_sen_tff、ll_spi_sen_tff_is_enabled |
| Load/reset | ll_spi_reset_sld_rff、ll_spi_reset_sld_tff |
| Count | ll_spi_set_snum、ll_spi_get_snum、ll_spi_set_tnum、ll_spi_get_tnum |
当前 HAL 普通接口不使用 surplus 功能;这些 LL 接口供专用场景使用。