I2C接口简介
I2C接口是由数据线SDA和时钟线SCL构成,在标准模式下通信速度可达到100kHz,快速模式下则可以达到400kHz,增强快速模式可达到1MHz。一帧数据传输从开始信号开始,在结束信号后停止,在收到开始信号后总线被认为是繁忙的,当收到结束信号后,总线被认为再次空闲。I2C接口具有主机和从机模式、多主机功能、可编程建立和保持时间、时钟延展功能、DMA存取数据、支持SMBus 2.0协议等特点。
图1. I2C框图
I2C接口通信
主机通信流程
主机通信初始化1. 主机时钟初始化在启动外设(I2CEN)之前,必须先设置I2Cx_CLKCTRL寄存器的各个位用以配置I2C主时钟。
该寄存器的配置可以使用Artery_I2C_Timing_Configuration时钟配置工具计算,见第三章节。低电平控制:当检测到SCL总线为低电平时,内部SCLL计数器开始计数,当计数值达到SCLL值时,释放SCL线,SCL线变为高电平。高电平控制:当检测到SCL总线为高电平时,内部SCLH计数器开始计数,当计数值达到SCLH值时,拉低SCL线,SCL线变为低电平,当在高电平期间,如果被外部总线拉低,那么内部SCLH计数器停止计数,并开始低电平计数,这为时钟同步提供了条件。图2. 主机时钟的产生
2. 主机通信初始化在启动通讯前须先设定I2C_CTRL2寄存器中的几项参数:
1) 设置传输字节数
2) 设置传输结束模式
3) 设置从机地址
4) 设置传输方向(I2C_CTRL2的DIR)
5) 开始传输设置I2C_CTRL2的GENSTART=1,主机开始在总线上发送START条件和从机地址。3. 主机10bits寻址的特殊时序初始化在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(重载模式),分为以下两种情况:
5) 结束时序
图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(重载模式),分为以下两种情况:
4) 当在接收到最后一个字节时,主机会自动发送一个NACK。
5) 结束时序
图7. I2C主机接收流程图
图 8. I2C主机接收时序图
主机接收流程软件接口
主机接收通过独立的函数接口实现,如下:
i2c_master_receive函数为i2c_application.c文件所提供的应用层接口函数,参数包括:I2C结构体指针、从机地址、接收数据指针、接收数据字节数和函数超时时间。注:此函数为Artery所提供的标准主机接收函数。用户也可根据前述主机接收流程,自行编写主机接收函数。
从机通信流程
从机通信初始化1. 从机地址配置每个I2C从设备可同时支持2个从设备地址,由OADDR1和OADDR2指定I2C_OADDR1
I2C_OADDR2
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中的值,并决定是否置位ACK3) 软件重装载CNT=1来停止时钟延展4) 应答或非应答信号在第9个脉冲时刻出现在总线上注意:置位SCTRL时,必须开启时钟延展,即STRETCH=0CNT可以是大于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位:
5) 如果收到STOP位:
当从机发送开启时钟延展(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) 选择芯片型号选择当前使用的芯片型号,例如可以选择AT32F405。2) 选择设备模式
3) 选择I2C速度模式
4) 设置I2C速度(单位 kHz)根据实际需求设置I2C通信速度,例如需要通信速度为10kHz,那么这里设置为10。5) 设置I2C时钟源频率(单位kHz)根据实际使用的I2C时钟源频率来配置,例如AT32F405 I2C时钟源为PCLK1,当AT32F405主频为216MHz,APB1为108MHz时,这里设置为108000。6) 数字滤波(范围0~15)数字滤波时间=数字滤波值x TI2C_CLK;其中TI2C_CLK=1/I2C时钟源频率。当值为0时,数字滤波关闭,当值>0时将过滤小于数字滤波时间的脉冲。7) 上升时间(tr单位ns)SCL和SDA总线的上升沿,如图18所示。I2C协议中规定了在标准模式(Standard-mode)、快速模式(Fast-mode)、增强快速模式(Fast-mode Plus)下的范围,详情请参照表1。上升时间和上拉电阻的阻值关系很大,上拉电阻越小,上升时间越短,可以支持的通信速度就越快,但是功耗也越高。表2中给出了一些常用上拉电阻阻值所对应的上升沿时间,实际可能会因为总线挂的设备数量、布线等差异而有所不同,仅供参考。8) 下降时间(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,一个作为主机,一个作为从机测试出来的值,实际可能会因为总线挂的设备数量、布线等差异而有所不同。9) 产生代码点击产生代码,上诉配置的值,将会以代码的形式产生出来,如下图红框所示,只需要将右侧输出的代码替换到自己的程序即可。图15. 代码产生
全部0条评论
快来发表一下你的评论吧 !