I2C总线的一种灵活控制方法

2023-07-10
浏览量:
65


I2C作为常用的通讯外设,广泛应用在各种通讯场合,而且也衍生各种变体协议,比如SCCB,SMbus,PMbus等等。先楫半导体在I2C这个通讯外设上,每个传输的阶段都可以独立自由去控制,这也极大得提高了开发的自由灵活度,而且也可以随性发挥生成I2C的变体协议,而不需要去进行IO模拟。


首先介绍一下先楫半导体I2C的一些主要特性和功能,方便后续说明,大家也可以到官网参考先楫用户手册。


1

I2C 特征

  • 支持标准模式 (100Kb/s),快速模式 (400Kb/s) 和快速模式 +(1Mb/s)

  • 可配置主从模式

  • 支持 7 位和 10 位地址模式

  • 支持广播呼叫地址 (general call address)

  • 自动时钟延展 (clock stretching)

  • 可配置的时钟/数据时序

  • 支持直接内存访问 (DMA)

  • 4 字节 FIFO


2

I2C 功能

  • 每个传输由 4 个阶段组成:起始,地址,数据和结束。在起始阶段会产生 START 操作,在地址阶段发送地址,在数据阶段 1 个或多个数据字节被传送,在结束阶段产生 STOP 操作。每个阶段都能够独立控制是否执行


  • 4个字节FIFO,可不使用DMA的情况下,满足多字节一次性传输。并且软件没有准备好下一个字节的收发数据或者FIFO已满时候,I2C控制器会自动延展I2C总线时钟来暂停总线传输。


  • I2C控制器默认使能了自动ACK响应,即是除了最后一个字节外其余字节接收后都会自动发出ACK,软件可以使能字节接收中断来禁止自动响应功能,软件自己接收后决定是否发送ACK。


3

场合需求

在某些场合,当I2C作为主机的时候,一次数据量传输当中,可能会有以下的需求方式:


  • 传输过程中间变化读写方向,比如START操作到第一个数据字节传输是写,后面变为读。或者读变成写。


  • 传输过程中分三次传输,START,数据,STOP传输。比如第一次传输需要带START,但不需要STOP。


  • 传输过程中需要restart重新发送start信号。

    举例,比如SMBUS,在进行block read传输中,就需要传输过程中发送restart信号,并且切换读写方向。


4

实现方式

先楫半导体的用户手册对于 I2C 的寄存器说明一共有好几个,本文重点介绍以下三个密切相关的寄存器:


1. CTRL寄存器:该寄存器是用来配置一次传输中的每个阶段的控制,比如主机模式下,方向是发送,在START开始后,STOP结束前,传输的是数据段,可以不发START,地址,STOP。那么可以对其寄存器的对应位进行开启和关闭。


2. INTEN寄存器的BYTERECV位,开启或关闭自动响应功能。


3. CMD寄存器:定义的是对一次transaction的相关操作。比如主机在接收到从机的数据,需要不接受数据了,可以发送一个NACK响应。前提是关闭了自动响应功能。


根据以上的寄存器说明,在新的sdk版本V1.2.0中,我们在SDK的i2c driver中看到有定义一个顺序传输接口,定义一个枚举,分别表示第一帧,中间帧,最后一帧。

/**


* @brief I2c sequential transfer options


* @arg: i2c_frist_frame: has start signal


* @arg: i2c_next_frame: middle transfer


* @arg: i2c_last_frame: has stop signal


*/


typedef enum i2c_seq_transfer_opt {


  i2c_frist_frame = 0,


  i2c_next_frame,


  i2c_last_frame,


} i2c_seq_transfer_opt_t;


对于发送接口,sdk1.2也提供了i2c_master_seq_transimit 这个 API。


对于接收接口,sdk1.2也提供了i2c_master_seq_receive这个API,从内部API可以看出是关闭自动响应,软件控制一次传输的ACK和NACK,避免STOP未出现时出现数据断开。


5

验证功能

根据以上信息,我们来操作一个实验,以sdk的poll例子的master和slave两个开发板进行相互收发,slave不做改动,master的读写接口替换以上的接口。

image.png

image.png

实验现象

① 当把一次完整传输拆分三次frame传输时候,依旧是没什么问题的。可见以上的功能使用并没有什么问题。


② 可以模拟下一个配置错误的现象,开启auto-ack功能,master接收slave数据的数据,由于开启了自动响应,在第一包frame接收的时候,I2C控制器认为传输到最后一个字节,会自动补充NACK,但我们并不希望补充NACK,因为一次完整的传输还没完成,这时候就需要软件自己添加ACK或者NACK。


6

小 结

对于I2C,无论是poll方式,还是中断方式,还是DMA方式,先楫的I2C控制器对于I2C传输的每个阶段都是可控的,这为开发者的应用需求也极大提高软件灵活度。



本文介绍到此结束,

所以,看完之后,你会了吗?


“先楫半导体”(HPMicro)是一家致力于高性能嵌入式解决方案的半导体公司,总部位于上海,产品覆盖微控制器、微处理器和周边芯片,以及配套的开发工具和生态系统。公司成立于2020年6月,总部坐落于上海市张江高科技园区,并在天津、深圳和苏州均设立分公司。核心团队来自世界知名半导体公司管理团队,具有15年以上,超过20个SoC的丰富的研发及管理经验。先楫半导体以产品质量为本,所有产品均通过严格的可靠性测试。目前已经量产的高性能通用MCU产品系列HPM6700/6400、HPM6300及HPM6200,性能领先国际同类产品并通过AEC-Q100认证。公司已完成ISO9001质量管理认证和ISO 26262功能安全管理体系ASIL D认证,全力服务中国乃至全球的工业、汽车和能源市场。更多信息,请访问 http://www.hpmicro.com 。