[AT32F403/403A] AT32 I2C 2.0版新库使用分享(一)

[复制链接]
770|2
手机看帖
扫描二维码
随时随地手机跟帖
骑着蜗牛狂奔O|  楼主 | 2021-11-20 11:01 | 显示全部楼层 |阅读模式
本帖最后由 骑着蜗牛狂奔O 于 2021-11-20 11:07 编辑

试用了几天AT32的新库,特此给大家分享一些库函数的使用心得,仔细看了看库文件,每一个函数都写得有注释,函数名定得也很好,基本可以看函数名就知道这个函数是干啥的,不得不说写得很规范,按着官方给的demo,很容易上手,因为我要用到I2C所以仔细的研究了一下,特此给大家分享一下库函数使用方法

void i2c_reset(i2c_type *i2c_x)
功能:
通过CRM(时钟和复位管理)复位I2C外设,可以把I2C外设所以寄存器复位成初始值,
参数:
i2c_x:参数用来选择哪个I2C,例如AT32F403A3I2C可以选择I2C1I2C2I2C3
例子:i2c_reset(I2C1)

void i2c_software_reset(i2c_type *i2c_x, confirm_state new_state)
功能:
通过I2C外设的内部软复位,复位I2C外设,实际效果和i2c_reset(i2c_type *i2c_x)一样,我们在使用的时候可以自由选择这两个函数
参数:
i2c_x已经介绍过,不在赘述
new_stateconfirm_state是一个枚举,可以到定义看到原型是typedef enum {FALSE = 0, TRUE = !FALSE} confirm_state;  所以我们在使用时,把此参数填成TRUE就行了
例子: i2c_software_reset(I2C1, TRUE)

void i2c_init(i2c_type *i2c_x, i2c_fsmode_duty_cycle_type duty, uint32_t speed)
功能:
设置I2C通信速度
参数:
i2c_x已经介绍过,不在赘述
duty该参数用于设置在快速模式下(Fast Speed Mode)的时钟线SCL高低电平宽度比值,当第三个参数speed>100000时,该参数有效,当speed<=100000时,该参数无效,此时可以填任意值,我们查看i2c_fsmode_duty_cycle_type duty枚举的定义可以知道该参数的参数范围如下:
I2C_FSMODE_DUTY_2_1:低电平宽度:低电平宽度=21
I2C_FSMODE_DUTY_16_9:低电平宽度:低电平宽度=169
speed该参数用于设置I2C通信速度,例如我想要跑10k,那么我就将这个数字设置成10000
例子: i2c_init(I2C1, I2C_FSMODE_DUTY_2_1, 10000);表示速度设置成10k,由于速度小于100000,所以参数I2C_FSMODE_DUTY_2_1并没有生效,但是比如我配置成i2c_init(I2C1, I2C_FSMODE_DUTY_2_1, 400000);那么此时参数I2C_FSMODE_DUTY_2_1就生效了

void i2c_own_address1_set(i2c_type *i2c_x, i2c_address_mode_type mode, uint16_t address)
功能:
设置自己的从机地址
参数:
i2c_x已经介绍过,不在赘述
mode用于选择地址模式,可以选择7位、10位地址模式,参数值如下
I2C_ADDRESS_MODE_7BIT:选择7位地址模式
I2C_ADDRESS_MODE_10BIT:选择10位地址模式
address本机地址,需要注意的是有些文档对于地值写法为0b0100 100x,那我们就把x看成0那应该设置的值为0b01001000,此时填的值为0x68,还有一些文档对地址写法为某个设备的7位地址为0b0100 100,那么此时我们就在末尾加0,组成一个8位的,最后的值为0b0100 1000,此时填入的值为0x68
例子:i2c_own_address1_set(I2C1, I2C_ADDRESS_MODE_7BIT, 0x68);此时表示的是I2C1的地址模式为7位地址模式,本机地址为0x68

void i2c_own_address2_set(i2c_type *i2c_x, uint8_t address)
功能:
设置自己的从机地址2,只有在双地址模式下,此地址才有用,需要注意的是该地址只支持7位地址,不支持10位地址
参数:
i2c_x已经介绍过,不在赘述
address本机地址2
例子:i2c_own_address2_set(I2C1, 0x68);此时表示的是I2C1的本机地址20x68

void i2c_own_address2_enable(i2c_type *i2c_x, confirm_state new_state)
功能:
使能双地址模式,只有在双地址模式使能了之后本机地址2才有效,需要和i2c_own_address2_set配合使用
参数:
i2c_x已经介绍过,不在赘述
new_stateTRUE表示使能双地址模式,FALSE表示关闭双地址模式
例子:i2c_own_address2_enable(I2C1, TRUE);此时表示使能I2C1的本机地址2

void i2c_smbus_enable(i2c_type *i2c_x, confirm_state new_state)
功能:
Smbus模式使能,用于选择模式,上电默认是I2C模式
参数:
i2c_x已经介绍过,不在赘述
new_stateTRUE表示选择smbus模式,FALSE表示选择I2C模式
例子:i2c_smbus_enable(I2C1, FALSE);表示选择I2C模式

void i2c_enable(i2c_type *i2c_x, confirm_state new_state)
功能:
I2C外设使能,当外设使能了之后,就可以开始传输数据了
参数:
i2c_x已经介绍过,不在赘述
new_stateTRUE表示使能I2C外设,FALSE表示关闭I2C外设
例子:i2c_enable(I2C1, TRUE);表示使能I2C外设

void i2c_fast_mode_duty_set(i2c_type *i2c_x, i2c_fsmode_duty_cycle_type duty)
功能:
设置快速模式下的SCL高低电平宽度比值,该函数功能和初始化函数void i2c_init(i2c_type *i2c_x, i2c_fsmode_duty_cycle_type duty, uint32_t speed)的功能一样,只是单独拿出来了方便大家调用
参数:
i2c_x已经介绍过,不在赘述
duty该参数用于设置在快速模式下(Fast Speed Mode)的时钟线SCL高低电平宽度比值,当第三个参数speed>100000时,该参数有效,当speed<=100000时,该参数无效,此时可以填任意值,我们查看i2c_fsmode_duty_cycle_type duty枚举的定义可以知道该参数的参数范围如下:
I2C_FSMODE_DUTY_2_1:低电平宽度:低电平宽度=21
I2C_FSMODE_DUTY_16_9:低电平宽度:低电平宽度=169

void i2c_clock_stretch_enable(i2c_type *i2c_x, confirm_state new_state)
功能:
选择时钟延展模式,该函数用于从机,对主机无效,在绝大多数使用下,建议大家开启时钟延展,因为这样可以避免从机因为处理速度太慢导致数据接收或发送不过来,导致丢失数据,从机使用此功能的前提是主机要支持时钟延展,像我们一些主机是用IO模拟的,那么一般是不支持这个特性的
参数:
i2c_x已经介绍过,不在赘述
new_stateTRUE表示使能时钟延展功能,FALSE表示禁止时钟延展功能
例子: i2c_clock_stretch_enable(I2C1, TRUE);表示使能时钟延展功能

void i2c_ack_enable(i2c_type *i2c_x, confirm_state new_state)
功能:
设置ACKNACK的响应,该函数用于主机和从机,每一次数据的ACKNACK响应,都可以通过这个函数设置,关于I2C通讯协议上的ACK响应可以去看I2C协议或者是AT32的参考手册
参数:
i2c_x已经介绍过,不在赘述
new_stateTRUE表示使能ACK,在接收到的字节末尾回复ACKFALSE表示禁止ACK,在接收到的字节末尾回复NACK
例子: i2c_ack_enable(I2C1, TRUE);表示使能ACK,那么在接收到字节后,将会回复一个ACK

未完待续......

使用特权

评论回复
vt2017| | 2021-11-22 17:27 | 显示全部楼层
写的很好,点赞!!

使用特权

评论回复
两只袜子| | 2021-12-1 08:36 | 显示全部楼层
写的很好,点赞!!

使用特权

评论回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则