在上一篇文章 详解 i2c的末尾,有这样一张波形图:
实例2
这个对应的就是常见的从设备寄存器读数据的波形,只是在写数据时多了一个字节。
通用的从 i2c 设备读寄存器数据的模式应该是这样的:
从从设备寄存器读数据示例
在mpu6050 数据表 中的9.3 i2c communications protocol章节说明了 mpu6050 的 i2c 接口协议,符合通用模式。
mpu6050 单字节写和加速写序列如下:
mpu6050单字节写和加速写
mpu6050 单字节读和加速读序列如下:
mpu6050单字节读和加速读
上面的加速写和加速读都是以 2 个数据字节为例的。
从实例 2 的波形图可以看出,启动传输后,写了0x12``0x13``0x143 个字节,这 3 个字节后都是nack,然后是重复起始信号,跟着刚才地址字节0x12+1即0x13,i2c 从写转换到读,然后开始读数据字节。
对应代码为:
result = ch347_driver.i2c_set(device_index, 1)if result: print(success to set i2c speed.)else: print(failed to set i2c speed.)result = ch347_driver.i2c_set_delay_ms(device_index, 1)if result: print(success to set i2c delay.)else: print(failed to set i2c delay.)result = ch347_driver.stream_i2c(device_index, b'x12x13x14', 8)if result: print(success!)else: print(failed!)将上面这段代码稍加修改:
result = ch347_driver.i2c_set(device_index, 1)if result: print(success to set i2c speed.)else: print(failed to set i2c speed.)result = ch347_driver.i2c_set_delay_ms(device_index, 1)if result: print(success to set i2c delay.)else: print(failed to set i2c delay.)result = ch347_driver.stream_i2c(device_index, b'xd0x75', 1)if result: print(success! result:, result.hex())else: print(failed!)mpu6050 模块的地址是0b1101000(ad0 = 0),左移 1 位得到设备写地址0xd0,读数据时的读地址 ch347 会自动产生,波形如下:
读寄存器0x75
还没有连接 mpu6050 模块,所以没有数据返回。现在把 mpu6050 模块 i2c 接口连接到 ch347 模块上,运行程序,结果为:
❯ python test.pysuccessfully opened device index: 0device information:iindex: 0devicepath: ?usb#vid_1a86&pid_55db&mi_02#7&2887b016&0&0002#{5446f048-98b4-4ef0-96e8-27994bac0d00}usbclass: 0functype: 1deviceid: usbvid_1a86&pid_55db&mi_02#7&2887b016&0&0002#chipmode: 1devhandle: 912bulkoutendpmaxsize: 512bulkinendpmaxsize: 512usbspeedtype: 1ch347ifnum: 0dataupendp: 6datadnendp: 6productstring:manufacturerstring:writetimeout: 500readtimeout: 500funcdescstr: usb2.0 to spi&iicfirewarever: 64version information:driver version: 35dll version: 34device version: 64chip type: 1success to set i2c speed.success to set i2c delay.success! result: 68successfully closed device index: 0可以看到返回了数据0x68,0x75是'who_am_i'寄存器,默认值为0x68。
'who_am_i'寄存器
完整代码:
import ch347dll_path = ch347dlla64.dll # replace with the actual path to the dlldevice_index = 0 # set the device index according to your requirementsch347_driver = ch347.ch347driver(dll_path)result = ch347_driver.open_device(device_index)if result: print(fsuccessfully opened device index: {device_index})else: print(ffailed to close device index: {device_index})result, device_info = ch347_driver.get_device_info(device_index)if result: print(device information:) print(fiindex: {device_info.iindex}) print(fdevicepath: {device_info.devicepath.decode()}) print(fusbclass: {device_info.usbclass}) print(ffunctype: {device_info.functype}) print(fdeviceid: {device_info.deviceid.decode()}) print(fchipmode: {device_info.chipmode}) print(fdevhandle: {device_info.devhandle}) print(fbulkoutendpmaxsize: {device_info.bulkoutendpmaxsize}) print(fbulkinendpmaxsize: {device_info.bulkinendpmaxsize}) print(fusbspeedtype: {device_info.usbspeedtype}) print(fch347ifnum: {device_info.ch347ifnum}) print(fdataupendp: {device_info.dataupendp}) print(fdatadnendp: {device_info.datadnendp}) print(fproductstring: {device_info.productstring.decode()}) print(fmanufacturerstring: {device_info.manufacturerstring.decode()}) print(fwritetimeout: {device_info.writetimeout}) print(freadtimeout: {device_info.readtimeout}) print(ffuncdescstr: {device_info.funcdescstr.decode()}) print(ffirewarever: {device_info.firewarever}) print(repr(device_info))else: print(failed to get device information.)result, driver_ver, dll_ver, device_ver, chip_type = ch347_driver.get_version(device_index)if result: print(version information:) print(fdriver version: {driver_ver}) print(fdll version: {dll_ver}) print(fdevice version: {device_ver}) print(fchip type: {chip_type})else: print(failed to get version information.)result = ch347_driver.i2c_set(device_index, 1)if result: print(success to set i2c speed.)else: print(failed to set i2c speed.)result = ch347_driver.i2c_set_delay_ms(device_index, 1)if result: print(success to set i2c delay.)else: print(failed to set i2c delay.)result = ch347_driver.stream_i2c(device_index, b'xd0x75', 1)if result: print(success! result:, result.hex())else: print(failed!)# example usage of ch347closedeviceresult = ch347_driver.close_device(device_index)if result: print(fsuccessfully closed device index: {device_index})else: print(ffailed to close device index: {device_index})接下来就可以对 mpu6050 各种功能进行封装,然后在电脑上直接获取传感器数据了。
电压检测与控制信号产生电路
品佳推出基于微芯科技ATSAMB11的BLE智能门锁方案
基于PXI-9820采集卡和MATLAB实现WLAN基频发射模块的效能测试
光照培养箱的作用和意义
物联网和边缘计算的首要是什么
ch347连接mpu6050模块的方法
5G工业场景,到底是增量的应用还是替代既有的应用?
新禁令“违法” 华为正式对FCC提起诉讼
奥地利微电子推出获得FlexRay V2.1 Rev B认证
东莞市行政中心广场充电基础设施正式启用
变压器冲击合闸是在高压侧还是低压侧进行?
Spring+Vue增删改查实例
干式变压器产品选型详细介绍
PCB喷印智能化全套解决方案
新华三正式对外发布“新华三安全生态合作战略3.0”
RFID较条码的优势那么多 为什么无法替代它?
俄罗斯政府预计2030年开发出28纳米制程技术
红外遥控的原理详解
4G视频监控数据将采用无线采集传输技术
Vishay扩展汽车级SMD铝电容器的电压范围