i2c接口简介
i2c接口是由数据线sda和时钟线scl构成,在标准模式下通信速度可达到100khz,快速模式下则可以达到400khz,增强快速模式可达到1mhz。一帧数据传输从开始信号开始,在结束信号后停止,在收到开始信号后总线被认为是繁忙的,当收到结束信号后,总线被认为再次空闲。i2c接口具有主机和从机模式、多主机功能、可编程建立和保持时间、时钟延展功能、dma存取数据、支持smbus 2.0协议等特点。
图1. i2c框图
i2c接口通信
主机通信流程
主机通信初始化
1. 主机时钟初始化 在启动外设(i2cen)之前,必须先设置i2cx_clkctrl寄存器的各个位用以配置i2c主时钟。 ― div[7:0]:i2c时钟分频 ― sdad[3:0]:数据保持时间(thd;dat) ― scld[3:0]:数据建立时间(tsu;dat) ― sclh[7:0]:scl高电平时间 ― scll[7:0]:scl低电平时间 该寄存器的配置可以使用artery_i2c_timing_configuration时钟配置工具计算,见第三章节。 低电平控制:当检测到scl总线为低电平时,内部scll计数器开始计数,当计数值达到scll值时,释放scl线,scl线变为高电平。 高电平控制:当检测到scl总线为高电平时,内部sclh计数器开始计数,当计数值达到sclh值时,拉低scl线,scl线变为低电平,当在高电平期间,如果被外部总线拉低,那么内部sclh计数器停止计数,并开始低电平计数,这为时钟同步提供了条件。
图2. 主机时钟的产生
2. 主机通信初始化
在启动通讯前须先设定i2c_ctrl2寄存器中的几项参数: 1) 设置传输字节数 ― ≤255字节
配置i2c_ctrl2的rlden=0,关闭重载模式
配置i2c_ctrl2的cnt[7:0]=n
― >255字节
配置i2c_ctrl2的rlden=1,使能重载模式
配置i2c_ctrl2的cnt[7:0]=255
剩余传输字节数n=n-255
2) 设置传输结束模式 ― astopen=0:软件结束模式,当数据传输完成后,i2c_sts的tdc标志置1,软件设置genstop=1或者genstart=1,发送stop条件或者start条件。 ― astopen=1:自动结束模式,当数据传输完成后,自动发送stop条件。 3) 设置从机地址 ― 设置寻址的从机地址值(i2c_ctrl2的saddr) ― 设置从机地址模式(i2c_ctrl2的addr10)
addr10=0:7位地址模式
addr10=1:10位地址模式
4) 设置传输方向(i2c_ctrl2的dir) ― dir=0:主机接收数据 ― dir=1:主机发送数据 5) 开始传输 设置i2c_ctrl2的genstart=1,主机开始在总线上发送start条件和从机地址。
3. 主机10 bits寻址的特殊时序初始化
在10位地址传输模式下,i2c_ctrl2的readh10用于产生特殊时序,当readh10=1时,支持如下传输序:主机先发送数据给从机,然后再从从机读取数据,传输时序图如下图所示:
图3. 10位地址的读访问readh10=1
主机在软件结束模式(astopen=0)下,发送数据到从机,当数据发送完成后设置readh10=1,然后再从从机接收数据。
图4. 10位地址的读访问readh10=0
主机通信初始化软件接口
主机通信初始化所用到的软件接口通过独立的函数接口实现,如下:
i2c_init函数三个参数分别为:所使用的i2c、数字滤波值和主机时钟配置值。 i2c_transmit_set函数用于初始化通信参数,包括:所使用的i2c、从机地址、传输字节数、停止条件产生模式和起始条件产生模式。 i2c_addr10_mode_enable函数用于使能10位地址模式。 i2c_addr10_header_enable函数用于使能10位地址头读取时序,即主机发送完整的10位从机地址读序列或主机只发送10位地址的前7位。
主机发送流程
1) i2c_txdt数据寄存器为空,i2c_sts的tdis=1; 2) 向txdt数据寄存器写入数据,数据开始发送; 3) 重复1、2步骤直到发送cnt[7:0]个数据; 4) 如果此时i2c_sts的tcrld=1(重载模式),分为以下两种情况: ― 剩余字节数n>255:向cnt写入255,n=n-255,tcrld被自动清0,传输继续; ― 剩余字节数n≤255:关闭重载模式(rlden=0),向cnt写入n,tcrld被自动清0,传输继续。 5) 结束时序 ― 停止条件产生:
软件结束模式(astopen=0):此时i2c_sts的tdc置1,设置genstop=1产生stop条件;
自动结束模式(astopen=1):自动产生stop条件。
― 等待产生stop条件,当stop条件产生时,i2c_sts的stopf置1,将i2c_clr的stopc写1,清除stopf标志,传输结束。
图5. i2c主机发送流程图
图6. i2c主机发送时序图
主机发送流程软件接口
主机发送通过独立的函数接口实现,如下:
i2c_master_transmit函数为i2c_application.c文件所提供的应用层接口函数,参数包括:i2c结构体指针、从机地址、发送数据指针、发送数据字节数和函数超时时间。 注:此函数为artery所提供的标准主机发送函数。用户也可根据前述主机发送流程,自行编写主机发送函数。
主机接收流程
1) 当收到数据后,rdbf=1,读取rxdt数据寄存器,rdbf被自动清零; 2) 重复步骤2直到接收cnt[7:0]个数据; 3) 如果此时i2c_sts的tcrld=1(重载模式),分为以下两种情况: ― 剩余字节数n>255:向cnt写入255,n=n-255,tcrld被自动清0,传输继续; ― 剩余字节数n≤255:关闭重载模式(rlden=0),向cnt写入n,tcrld被自动清0,传输继续。 4) 当在接收到最后一个字节时,主机会自动发送一个nack。 5) 结束时序 ― 停止条件产生:
软件结束模式(astopen=0):此时i2c_sts的tdc置1,设置genstop=1产生stop条件;
自动结束模式(astopen=1):自动产生stop条件。
― 等待产生stop条件,当stop条件产生时,i2c_sts的stopf置1,将i2c_clr的stopc写1,清除stopf标志,传输结束。
图7. i2c主机接收流程图
图8. i2c主机接收时序图
主机接收流程软件接口
主机接收通过独立的函数接口实现,如下:
i2c_master_receive函数为i2c_application.c文件所提供的应用层接口函数,参数包括:i2c结构体指针、从机地址、接收数据指针、接收数据字节数和函数超时时间。 注:此函数为artery所提供的标准主机接收函数。用户也可根据前述主机接收流程,自行编写主机接收函数。
从机通信流程
从机通信初始化
1. 从机地址配置 每个i2c从设备可同时支持2个从设备地址,由oaddr1和oaddr2指定 i2c_oaddr1 — 通过addr1en使能 — 通过addr1mode配置为7位(默认)或10位地址 i2c_oaddr2 — 通过addr2en使能 — 固定7位地址模式 — 可通过addr2mask[2:0]来在进行地址匹配比较时屏蔽掉0~7个lsb地址位
addr2mask=0表示7位地址中的每一位都要参与匹配比较
addr2mask=7表示任何非保留地址的7位地址都会被该从设备应答
2. 从机地址匹配
当i2c启用的地址选中匹配时,addrf中断状态标志会被置1,如果addrien位为1,就会产生一个中断。如果两个从地址都使能,在地址匹配产生addr中断时,可以查看状态寄存器中的addr[6:0]来得知是oaddr1还是oaddr2被寻址了。
3. 从机字节控制模式(通常smbus模式下才使用)
从设备可以对每个收到的字节进行应答控制。 所需配置:sctrl=1&rlden=1&stretch=0&cnt≥1 从机字节控制流程: 1) 每收到一个字节tcrld置位,时钟延展于第8和第9个脉冲之间 2) 软件读取rxdt中的值,并决定是否置位ack 3) 软件重装载cnt=1来停止时钟延展 4) 应答或非应答信号在第9个脉冲时刻出现在总线上 注意: 置位sctrl时,必须开启时钟延展,即stretch=0 cnt可以是大于1的值,来实现多个字节以自动ack接收完毕后再启动应答控制,从设备发送时推荐关闭sctrl,此时无需字节应答控制。
从机通信初始化软件接口
从机通信初始化所用到的软件接口通过独立的函数接口实现,如下:
i2c_own_address1_set函数用于配置oaddr1地址模式以及addr1地址值。 i2c_own_address2_set函数用于配置addr2地址值以及addr2屏蔽位。 i2c_own_address2_enable函数用于使能addr2地址。 i2c_slave_data_ctrl_enable函数用于使能从机字节控制模式。 i2c_clock_stretch_enable函数用于使能从机时钟延展功能。 i2c_reload_enable函数用于使能发送数据重载模式。
从机发送流程
1) 响应主机地址,匹配时回复ack; 2) txdt为空时,置位tdis,从设备写入发送数据; 3) 每发送一个字节会收到ack,且置位tdis; 4) 如果收到nack位:
— 置位nackf,产生中断;
— 从设备自动释放scl和sda(以便主设备发送stop或restart);
5) 如果收到stop位:
— 置位stopf,产生中断;
当从机发送开启时钟延展(stretch=0)时,在等待addrf标志时和发送前一个数据的第9个时钟脉冲后,会把txdt中的数据拷贝到移位寄存器中,如果此时tdis还是置位,表示txdt没有写进待发送数据,将发生时钟延展,如下流程图:
图9. i2c从机发送流程图
需要注意的是,在时钟延展关闭(stretch=1)的情况下,如果在将要传输数据的第一个bit位开始发送之前,也就是sda边沿产生之前,如果数据还未写入txdt数据寄存器,那么会发生欠载错误,此时i2c_sts的ouf将会置1,并将0xff发送到总线。 为了能及时的写入数据,可以在通信开始前,先将数据写入到dt寄存器:软件先将tdbe置1,目的是为了清空txdt寄存器的数据,然后将第一个数据写入txdt寄存器,此时tdbe清零。
图10. i2c从机发送时序图
从机发送流程软件接口
从机发送通过独立的函数接口实现,如下:
指针、发送数据指针、发送数据字节数和函数超时时间。 注:此函数为artery所提供的标准从机发送函数。用户也可根据前述从机发送流程,自行编写从机发送函数。
从机接收流程
1) 当收到数据后,rdbf=1,读取rxdt数据寄存器,rdbf被自动清零; 2) 重复步骤2直到所有数据接收完成; 3) 等待收到stop条件,当收到stop条件时,i2c_sts的stopf置1,将i2c_clr 的stopc写1,清除stopf标志,传输结束。
图11. i2c从机接收流程图
图12. i2c从机接收时序图
从机接收流程软件接口
从机接收通过独立的函数接口实现,如下:
i2c_slave_receive函数为i2c_application.c文件所提供的应用层接口函数,参数包括:i2c结构体指针、接收数据指针、接收数据字节数和函数超时时间。 注:此函数为artery所提供的标准从机接收函数。用户也可根据前述从机接收流程,自行编写从机接收函数。
i2c配置工具
功能简介
i2c配置工具artery_i2c_timing_configuration.exe可以实现对主机和从机的时钟、数字滤波、模拟滤波配置。
资源准备
1) 软件环境artery_i2c_timing_configuration.exe 图13. artery i2c timing configuration
使用步骤
1) 选择芯片型号 选择当前使用的芯片型号,例如可以选择at32f435、at32f437。 2) 选择设备模式
master:主模式,i2c作为主机;
slave:从模式,i2c作为从机。
3) 选择i2c速度模式
standard-mode:标准模式,范围0~100khz;
fast-mode:快速模式,范围0~400khz;
fast-mode plus:增强快速模式,范围0~1000khz。
4) 设置i2c速度(单位khz) 根据实际需求设置i2c通信速度,例如需要通信速度为10khz,那么这里设置为10。 5) 设置i2c时钟源频率(单位khz) 根据实际使用的i2c时钟源频率来配置,例如at32435 i2c时钟源为pclk1,当at32435主频为288mhz,apb1为144mhz时,这里设置为144000。 6) 模拟滤波使能
on:打开;
off:关闭。
模拟滤波使能后,将过滤50ns以下的脉冲。 7) 数字滤波(范围0~15) 数字滤波时间=数字滤波值x ti2c_clk; 其中ti2c_clk=1/i2c时钟源频率。 当值为0时,数字滤波关闭,当值>0时将过滤小于数字滤波时间的脉冲。 8) 上升时间(tr单位ns) scl和sda总线的上升沿,如图18所示。i2c协议中规定了在标准模式(standard-mode)、快速模式(fast-mode)、增强快速模式(fast-mode plus)下的范围,详情请参照表1。上升时间和上拉电阻的阻值关系很大,上拉电阻越小,上升时间越短,可以支持的通信速度就越快,但是功耗也越高。 表2中给出了一些常用上拉电阻阻值所对应的上升沿时间,实际可能会因为总线挂的设备数量、布线等差异而有所不同,仅供参考。 9) 下降时间(tf单位ns) scl和sda总线的下降沿,如图18所示。i2c协议中规定了在标准模式(standard-mode)、快速模式(fast-mode)、增强快速模式(fast-mode plus)下的范围,详情请参照表1。 图14. 上升沿(tr)下降沿(tf)规范 表1. i2c时间规范 表2. 常用上拉电阻阻值的tr、tf参考值(vdd=3.3v) 注:该值是总线上连接两片at32 mcu,一个作为主机,一个作为从机测试出来的值,实际可能会因为总线挂的设备数量、布线等差异而有所不同。 10) 产生代码 点击产生代码,上诉配置的值,将会以代码的形式产生出来,如下图红框所示,只需要将右侧输出的代码替换到自己的程序即可。 图15. 代码产生
案例 读写eeprom
功能简介
使用硬件i2c接口对eeprom存储设备进行读写访问。
资源准备
1) 硬件环境 对应产品型号的at-start board 4.7k上拉电阻 eeprom存储设备 2) 软件环境 projectat_start_f4xxexamplesi2ceeprom
软件设计
1) 配置流程
开启i2c外设时钟
配置i2c所复用的gpio
配置i2c所用的dma通道
使能i2c外设接口
写入eeprom并读取写入的数据
比较读写数据内容是否正确
2)代码介绍
main函数代码描述
实验效果
如若读写数据完全相同,则led3会被点亮。
案例 轮询方式通信
功能简介
通过轮询方式让两块at-start board的i2c接口进行通信,测试作为主机或从机发送和接收数据。
资源准备
1) 硬件环境 对应产品型号的at-start board两块 4.7k上拉电阻 2) 软件环境 projectat_start_f4xxexamplesi2ccommunication_poll
软件设计
1) 配置流程
开启i2c外设时钟
配置i2c所复用的gpio
使能i2c外设接口
从机准备接收数据
主机发送数据
从机准备发送数据
主机接收数据
主机从机对比发送和接收到的数据是否正确
2) 代码介绍
main函数代码描述
实验效果
通过宏定义:#define master_board来选择两块板子的主从关系;
如若主机或从机的读写数据完全相同,则led3会被点亮,否则led2会不停闪烁。
案例 中断方式通信
功能简介
通过中断方式让两块at-start board的i2c接口进行通信,测试作为主机或从机发送和接收数据。
资源准备
3) 硬件环境对应产品型号的at-start board两块 4.7k上拉电阻 4) 软件环境 projectat_start_f4xxexamplesi2ccommunication_int
软件设计
3) 配置流程
开启i2c外设时钟
配置i2c所复用的gpio
使能i2c外设接口
使能i2c中断
从机准备接收数据
主机发送数据
从机准备发送数据
主机接收数据
主机从机对比发送和接收到的数据是否正确
4) 代码介绍
main函数代码描述
主机中断处理函数代码描述
从机中断处理函数代码描述
实验效果
通过宏定义:#define master_board来选择两块板子的主从关系;
如若主机或从机的读写数据完全相同,则led3会被点亮,否则led2会不停闪烁。
案例 dma方式通信
功能简介
通过dma方式让两块at-start board的i2c接口进行通信,测试作为主机或从机发送和接收数据。
资源准备
5) 硬件环境 对应产品型号的at-start board两块 4.7k上拉电阻 6) 软件环境 projectat_start_f4xxexamplesi2ccommunication_dma
软件设计
5) 配置流程
开启i2c外设时钟
配置i2c所复用的gpio
配置i2c所使用的dma通道
使能i2c外设接口
从机准备接收数据
主机发送数据
从机准备发送数据
主机接收数据
主机从机对比发送和接收到的数据是否正确
6) 代码介绍
main函数代码描述
主机dma发送接收完成中断处理函数代码描述
实验效果
通过宏定义:#define master_board来选择两块板子的主从关系;
如若主机或从机的读写数据完全相同,则led3会被点亮,否则led2会不停闪烁。
虹科案例 | 依维柯Eurocargo 起动间歇性失控
利用多个独立LED实现嵌入式渐进调光功能
SRAM的工作原理图解
Twitter面面观
AIGC加速推动数据中心液冷市场的爆发
AT32F435/437 I2C使用指南
OLED为什么奔向护眼主流?原来如此
【CES 2016】Panasonic发布最新4K系列产品:freeze
电池企业集中发力LFP
苹果新专利:耳机据密封效果自动调节音量
EC推出加速部署人工智能的计划
爱丁堡大学教授呼吁英国应立刻停止部署5G网络
PCB厂如何应对中美贸易冲突
基于ESP32构建一个具有3.5英寸大显示屏的互联网广播设备
一加6T国内发布 屏下指纹配全新电光紫配色 售价3399元起
电子故障排除指南
高压断路器的类型
芯耀辉如何看待Chiplet国内发展情况
电动车充换电模式之争渐明 换电让位充电
气动薄膜调节阀是一种新型闸阀,它有什么特点