AT32F423 I2C使用指南
前言
AT32 的I2C 总线接口用于处理微控制器和串行I2C 总线之间的通信,支持主机和从机模式,支持唤醒
深睡眠模式,最大通信速度为1Mbit/s(增强快速模式fast mode plus)。本文主要就I2C 总线接口的基本
功能进行讲解和案列解析。
支持型号列表:
支持型号 AT32F423xx
1 I2C 接口简介
I2C 接口是由数据线SDA 和时钟线SCL 构成,在标准模式下通信速度可达到100kHz,快速模式下
则可以达到400kHz,增强快速模式可达到1MHz。一帧数据传输从开始信号开始,在结束信号后停
止,在收到开始信号后总线被认为是繁忙的,当收到结束信号后,总线被认为再次空闲。I2C 接口具
有主机和从机模式、多主机功能、可编程建立和保持时间、时钟延展功能、DMA 存取数据、支持
SMBus 2.0 协议等特点。
图1. I2C1 框图
I2C1 可透过配置CRM 中PICLKS 寄存器的I2C1SEL 位,时钟来源可选择来自SYSCLK、PCLK
和HICK,并且支持从Deepsleep mode 唤醒, I2C1 有模拟滤波器,可以滤掉50ns 内的噪声。
图2. I2C2、I2C3 框图
I2C2 / I2C3 时钟来源为PCLK,不支持Deepsleep mode 唤醒并且没有模拟滤波器。
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 所提供的标准主机接收函数。用户也可根据前述主机接收流程,自行编写主机
接收函数。
更多详细内容和案例代码请参考附件:
AN0159_AT32F423_I2C_Application_Note_V2.0.0.zip
(9.2 MB)
AN0159_AT32F423_I2C_Application_Note_ZH_V2.0.0.pdf
(1.46 MB)
|