关于电子设计大赛无人机题的学习笔记(3)常用设备总线的使用方法(IIC)

2023-05-16

关于电子设计大赛无人机题的学习笔记(3)常用设备设备总线的使用方法(IIC)

)

1. 吐槽及日志

首先 电赛因为疫情原因推迟了 ,emmm在我看来跟取消了差不了太多,这一波小系列的学习记录暂时只能在第三篇就停止更新了,之后会写一整个系列的飞控方法和分析的文章,三号得知这个消息到现在人都处于一种比较浑浑噩噩的状态,尽管知道这是十分不好的状态但是我还是很难去扭转这种现实,因为之前已经完全进入备赛状态的身心紧绷的状态已经垮掉了。昨天2021 8.8 去参加了DJI办的青年工程师大会 ,见到了一些以前合作过的战友,才让我稍微好转了一点,但是还是觉得身心压力很大,不过这次是正面刺激,我觉得我能做的更好一点,因为我看到我能做更多的可能性,之后我的研究重心会转移到多机器人协同算法,还有多机编队飞行控制系统的设计上。目前看起来状态正在慢慢好转,实验室的结构基本也成型了,Falcon_Swarm_Robotic_LAB 以后会算是正式在这间实验室展开工作了。希望一切顺利。

2.设备总线

  • 总线是嵌入式领域必须掌握的通信方式,嵌入式设备缺少了它就好像人类缺少了交流能力不能说话,也不能听见,更不能分享想法 在机器和传感器,控制单元之间各自完成了自己的工作后要分享结果,那么久需要总线来进行沟通
  • 常见的总线包括 UART,IIC,ISP,CAN。这些总线十分有年代但是如今还是非常通用,甚至像CAN总线,在未来的未来可以预期它仍然是汽车行业的必要总线,很难找到更好的解决方案
  • 总线的分类大致包括按三中类型进行区分,第一种区分方式:按功能可以分为 地址总线,数据总线,控制总线
  • 按传输方法分类:可以分为串行总线和并行总线:区别是能否一次允许多机之间的总线互通,类似于只有一条跑道让数据跑步和好多条跑道让数据跑步的区别,但是相应的成本必然会有所增加。
  • 按时钟信号方式分类:可以分为同步总线和异步总线:同步和异步的主要区别在于其数据是否需要一条独立的时钟线进行支撑

3.IIC

今天主要讨论的是在电赛过程中我所主要负责研究的模块:HWT906 惯性测量单元,这款传感器的数据即是通过IIC总线进行收发。
IIC总线的特殊之处在于其有MASTER和SLAVE两种机制,主机可以发出指令,好的现在从机一二三给我数据,我给你数据,四五六关闭别说话。但是反过来却是不行的,在从机想像主机申请数据的时候是不被认可的

IIC总线的主要架构

在这里插入图片描述
IIC总线主要由两条时钟线构成:SDA和SCL其中在设备端必须加一个上拉电阻链接到正的电源电压,才能够正常运行,即两条线路必须在空闲时都保持高电压的模式。且连接到总线的器件输出级必须是漏极开路或集电极开路才能执行线与的功能。

IIC的位传输

在这里插入图片描述
IIC总线的数据流模型

IIC接口的通讯方式研究

IIC的通信过程在第一层可以分为

初始化init,发送,读取

展开来分析

首先要提到的IIC的时序线中必须包括ACK数据头或是NACK数据头,这两种数据头包装方式包含了不同的电平变换信息

以及每一次数据的开始一定会包含START头和STOP电平

IIC的init比较简单

启动对应SCL的引脚。

IIC的数据发送

IIC的数据Send和Write是两种相关联的数据传输方式

Write是正式的写入方法方法

  • 写入的时序是
void I2C_Write_Byte_HWT(uint8_t Slaveaddr, uint8_t REG_Address, uint8_t *REG_data)
{
    IIC_Start();
    IIC_SendByte(Slaveaddr);
		
    IIC_RecvACK();
 		delay(10);
    IIC_SendByte(REG_Address);
		IIC_RecvACK();
		delay(10);
    IIC_SendByte(REG_data[0]);
    IIC_RecvACK();
		delay(10);
		IIC_SendByte(REG_data[1]);
		IIC_RecvACK();
		delay(10);
    IIC_Stop();
}
void I2C_Write_Byte(uint8_t Slaveaddr, uint8_t REG_Address, uint8_t REG_data)
{
    IIC_Start();
    IIC_SendByte(Slaveaddr);
    IIC_RecvACK();
    IIC_SendByte(REG_Address);
    IIC_RecvACK();
    IIC_SendByte(REG_data);
    IIC_RecvACK();
    IIC_Stop();
}

  • START -->ACK–>SEND_ADDRESS–>ACK->SEND_REG–>…–>ACK–>STOP
  • 读取的时序是
uint8_t I2C_Read_Bytes(uint8_t Slaveaddr, uint8_t REG_Address, uint8_t *ptr, uint8_t len)
{
    IIC_Start();
    IIC_SendByte(Slaveaddr);
    IIC_RecvACK();
		delay(10);
    IIC_SendByte(REG_Address);
    IIC_RecvACK();
		delay(10);
    IIC_Start();
    IIC_SendByte(Slaveaddr + 1);
    IIC_RecvACK();
    while (len)
    {
				delay(10);delay(10);				//这个地方的时序决定了所有的事情
        if (len == 1)
        {
            *ptr = IIC_RecvByte();
						
            IIC_SendACK(0);
        }
        else
        {
            *ptr = IIC_RecvByte();
						
            IIC_SendACK(1);
        }
        ptr++;
        len--;
    }
    IIC_Stop();
    return 0;
}
  • START–》ACK–》SEND_ADDRESS–>ACK–>SEND_REG–>START–>SEND–>ADDRESS+1–>READ_ONE_bete–>ACK–>READ_ONE_bete–>ACK–>NACK–>STOP

开发过程的一些吐槽和经验

在开发过程中,IIC的通讯协议时序是十分重要的部分,如果其时序分配不正确那么将不能正常的收发数据 ,哪怕只是轻微的数据帧重叠都会导致故障和问题

IIC的读取时序较为简单,写入的方法较为复杂。

ACK可以理解为应答机信号,即SLAVE打出信号后如果电平的到了翻转但是在并非自己改回电平的情况下电平发生了改变那么ACK电平正确应答,在时序中可以看到ACK电平信息。

结合程序已有框架进行传感器更换的实现思路

更换传感器本就是十分冒险的操作,目前已有的飞机的自身传感器虽然已经比较完善,但是飞机的飞行状态并不十分平稳,而且通过在飞行状态和LOCK状态下的DEBUG调试情况并且通过JTAG通过示波器读取了MPU6050的数据解析波形,可以观测到波形的状态毛刺,突变相当的严重,关于这些问题联系到飞机上为了降低成本选用了自制的MPU6050传感器就可以解释这些情况了

这也就引出了我们更换传感器的必要性,传感器HWT906在进行新传感器选型时进入了我们的视野,这一款传感器有完善的数据手册和各种资料以及厂家的完善支持,除此以外,它是一款高精度的IMU这是对我们的研究带来非常好的支持的事情,尽管更换核心传感器的想法十分危险,但是这是值得尝试的。

在前期经过大量的考虑,基本读懂FUM基本框架的前提下,决定尽量封装HWT906的数据,将HWT906的数据封装成和MPU6050的数据结构封装成完全一样的部分,在进行校验后如果两者的误差在10%以内,就选择HWT906的数据替换掉MPU6050的数据,将数据进行精确,但是在后续遇到了其他问题。

根据可能发生的问题做出的预判

可能遇到的问题在开始实验和开发之初就已经有了一部分考虑

最大的问题是传感器如果跟换失败,那么飞行器一定会出现飞行姿态故障,飞行器会出现危险行为动作,为此首先加了强制控制环,如果程序的原始IMU发生危险动作反馈,直接锁死所有桨叶确保不会有更大的危险,

其他的一些问题包括了跟换的元素是否能保证数据正确性,在后期的测试中确实出现了这方面的问题,最后我们决定加入帧首尾测试确保数据帧的正常,能否保证数据的单位是符合MPU6050的数据单位的,在测试后数据比较符合,所以认为其符合

在开始调试后使用别人开源代码做的方案失败

原因分析

这套代码的波特率与所选的新型传感器HWT906IMU并不适配,并且在更换了两端到一致的波特率后还是不能够正确识别数据,更可能的原因是传感器的设置有问题或者是主从机的通信关系有问题,这是非常致命的,仔细查找代码后发现这套开源的IIC框架对于未能出现的上拉电阻并没有进行处理,更加巧合的是这款传感器的核心部分的确没有上拉电阻,解决了第一个问题,此时双端通信得到了实现,但是收到的数据和地址寄存器的控制位发回的信息仍然是失控的状态,0xFFFF现在看到这一串就头大,好的只能进行数据分析了

数据流分析

在数据流分析的环节,使用逻辑分析仪,直接观测了两个引脚所输出的时钟信号组合完成的数据信息,这些信息是能够被完整观测的,在观测后发现,每一位数据位和ACK应答机都发生了重叠,由此导致了乱码的产生,并且地址位是错误的,经过查询技术手册发现传感器的地址位必须左移一位才能够正确进行读取寄存器的值,在对这个问题修正后,再次修改开源代码在每一位数据位发送完后加delay10,进而 能够保证数据位和应答机位不发生重叠从而问题得到了有效解决
数据现在能够保证了正常的传输

HWT906传感器写入失败问题的处理

原因分析:
时序不对
数据流错误
数据流分析:
时序正确
数据流正确
一天时间过去了 。。。然后尝试了各种办法
实验室另外一个大佬看我处理不好给我提供了个思路,既然正的不行那就试试反向的,好的,做了测试,电脑发给传感器的指令 0x08,说明书里没有,好的,补上这个指令,所有事情work了。…此处省略一万字

4. 总结

首先这次处理HWT906传感器的事件,带给我的不只是一次处理传感器任务的过程,更多的是一次对自己解决问题的思路的审视与思考,首先最高优先级的应该是成熟的设计文档,同时去参考一些可能的问题并且排除法去处理,这样子问题才能尽快得到解决

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

关于电子设计大赛无人机题的学习笔记(3)常用设备总线的使用方法(IIC) 的相关文章

  • RMI的基础原理

    背景 上世纪90年代 焦点转移到跨平台通信 一台计算机可以通过某种类型网络在另一台计算机上发起一个动作 CORBA DCOM Java RMI 技术等等 xff0c 到现在的grpc等 Hello span class token keyw
  • 一次因修改Python编码规范而引起的“血案“

    简单来说就是因为如下代码 导致了ZipOutputPath的一个函数异常 导致zip包不能正确下载 有如下报错 UnboundLocalError local variable 39 val 39 referenced before ass
  • Python之禅(The Zen of Python)源码分析

    简介 非常高兴大家能够订阅这个专栏 在这里我将会给大家分享一些Python相关源码的剖析 在接下来的这段日子里 我会一同带各位pythonista探索Python的奥秘 该从什么开始 思来想去 我觉得作为一个Python初学者还是Pytho
  • Linux常用命令速查表

    目录即文件 dev null 等价于只写文件 所有写入它的内容都会永远丢失 而尝试从它那儿读取内容则什么也读不到 禁止标准输出 cat filename gt dev null 文件内容丢失 xff0c 而不会输出到标准输出 禁止标准错误
  • git常用命令速查表

    这是一些比较常用的命令 大家可以复制后用typora做成pdf格式 xff0c 方便快速查询 后续不定期更新 官方文档 官方文档 https git scm com docs 本地文档 file D cmder vendor git for
  • python开发中的常用命令

    这是一些比较常用的命令 大家可以复制后用typora做成pdf格式 xff0c 方便快速查询 后续不定期更新 pip升级 pip package installer for python use pip to install package
  • Python手写一个Base64编解码工具

    这里我们只实现标准的base64 补充位用 61 填充 编码 下面是base64字符的对照表 因为base64编码是将6bit表示成8bit 所以在原来的基础上会增长1 3 另外2 6 61 64 xff0c 这也是为什么这个表会有64个索
  • Python彩蛋源码分析(二)

    简介 非常高兴大家能够订阅这个专栏 在这里我将会给大家分享一些Python相关源码的剖析 在接下来的这段日子里 我会一同带各位pythonista探索Python的奥秘 hello world hello world hello pytho
  • Python源码剖析专栏总览

    简介 非常高兴大家能够订阅这个专栏 在这里我将会给大家分享一些Python相关源码的剖析 在接下来的这段日子里 我会一同带各位pythonista探索Python的奥秘 将会分析一些源码的构思设计以及这些工具的使用方法 彩蛋篇 Easter
  • maven笔记小抄

    settings xml settings xml位置 标签指定本地下载的依赖在本地的保存位置 user home m2 repository表示C Users username m2 settings xml idea中File Sett
  • linux 下 tcpdump 详解 后篇(自己实现抓包过滤)

    一 概述 在了解了tcpdump的原理后 xff0c 你有没有想过自己去实现抓包过滤 xff1f 可能你脑子里有个大概的思路 xff0c 但是知道了理论知识 xff0c 其实并不能代表你完全的理解 只要运用后 xff0c 你才知道哪些点需要
  • Python字节码分析(一)

    简介 非常高兴大家能够订阅这个专栏 在这里我将会给大家分享一些Python相关源码的剖析 在接下来的这段日子里 我会一同带各位pythonista探索Python的奥秘 Pyc文件 简介 当在文件被当成模块导入时才会生成pyc文件 pyc文
  • Python基本类型(一)

    简介 非常高兴大家能够订阅这个专栏 在这里我将会给大家分享一些Python相关源码的剖析 在接下来的这段日子里 我会一同带各位pythonista探索Python的奥秘 basic data types in python Python中的
  • xmlrpc源码解读(一)

    简介 非常高兴大家能够订阅这个专栏 在这里我将会给大家分享一些Python相关源码的剖析 在接下来的这段日子里 我会一同带各位pythonista探索Python的奥秘 将会分析一些源码的构思设计以及这些工具的使用方法 一个简单的RPC实例
  • Python代码整洁之道勘误

    简介 本博文是对 lt Python代码整洁之道 gt 一书的一些错误进行矫正 这本书英文名字是 lt Clean Python Elegant Coding int Python gt 这本书的作者是Sunil Kapil 这本书错误非常
  • 自己动手写strcat函数

    char catstr char a char b char x 61 a while a 61 39 0 39 a 43 43 while b 61 39 0 39 a 61 b a 43 43 b 43 43 a 61 39 0 39
  • 为什么C++开发不需要安装STL库

    如果交叉编译工具链的路径已经添加到path变量中的话 xff0c 可以直接使用 v即可查看 xff0c 比如我的是arm linux gnueabihf g 43 43 那么直接arm linux gnueabihf g 43 43 v或者
  • 为什么要内存对齐

    为什么要内存对齐 xff1f 很多CPU是从对齐的地址开始加载数据 xff0c 外部总线从内存一次获取的数据往往不是1比特 xff0c 而是4比特或8比特或更多 xff0c 与数据总线带宽有关 比如有一个int数据类型 xff0c 其分配的
  • marlin2.0.x 固件相关配置文档说明

    主要目的 了解对应参数的作用 xff0c 以优化3D打印机的打印效果 具体分析 配置文件有两个 Configuration h 包含硬件核心 语言和控制器的设置 xff0c 以及最常见的功能和组件的设置 xff0c 主要配置的地方 Conf
  • c++容器--vector deque list set map stack queue特性及其选取准则

    1 vector xff08 连续的空间存储 可以使用 操作符 xff09 快速的访问随机的元素 xff0c 快速的在末尾插入元素 xff0c 但是在序列中间岁间的插入 xff0c 删除元素要慢 xff0c 而且如果一开始分配的空间不够的话

随机推荐

  • 网络、串口之应用层通讯协议编订

    一种二进制通信协议 消息长度 BYTES 结构描述Header4SyncBytes格式 xff1a 0x09 0x6f 0x01 0x01 xff0c 表示不同设备之间的交互Header4FullMessageLength数据总长度 xff
  • STM32基于串口接收缓存非空中断(RXNE)和空闲中断的串口转发功能

    STM32基于串口接收缓存非空中断 xff08 RXNE xff09 和空闲中断的串口转发功能 0 实验背景 本实验的目的是实现串口的双向转发 xff0c 即向串口1写入数据后 xff0c 串口2及时输出串口1收到的数据 xff1b 向串口
  • Ubuntu16.04 中 搭建Janus Server

    Ubuntu16 04 局域网中搭建Janus Server janus简介 Janus是WebRTC 服务器端的开源项目 xff0c 官方对其定义是一个WebRTC服务器端 xff0c 支持的功能比较丰富 xff0c 通过core模块来支
  • 堆栈溢出一般是由什么原因导致

    背景 全局变量存放在静态存储区 位置是固定的 局部变量在栈空间 栈地址是不固定的 栈 xff1a 就是那些由编译器在需要的时候分配 xff0c 在不需要的时候自动清楚的变量的存储区 里面的变量通常是局部变量 函数参数等 堆 xff1a 就是
  • 简单明了的蓝牙服务及UUID介绍

    什么是蓝牙 蓝牙 xff0c 是一种支持设备短距离通信 xff08 一般10m内 xff09 的无线电技术 xff0c 能在包括移动电话 PDA 无线耳机 笔记本电脑 相关外设等众多设备之间进行无线信息交换 利用 蓝牙 技术 xff0c 能
  • 深入详细理解矩阵 (矩阵的加减乘、转置、共轭、共轭转置)

    简介 矩阵 英文名Matrix 在数学名词中 xff0c 矩阵用来表示统计数据等方面的各种有关联的数据 这个定义很好地解释了Matrix代码制造世界的数学逻辑基础 矩阵是数学中最重要的基本概念之一 xff0c 是代数学的一个主要研究对象 x
  • 无线模块的参数介绍和选型要点

    01 通信频点 通信频点 xff1a 无线模块在工作的时候向外辐射出去的电波频率 xff1b 无线串口模块常用的频点大致可以分为170MHz 230MHz 315MHz 433MHz 490MHz 780MHz 868MHz 915MHz
  • 使用freertos如何确定分配堆栈空间大小

    前言 运行freertos系统的大部分都是资源有限的MCU xff0c 所以对于ram我们都要考虑尽量的节省 xff0c 避免资源浪费 xff0c 从而也可以针对项目选择性价比更好的mcu 关系分析 首先要配置freertos的堆 heap
  • windows从零搭建googletest之c++测试工程

    简介 googletest xff08 也称gtest xff09 是由Google测试技术团队开发的测试框架 为c c 43 43 代码提供了一套优秀的单元测试解决方案 本文介绍使用googletest在windows下从零搭建自己的单元
  • c++ 常用转换vector<uint8_t> 转string

    std span class token double colon punctuation span vector span class token operator lt span span class token keyword uin
  • c语言解析协议常用套路

    简介 协议定义username len value while 读取 2个switch case解析 读取value 代码示例 span class token keyword struct span span class token cl
  • c++模板 --- 模板的嵌套

    简介 明白类型是什么即可 xff0c 可以适当运用using语法起别名 简化代码 一 函数模板嵌套 span class token keyword template span span class token operator lt sp
  • DWA算法详解

    首先在V m V d的范围内采样速度 xff1a allowable v 61 generateWindow robotV robotModel
  • C++OpenCV实现YOLO算法对目标进行检测实战

    基本概念 nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp 加载darknet框架的YoloV4模型做目标检测 OpenCV DNN模块支持常见深度学习框架如TensorFlowCaffe Darknet等 对
  • 使用GooSeeker软件进行爬虫

    一 使用GooSeeker软件进行爬虫 xff0c 它是进行读取大量数据的 xff0c 都出来的数据是xml格式的 xff0c 可以通过office excel将xml格式转化成表格形式 1 爬虫取数据 xff1a 1 xff09 先要在网
  • 51单片机--堆栈

    堆栈的作用是用在调用子程序或中断程序时保护现场 xff0c 因为51单片机的寄存器是十分有限的 xff0c 而相对来说普通数据存储器更充足 xff0c 通过入栈将寄存器中的内容临时保存到堆栈中 xff08 普通数据存储器 xff09 xff
  • Git-命令行-使用 Tag 标记你的代码

    前言 正文开始之前 xff0c 我想我们需要弄明白几个问题 xff1a tag 是什么 xff1f 使用tag 的好处 xff1f tag 和 branch 的区别以及使用场景 xff1f tag 是什么 xff1f tag 翻译过来是标签
  • 光流Zoom In and Out开发记录

    简介 2018年7月 xff0c 合作伙伴提出了一个想法 使用光流算法估计相机前后移动 经典的光流算法 xff08 Lukas Kanade算法 xff09 适用于相机左右和上下移动 xff0c 但是在相机前后移动时 xff0c 虽然各个像
  • 关于电子设计大赛无人机题的学习笔记(2)飞控代码分析和高精度IMU传感器的使用

    飞控代码分析和高精度IMU传感器的使用 最近着急备赛很多文档只是处于零零散散状态没办法细节的整理出来专门放一份 xff0c 等比赛结束会统一整理 xff0c 现在只能先放一些研发过程中的技术文档上来了 目前我们的调试进度是 xff0c 稳定
  • 关于电子设计大赛无人机题的学习笔记(3)常用设备总线的使用方法(IIC)

    关于电子设计大赛无人机题的学习笔记 3 常用设备设备总线的使用方法 IIC xff09 1 吐槽及日志 首先 电赛因为疫情原因推迟了 xff0c emmm在我看来跟取消了差不了太多 xff0c 这一波小系列的学习记录暂时只能在第三篇就停止更