0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

ch347连接mpu6050模块的方法

CHANBAEK 来源:FunIO 作者:FunIO 2023-07-23 11:04 次阅读

在上一篇文章 详解 I2C的末尾,有这样一张波形图:

图片
实例2

这个对应的就是常见的从设备寄存器读数据的波形,只是在写数据时多了一个字节。

通用的从 I2C 设备读寄存器数据的模式应该是这样的:

图片
从从设备寄存器读数据示例

在mpu6050 数据表 中的9.3 I2C Communications Protocol章节说明了 mpu6050 的 i2c 接口协议,符合通用模式。

mpu6050 单字节写和加速写序列如下:

图片

mpu6050单字节写和加速写

mpu6050 单字节读和加速读序列如下:

图片

mpu6050单字节读和加速读

上面的加速写和加速读都是以 2 个数据字节为例的。

从实例 2 的波形图可以看出,启动传输后,写了0x12``0x13``0x143 个字节,这 3 个字节后都是NACK,然后是重复起始信号,跟着刚才地址字节0x12+10x13,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.py
Successfully opened device index: 0
Device Information:
iIndex: 0
DevicePath: ?USB#VID_1A86&PID_55DB&MI_02#7&2887B016&0&0002#{5446F048-98B4-4EF0-96E8-27994BAC0D00}
UsbClass: 0
FuncType: 1
DeviceID: USBVID_1A86&PID_55DB&MI_02#7&2887B016&0&0002#
ChipMode: 1
DevHandle: 912
BulkOutEndpMaxSize: 512
BulkInEndpMaxSize: 512
UsbSpeedType: 1
CH347IfNum: 0
DataUpEndp: 6
DataDnEndp: 6
ProductString:
ManufacturerString:
WriteTimeout: 500
ReadTimeout: 500
FuncDescStr: USB2.0 To SPI&IIC
FirewareVer: 64
 ch347.mDeviceInforS object at 0x000002465A1E63C0 >
Version Information:
Driver Version: 35
DLL Version: 34
Device Version: 64
Chip Type: 1
Success to set I2C speed.
Success to set I2C delay.
Success! result: 68
Successfully closed device index: 0

可以看到返回了数据0x680x75是'WHO_AM_I'寄存器,默认值为0x68

图片
'WHO_AM_I'寄存器

完整代码:

import ch347

dll_path = "ch347dlla64.dll"  # Replace with the actual path to the DLL
device_index = 0  # Set the device index according to your requirements

ch347_driver = ch347.CH347Driver(dll_path)

result = ch347_driver.open_device(device_index)
if result:
    print(f"Successfully opened device index: {device_index}")
else:
    print(f"Failed to close device index: {device_index}")

result, device_info = ch347_driver.get_device_info(device_index)
if result:
    print("Device Information:")
    print(f"iIndex: {device_info.iIndex}")
    print(f"DevicePath: {device_info.DevicePath.decode()}")
    print(f"UsbClass: {device_info.UsbClass}")
    print(f"FuncType: {device_info.FuncType}")
    print(f"DeviceID: {device_info.DeviceID.decode()}")
    print(f"ChipMode: {device_info.ChipMode}")
    print(f"DevHandle: {device_info.DevHandle}")
    print(f"BulkOutEndpMaxSize: {device_info.BulkOutEndpMaxSize}")
    print(f"BulkInEndpMaxSize: {device_info.BulkInEndpMaxSize}")
    print(f"UsbSpeedType: {device_info.UsbSpeedType}")
    print(f"CH347IfNum: {device_info.CH347IfNum}")
    print(f"DataUpEndp: {device_info.DataUpEndp}")
    print(f"DataDnEndp: {device_info.DataDnEndp}")
    print(f"ProductString: {device_info.ProductString.decode()}")
    print(f"ManufacturerString: {device_info.ManufacturerString.decode()}")
    print(f"WriteTimeout: {device_info.WriteTimeout}")
    print(f"ReadTimeout: {device_info.ReadTimeout}")
    print(f"FuncDescStr: {device_info.FuncDescStr.decode()}")
    print(f"FirewareVer: {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(f"Driver Version: {driver_ver}")
    print(f"DLL Version: {dll_ver}")
    print(f"Device Version: {device_ver}")
    print(f"Chip 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 CH347CloseDevice
result = ch347_driver.close_device(device_index)
if result:
    print(f"Successfully closed device index: {device_index}")
else:
    print(f"Failed to close device index: {device_index}")

接下来就可以对 mpu6050 各种功能进行封装,然后在电脑上直接获取传感器数据了。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 模块
    +关注

    关注

    7

    文章

    2484

    浏览量

    46530
  • 寄存器
    +关注

    关注

    30

    文章

    5028

    浏览量

    117721
  • I2C
    I2C
    +关注

    关注

    28

    文章

    1346

    浏览量

    120816
  • MPU6050
    +关注

    关注

    38

    文章

    304

    浏览量

    69845
收藏 人收藏

    评论

    相关推荐

    MPU6050连接失败错误

    大家好,我想知道是否有人能快速浏览一下我的项目,让我知道我做错了什么。这是我从山姆的博客下载的一个项目,我遵循了他推荐的内容。代码运行但引发了一个错误:“MPU6050连接失败”,然后打印0遍。我想
    发表于 10-24 16:57

    HAL库 MPU6050的使用 精选资料分享

    值,陀螺仪将通过I2C1连接。我用的是STM32F411RE NUCLEO板。您将用到CubeMX&&KEIL5我们将用到:LED用于闪烁判断程序正常运行UART2用于发送数据至PCI2C用于读取MPU6050数据代码结构我们将重定义 fputc 函数,用于串口显示.
    发表于 07-20 07:13

    用示波器测试mpu6050和stm32连接后的scl

    mpu6050和stm32连接后的scl,算了一下周期确实是2.5us即400kHz,那么这样直接连接速度没问题。下图是示波器连线图下图是波形3.测试了遥控器信号(输入a),发现1234...
    发表于 08-06 06:17

    MPU6050模块

    2.4 STM32 MPU6050数据获取(IIC + DMP)本篇文章主要针对廉价的MPU6050模块。我们这里完成了MPU6050的数据获取、零偏自动设置、温漂抑制。这里提供源码工
    发表于 08-09 07:17

    使用esp32连接mpu6050读取角度数据

    使用esp32连接mpu6050,读取角度(这里只是读取角度,其他的自行去查阅,很多厂家都有例程的)。这边使用的是维特一家厂家的(他们的技术服务很好),看了官方的arduino例程,发现他们
    发表于 02-10 07:11

    MPU6050原理图

    MPU6050原理图,PDF格式,还蛮清晰。
    发表于 03-24 17:25 109次下载

    MPU6050(硬件IIC)

    MPU6050(硬件IIC)MPU6050(硬件IIC)
    发表于 04-02 16:29 73次下载

    Arduino与MPU6050的通信

    为避免纠缠于电路细节,我们直接使用集成的MPU6050模块MPU6050的数据接口用的是I2C总线协议,因此我们需要Wire程序库的帮助来实现Arduino与MPU6050之间的通信
    发表于 11-07 14:25 7036次阅读
    Arduino与<b class='flag-5'>MPU6050</b>的通信

    一文看懂mpu9150和mpu6050区别

    本文开始对mpu9150进行了介绍,其次介绍了mpu6050的定义、mpu6050感测范围以及mpu6050的特征,最后阐述了mpu9150
    发表于 03-08 10:07 4.1w次阅读

    mpu6050怎么与单片机连接

    本文开始介绍了mpu6050的定义和mpu6050的感测范围,其次阐述了mpu6050特征,最后介绍了mpu6050与单片机的连接
    发表于 03-09 08:42 2.6w次阅读

    mpu6050姿态解算原理_mpu6050姿态解算程序

    mpu6050常用作提供飞控运行时的姿态测量和计算。本文首先介绍了MPU6050姿态解算的原理,其次详细的介绍了mpu6050姿态解算程序。
    的头像 发表于 03-09 09:15 4.2w次阅读

    MPU6050专用稳压模块的原理图设计

    MPU6050专用稳压模块的原理图设计
    发表于 11-07 19:21 38次下载
    <b class='flag-5'>MPU6050</b>专用稳压<b class='flag-5'>模块</b>的原理图设计

    MPU6050简介

    MPU6050简介什么是MPU6050MPU6050的特点MPU6050框图MPU6050初始化MPU6050—DMP使用介绍
    发表于 12-06 11:51 67次下载
    <b class='flag-5'>MPU6050</b>简介

    MPU6050( )

    MPU6050( )
    发表于 12-06 15:06 30次下载
    <b class='flag-5'>MPU6050</b>( )

    高速USB转接芯片 CH347

    CH347 是一款高速 USB 总线转接芯片,通过 USB 总线提供异步串口、I2C 同步串行接口、SPI 同 步串行接口和 JTAG 接口等。 在异步串口方式下,CH347 提供
    的头像 发表于 04-28 11:27 1942次阅读
    高速USB转接芯片 <b class='flag-5'>CH347</b>