当前位置:网站首页>超声波传感器(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 参数就可以,因此在调试的时候,先调试完成对寄存器参数的读写操作函数。
边栏推荐
- Example of C language drawing - 20 examples of chromatic diagram
- 2022年低压电工考试题及在线模拟考试
- C# . Net Yunnan rural credit national secret signature (SM2) brief analysis
- 说说 Redis 缓存穿透场景与相应的解决方法
- Scrapy关键词 爬虫的简单实现(以新华网和人民网为例)
- String correlation function (II)
- C language drawing example - flower pattern
- WAV和PCM的关系和区别
- Create a custom palette in swiftui color tutorial
- 第一天实验
猜你喜欢

MyCat2搭建mysql主从分离

OpenCV基于DLCO描述子匹配

SwiftUI 颜色教程大全之中创建自定义调色板

Create a custom palette in swiftui color tutorial

S32K148_CAN驱动(裸机开发)

C language drawing example - trademark logo

MySQL learning notes - paging - table creation - data type

Gradient button function button drawing C language example

Arbitrum Nova 发布!打造低成本高速度的游戏社交领域专用链

HCIP(8)
随机推荐
Understanding of rapid exploring random trees (RRT) path planning method
Es install IK word breaker
HCIP(5)
hcip第四天笔记
3. Golang string type
HCIP(6)
MIHA tour 2023 autumn recruitment officially begins ~ early approval has the opportunity to avoid written examination!
深度学习参数初始化(二)Kaiming初始化 含代码
HCIP(8)
getchar()
01 knapsack interview questions series (I)
C语言绘画示例-进度条
Mysql学习笔记-分页-表的创建-数据类型
Machine learning Assignment 1
mysql学习笔记-约束
MySQL learning notes - constraints
Research and implementation of 5g network Slicing Based on AI intelligent correlation technology
Nature子刊 | 地下水固碳速率与寡营养海洋系统固碳速率相近
Create a custom palette in swiftui color tutorial
Energy saving resource allocation strategy based on time-varying graph in satellite networks