打印
[AT32F402]

AN0178 AT32F402_405 I2C使用指南

[复制链接]
1405|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ArterySW|  楼主 | 2023-10-30 13:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 ArterySW 于 2023-10-30 13:43 编辑

AT32F402_405 I2C使用指南

前言
AT32 的I2C 总线接口用于处理微控制器和串行I2C 总线之间的通信,支持主机和从机模式,支持唤醒深睡眠模式,最大通信速度为1Mbit/s(增强快速模式fast mode plus)。本文主要就I2C 总线接口的基本功能进行讲解和案列解析。
支持型号列表:
AT32F402xx
AT32F405xx

1 I2C 接口简介
I2C 接口是由数据线SDA 和时钟线SCL 构成,在标准模式下通信速度可达到100kHz,快速模式下则可以达到400kHz,增强快速模式可达到1MHz。一帧数据传输从开始信号开始,在结束信号后停止,在收到开始信号后总线被认为是繁忙的,当收到结束信号后,总线被认为再次空闲。I2C 接口具有主机和从机模式、多主机功能、可编程建立和保持时间、时钟延展功能、DMA 存取数据、支持SMBus 2.0 协议等特点。
图1. I2C 框图



2 I2C 接口通信

2.1 主机通信流程
2.1.1 主机通信初始化
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

2.1.2 主机通信初始化软件接口
主机通信初始化所用到的软件接口通过独立的函数接口实现,如下:
void i2c_init(i2c_type *i2c_x, uint8_t dfilters, uint32_t clk); /* 主机时钟初始化 */
void i2c_transmit_set(i2c_type *i2c_x, uint16_t address, uint8_t cnt, i2c_reload_stop_mode_type rld_stop,
i2c_start_stop_mode_type start_stop); /* 主机通信初始化 */
void i2c_addr10_mode_enable(i2c_type *i2c_x, confirm_state new_state); /* 10 位地址使能 */
void i2c_addr10_header_enable(i2c_type *i2c_x, confirm_state new_state); /* 10 位地址头读取时序使能 */

i2c_init 函数三个参数分别为:所使用的I2C、数字滤波值和主机时钟配置值。
i2c_transmit_set 函数用于初始化通信参数,包括:所使用的I2C、从机地址、传输字节数、停止条
件产生模式和起始条件产生模式。
i2c_addr10_mode_enable 函数用于使能10 位地址模式。
i2c_addr10_header_enable 函数用于使能10 位地址头读取时序,即主机发送完整的10 位从机地址
读序列或主机只发送10 位地址的前7 位。


2.1.3 主机发送流程
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 主机发送时序图

2.1.4 主机发送流程软件接口
主机发送通过独立的函数接口实现,如下:
i2c_status_type i2c_master_transmit(i2c_handle_type* hi2c, uint16_t address, uint8_t* pdata, uint16_t size,
uint32_t timeout);

i2c_master_transmit 函数为i2c_application.c 文件所提供的应用层接口函数,参数包括:I2C 结构体
指针、从机地址、发送数据指针、发送数据字节数和函数超时时间。
注:此函数为Artery 所提供的标准主机发送函数。用户也可根据前述主机发送流程,自行编写主机
发送函数。


2.1.5 主机接收流程
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 主机接收时序图

2.1.6 主机接收流程软件接口
主机接收通过独立的函数接口实现,如下:
i2c_status_type i2c_master_receive(i2c_handle_type* hi2c, uint16_t address, uint8_t* pdata, uint16_t size,
uint32_t timeout);

i2c_master_receive 函数为i2c_application.c 文件所提供的应用层接口函数,参数包括:I2C 结构体
指针、从机地址、接收数据指针、接收数据字节数和函数超时时间。
注:此函数为Artery 所提供的标准主机接收函数。用户也可根据前述主机接收流程,自行编写主机
接收函数。

更多详细内容和案例代码请参考附件:

AN0178_AT32F402_405_I2C_Application_Note_ZH_V2.0.0.pdf

1.72 MB

AN0178_AT32F402_405_I2C_Application_Note_ZH_V2.0.0.zip

9.6 MB

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

179

主题

276

帖子

11

粉丝