当前位置:网站首页>超声波传感器(CHx01) 学习笔记 Ⅲ - I2C读写操作
超声波传感器(CHx01) 学习笔记 Ⅲ - I2C读写操作
2022-07-17 16:23:00 【nicole088】
文章目录
前言
在上一篇文章中,我提到过传感器的I2C读写包括两种方式,今天重点来介绍一下这种方式的详细步骤。
对于 CHx01 传感器来说,它和我们常用的其他 I2C 接口的 芯片有一些不同。 我们常用的 I2C 芯片都会通过各种硬件方法(比如,EEPROM 通过A0/A1/A2引脚)确定器件的从机地址。在进行一主多从的时候,只需要通过硬件收到就可以使多从机具有不同的地址。
而CHx01 传感器包含两个独立的 I2C 接口,在两个独立的从地址上运行。 第一个用于将固件加载到片上程序存储器中,第二个用于与 CH201 进行应用内通信。 7 位编程地址为 0x45,7 位应用地址默认为 0x29。 应用程序地址可以重新编程为任何有效的 7 位 I2C 地址。 也就是在功能固件(firmware interface )加载到存储的时候使用的是 Program Slave Address,每个芯片默认都是固定的 0x45。而在配置结束后,要切换成 application slave address,用户可以自定义 application slave address。每个芯片的application slave address 都是不一样的。
1、CHx01 多从机地址切换
1.1 多从机连接原理图

如上图,有3个CH-101从机设备,在上电的时候它们的 Program Slave Address 都是一样的,在不进去区分的情况下,firmware interface 是没办法写入到CH-101从机设备的。 这是时候,我们可以通过控制 RESET 和 PROG 来使能单独的传感器,分别给从机进行 firmware interface 参数的配置。在配置后重新分配 application slave address 这样在应用层测距、存在检测的时候就可以区分不同的传感器。
1.2 RESET 和 PROG 引脚使能单个传感器的步骤
Step1: 设置RESET 引脚为输出模式,并且输出高电平Step2: 设置 PROG_0、PROG_1、PROG_2 引脚为输出,并且全部输出低电平Step3: 在操作 0号传感器时,再次将 PROG_0 输出高电平,只有 0号传感器进入 Program 状态,其他传感器无效Step4: 在 Program 结束之后,再次 将 PROG_0 输出低电平Step5: 以此类推完成其他两个传感器的 firmware 参数编程
Tips:
PROG 引脚为 HIGH LEVEL ;REST 引脚为 HIGH LEVEL 时,始终做0x45 address, 此时处于Programming mode
初始化完后,会将 PROG 引脚为 LOW LEVEL; REST 引脚为 HIGH LEVEL,之后才是application slave address 有效
下面是两种地址的时序图:
Programming slave address :
application slave address:

2、传感器 I2C 读/写操作
2.1. 对固定寄存器的读/写
针对固定寄存器的读/写操作包括了从机地址、寄存器地址、连续读/写的寄存器长度、数据缓冲buf
// 读
unsigned long i2c_master_read_register1(unsigned char Address, unsigned char RegisterAddr, unsigned short RegisterLen, unsigned char *RegisterValue)
{
if(bxd_iic_read_1(BX_IIC0, Address, RegisterAddr, (u8 *)(uint32_t)RegisterValue, (uint32_t)RegisterLen,1000) == IIC_SUCCESS){
return IIC_SUCCESS;
}
return IIC_BUSY;
}
//写
unsigned long i2c_master_write_register1(unsigned char Address, unsigned char RegisterAddr, unsigned short RegisterLen, unsigned char *RegisterValue)
{
return bxd_iic_write_1(BX_IIC0, Address, RegisterAddr, (u8 *)(uint32_t)RegisterValue, (uint32_t)RegisterLen);
}
2.2 对原始数据的读写
针对原始数据的读/写操作包括了从机地址、连续读/写Memory的长度、数据缓冲buf
// 读
unsigned long i2c_master_read_register1_raw(unsigned char Address, unsigned short len, unsigned char *data)
{
if(bxd_iic_read_1_raw(BX_IIC0, Address, (u8 *)(uint32_t)data, (uint32_t)len,100) == IIC_SUCCESS){
return IIC_SUCCESS;
}
return IIC_BUSY;
}
// 写
unsigned long i2c_master_write_register1_raw(unsigned char Address, unsigned short len, unsigned char *data)
{
return bxd_iic_write_1_raw(BX_IIC0, Address, (u8 *)(uint32_t)data, (uint32_t)len);
}
NOTE:
简单的概括一下:
1) 在传感器在编程(对firmware interface 参数配置)时,使用对原始数据的读/写。在官方源码中通过 int chdrv_prog_i2c_read(ch_dev_t *dev_ptr, uint8_t *message, uint16_t len) 和 int chdrv_prog_i2c_write(ch_dev_t *dev_ptr, uint8_t *message, uint16_t len) 函数操作。
2)在传感器在应用(读写固定寄存器参数)时,使用 对固定寄存器的读/写在官方源码中通过 int chdrv_read_byte(ch_dev_t *dev_ptr, uint16_t mem_addr, uint8_t *data) 和 int chdrv_write_byte(ch_dev_t *dev_ptr, uint16_t mem_addr, uint8_t data_value) / int chdrv_write_word(ch_dev_t *dev_ptr, uint16_t mem_addr, uint16_t data_value)
3. I2C数据帧结构
CHx01 使用时钟延长来留出足够的时间来响应 I2C 主机。 CH201 时钟在发送和接收的确认 (ACK) 位之前延长。
例如,当 CH201 发送时,它会在发送当前字节的第 8 位后将 SCL 保持为低电平,同时将下一个字节加载到其内部发送缓冲区中。 当下一个字节准备好时,它释放 SCL 线,读取主机的 ACK 位,并相应地继续。 当 CH201 正在接收时,它在接收到一个字节中的第 8 位后将 SCL 线保持为低电平。 CH201 然后根据接收到的数据选择是ACK 还是NACK 并释放SCL 线。
数据手册给出了从机接口帧结构图,这个图展示了从机读写时个字段的结构,可以结合我下面给出的实际读取操作的时序图来理解。
读数据
第一步,发送一个起始信号
第二步,发送7bit从机地址,此处发送了7bit地址+1bit读写选择位,即发送7bit+r/w。最低位为1表示读,为0表示写。
产生一个ACK应答信号,此应答信号为从机器件产生的应答。
第三步,发送寄存器地址。产生一个ACK应答信号,此应答信号为从机器件产生的应答。
第四步,再次发送一个起始信号。
第五步,发送7bit从机地址,此处发送了7bit地址+1bit读写选择位,即发送7bit+r/w。最低位为1表示读,为0表示写。
产生一个ACK应答信号,此应答信号为从机器件产生的应答。
第六步,读取多字节数据。
每个字节后产生一个ACK应答信号,此应答信号为CPU产生。 最后一个字节产生一个NACK信号。此无应答信号由CPU 产生。
第七步,产生一个停止信号。
写数据
第一步,发送一个起始信号
第二步,发送7bit从机地址,此处发送了7bit地址+1bit读写选择位,即发送7bit+r/w。最低位为1表示读,为0表示写。
第三步,发送寄存器地址。产生一个ACK应答信号,此应答信号为从机器件产生的应答。
第四步,发送8bit数据,每个数据后产生一个ACK应答信号,此应答信号为从机器件产生的应答。
第五步,产生一个停止信号。
Programming 读数据
Programming 写数据
对 Programming 读/写操作就是不需要 RegisterAddr 参数就可以,因此在调试的时候,先调试完成对寄存器参数的读写操作函数。
边栏推荐
- Leetcode 150. Evaluation of inverse Polish expression
- C语言绘图示例-繁花图案
- 2022安全员-C证上岗证题目及答案
- getchar()
- mysql学习笔记-约束
- mysql中对于数据库的基本操作
- Nature | the carbon sequestration rate of groundwater is similar to that of oligotrophic marine system
- 谷歌开发者社区分享——Flutter动画的分享已发布
- 【Flutter】dart:一些不容忽视的特性
- C# . Net Yunnan rural credit national secret signature (SM2) brief analysis
猜你喜欢

Mysql-1366 - Incorrect string value: ‘\xE5\xBC\xA0\xE4\xB8\x89‘ for column ‘userName‘ at row 1

mysql中对于数据库的基本操作

HCIP (7)

Es install IK word breaker

C语言绘图示例-分色调图20例

MySQL learning notes - paging - table creation - data type

Will webgpu become the killer of webgl?

C language drawing example - flower pattern

Opencv based on DLCO descriptor matching

人大、微软等提出InclusiveFL:异构设备上的包容性联邦学习
随机推荐
2022年低压电工考试题及在线模拟考试
深度学习参数初始化(二)Kaiming初始化 含代码
Nature | the carbon sequestration rate of groundwater is similar to that of oligotrophic marine system
李宏毅《机器学习》|1. Introduction of this course(机器学习介绍)
Mysql-1366 - Incorrect string value: ‘\xE5\xBC\xA0\xE4\xB8\x89‘ for column ‘userName‘ at row 1
Matlab (4) functions and files
PPPoE拨号上网
HarmonyoS快速入门:Hello world
第一天实验
MIHA tour 2023 autumn recruitment officially begins ~ early approval has the opportunity to avoid written examination!
C语言绘画示例-进度条
数据库每日一题---第25天:银行账户概要 II
C # from introduction to mastery Part II: C # basic grammar
NPC, Microsoft, etc. proposed inclusivefl: inclusive federal learning on heterogeneous devices
Leetcode 20. 有效的括号
Example of C language drawing - 20 examples of chromatic diagram
Microcomputer principle and technical interface experiment five basic IO operation temperature control experiment
RMAN abnormal machine recovery error rman-06026 rman-06023
Talk about the redis cache penetration scenario and the corresponding solutions
GET 请求和 POST 请求的区别和使用