当前位置:网站首页>超声波传感器(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 :Programming slave address

    application 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 参数就可以,因此在调试的时候,先调试完成对寄存器参数的读写操作函数。


原网站

版权声明
本文为[nicole088]所创,转载请带上原文链接,感谢
https://blog.csdn.net/nicole088/article/details/125816044