云途IIC外设介绍
GaoSheng Lv4

简单介绍一下云途的IIC外设,以MD系列为例:
image

对上图可能不是那么常用的功能做一个简单的介绍:
SMBus:由 Intel 提出的系统管理总线协议,基于 I²C 设计,但针对电源管理、硬件监控等场景增加了特定规范(如超时、数据包格式、CRC 校验等)。
时钟拉伸(Clock Stretching) :允许从机(或主机)通过主动控制 SCL(时钟线) 的时序来暂停总线通信的机制。其核心目的是让设备在需要更多时间处理数据时,能够主动“暂停”总线时钟,避免通信超时或数据丢失。

外部时钟是指做从机时,使用外部的SCL时钟;从表可知,IIC竟然能够在睡眠模式下工作
image
其中FF: 全部功能(Full Function)
image

从下图可知MD总线时钟为SLOW_BUS,Peripheral Functional Clock -> Yes,则说明该模块的外设时钟支持配置可选
补充:其中的“其他时钟Additional Clock” 对于这些模块,应用中除了 IPC 中进行合适的功能时钟选择之外,还可以根据需要在模块内部进行进一步的时钟选择。
以FlexCAN模块为例,FlexCAN 模块的时钟可以选择 FAST_BUS_CLK 或者 FXOSC_CLK,这部分的选择是在 FlexCAN 模块内部实现的。这部分是在 CAN 模块的配置结构体中实现的,外设功能时钟栏是“ - ”,即不能在YCT功能的时钟页面配置时钟
image

image
image

使用云途的YCT工具进行外设的时钟配置还是挺方便的,所见即所得
image

下面是YCT配置IIC外设介绍,需要注意的是因为i2c的接受和发送在SDK内部处理是一样的,所有只需要选择TX或者RX一个就行。
image
云途IIC发送数据有两套API:

1
2
3
4
5
6
7
8
9
status_t I2C_DRV_MasterSendData(uint32_t instance,
const uint8_t *txBuff,
uint32_t txSize,
bool sendStop)
status_t I2C_DRV_MasterSendDataBlocking(uint32_t instance,
const uint8_t *txBuff,
uint32_t txSize,
bool sendStop,
uint32_t timeout)

主要区别在于 阻塞模式 和 非阻塞模式 的实现方式:
带blocking的API使用一个 超时机制(通过 OSIF_SemaWait 等待信号量)来等待传输完成。
如果传输在指定的超时时间内未完成,则返回超时错误。
在传输完成后,释放阻塞状态并返回结果。

不带blocking的API,会立即返回,不会等待数据传输完成。用户可以通过轮询 I2C_DRV_MasterGetTransferStatus 或使用回调函数来检查传输状态

当部分器件对CLK高低点评持续时间要求较高时,可通过MCLKCFG寄存器的HIGH/LOW寄存器位(6bit)进行调整
image

本站由 提供部署服务