【STM32F1】——9轴姿态传感器JY901与IIC通信

news2024/11/22 2:15:10

【STM32F1】——9轴姿态传感器JY901与IIC通信

一、简介

本篇主要对9轴姿态传感器JY901的调试过程进行总结,实现了以下功能。

  1. IIC通信采集+串口收发:使用STM32F103C8T6的GPIO口模拟IIC,从JY901读取数据,并通过USART1串口发送到PC。

二、JY901介绍

  1. 电压:3.3-5V
  2. 量程:X/Z轴 ±180°, Y轴 ±90°
  3. 通信方式:IIC、UART(默认9600波特率)
  4. 型号区别:JY901S(带温补),JY901B(带气压)
  5. 帧头格式:以角度输出为例,回传数据为11位。格式为:0x55 0x53 RollL RollH PitchL PitchH YawL YawH TL TH SUM
  6. JY901的IIC通信协议
    1)模块的IIC协议采用寄存器地址访问的方式。每个地址内的数据均为16位数据,寄存器地址和含义详见用户手册。
    2)JY901-IIC的写入:主机向JY901发送开始信号,写入JY901的设备地址dev(即0x50)。再写入目标寄存器的地址reg。随后写入第一个数据的低字节、高字节。当最后一个数据写完后,主机向JY901发送停止信号。
    在这里插入图片描述
    3)JY901-IIC的读取:主机向JY901发送开始信号,写入JY901的设备地址dev(即0x50)。再写入目标寄存器的地址reg。主机再向JY901发送一个读信号(dev<<1)+1。JY901按先低字节,后高字节的顺序输出数据。主机在接收每一个字节后,拉低SDA总线,并向JY901发送应答信号,待接收到length长度的数据后,主机不再反馈应答信号,数据传输停止。主机发送停止信号,结束读取。

三、IIC通信的相关知识点

  1. IIC通信的总线:分为时钟线SCL和信号线SDA,其中:
    1)SCL:由主设备提供时钟信号,用来同步数据传输;
    2)SDA:用来传输数据

  2. IIC的通信协议
    1)由SCL和SDA通过逻辑电平的配合,产生三种信号,构成基本的时序单元:
    在这里插入图片描述

    开始信号:SCL高电平期间,SDA由高电平变为低电平,意味着总线被占用
    结束信号:SCL高电平期间,SDA由低电平变为高电平,意味着总线空闲
    应答信号:发送设备每发送完一个字节(8位)后,在第9位释放数据线,由接收设备反馈一个信号。当应答信号为低电平时,表示接收设备成功接收,规定为有效应答ACK;反之为无效应答。

  3. IIC通信的数据传输原则
    1)先发送高位数据,再发送低位数据(高位先行
    2)IIC总线进行数据传输时,在SCL=1时,SDA上的不允许由电平变化。只有在SCL=0时,SDA上的电平才可以变化。数据的传输是边沿触发。
    3)当SCL=SDA=1时,总线处于空闲状态。

  4. IIC写操作的通信过程:依靠地址进行通信
    1)主机在IIC总线上发送起始信号,总线上的所有从机等待主机的数据;
    2)主机发送“从机地址+0(代表写数据)”得到8位数据帧,从机检测是否为对应地址,产生应答信号。
    3)主机接收应答信号,向从机发送真正的数据信号。

在这里插入图片描述

  1. IIC读操作的通信过程
    1)主机在IIC总线上发送起始信号,总线上的所有从机等待主机的数据;
    2)主机发送 “从机地址+1(代表读操作)”组成的8位数据帧,从机检测是否为对应地址,产生应答信号,同时向主机返回8位数据帧,随后等待主机的应答信号;
    3)主机发出应答信号,从机发送数据,直到主机发送非应答信号,从机停止发送

在这里插入图片描述

  1. 模拟IIC和硬件IIC

    1)硬件IIC:对应芯片上的IIC外设,有相应IIC驱动电路。通信较为稳定,但需要直接调用内部寄存器进行配置,编程相对繁琐;
    2)软件IIC:使用GPIO管脚,用软件控制SCL,SDA线输出高低电平,模拟i2c协议的时序,通信稳定,编程相对简单;

  2. 注意事项IIC外接上拉电阻
    1)在使用模拟IIC通信时,需要外接上拉电阻,一般使用4.7kΩ!因为GPIO口一般配置的是开漏输出,这意味着内部电路可以吸收电流,但无法提供电流,即GPIO可以被设置为低电平,但不能被设置为高电平。而上拉电阻可以保证在没有设备驱动时总线SCL和SDA被保持在高电平状态。

    2)这里的GPIO口不能使用推挽输出,因为一个设备输出高电平,一个设备输出低电平时会导致短路烧毁设备。

四、JY901的模拟IIC通信

  1. 接线
    在这里插入图片描述

  2. 程序简介:使用STM32F103C8T6的GPIO口模拟IIC通信,实现9轴姿态模块JY901数据的读取,并利用USART1发送到PC。

  3. 实现思路

    1)配置GPIO口,拉高电平进行初始化;
    2)编写模拟IIC通信的子函数;
    3)配置串口USART1,打开发送中断;
    4)IIC读取JY901的数据,通过USART1发送到PC的串口助手。

  4. 代码解析
    1)模拟IIC对应的GPIO口初始化

    一定配置成开漏输出!

    void IIC_Init(void)
    {
         			
    	GPIO_InitTypeDef GPIO_InitStructure;
     	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);			     
     	//配置PB10-SCL PB11-SDL 为开漏输出  刷新频率为10Mhz
     	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11;	
    	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;       
    	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    	//应用配置到GPIOB 
    	GPIO_Init(GPIOB, &GPIO_InitStructure);
    	
    	SDA_OUT();     //sda线输出
    	IIC_SDA=1;	  	  
    	IIC_SCL=1;
    }
    

    2)模拟IIC通信的一些子函数

    #include "sys.h"
    
    #define SDA_IN()  {
           GPIOB->CRL&=0x0FFFFFFF;GPIOB->CRL|=(u32)8<<28;}
    #define SDA_OUT() {
           GPIOB->CRL&=0x0FFFFFFF;GPIOB->CRL|=(u32)3<<28;}
    
    #define IIC_SCL PBout(10)
    #define IIC_SDA PBout(11)
    
    #define READ_SDA PBin(11)
    
    void IIC_Start(void)
    {
         
    	SDA_OUT();
    	IIC_SDA = 1;
    	IIC_SCL = 1;
    	delay_us(5);
    	IIC_SDA = 0;
    	delay_us(5);
    	IIC_SCL = 0;
    }
    
    void IIC_Stop(void)
    {
         
    	SDA_OUT</

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2239774.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux网络——自定义协议与序列化

一、协议 协议是一种 " 约定 ". socket api 的接口 , 在读写数据时 , 都是按 " 字符串 " 的方式来发送接收的。如 果我们要传输一些 " 结构化的数据 "&#xff0c;依然可以通过协议。 其实&#xff0c;协议就是双方约定好的结构化的数据。…

Windows,虚拟机Ubuntu和开发板三者之间的NFS服务器搭建

Windows,虚拟机Ubuntu和开发板三者之间的NFS服务器搭建 &#xff08;1&#xff09;虚拟机 ubuntu 要使用桥接模式&#xff0c;不能使用其他模式 &#xff08;2&#xff09;通过网线将PC和开发板网口直连:这样的连接&#xff0c;开发板是无法连接外网的 &#xff08;3&#xff…

更改Ubuntu22.04锁屏壁纸

更改Ubuntu22.04锁屏壁纸 sudo apt install gnome-shell-extensions gnome-shell-extension-manager安装Gnome Shell 扩展管理器后&#xff0c;打开“扩展管理器”并使用搜索栏找到“锁屏背景”扩展

大模型推理优化技术-KV Cache

近两年大模型火出天际&#xff1b;同时&#xff0c;也诞生了大量针对大模型的优化技术。本系列将针对一些常见大模型优化技术进行讲解。 大模型推理优化技术-KV Cache大模型推理服务调度优化技术-Continuous batching大模型底显存推理优化-Offload技术大模型推理优化技术-KV C…

力扣 LeetCode 24. 两两交换链表中的节点(Day2:链表)

解题思路&#xff1a; 暂存节点tmp和tmp1 注意&#xff1a;while (cur.next ! null && cur.next.next ! null)表示为偶数和奇数时的循环停止条件&#xff0c;并且while语句中的顺序不可交换&#xff0c;交换会报空指针异常 class Solution {public ListNode swapPai…

动态规划-背包问题——494.目标和

1.状态表示 题目来源 494.目标和——力扣 测试用例 2.算法原理 1.状态表示 首先我们需要将问题简化&#xff0c;这里需要找到能将数组组合计算成为指定数字target的添加方式&#xff0c;那么我们就可以将数字分为两类&#xff0c;一类是前面添加""的&#xff0c;另…

哪些因素会导致充电器的充电速度变慢?-纳米软件

充电器的充电速度变慢可能由多种原因引起。以下是一些常见的因素&#xff1a; 一、充电器本身的问题 充电头功率不足&#xff1a;不同的充电头有不同的输出功率&#xff0c;如果使用的充电头功率较低&#xff0c;那么充电速度就会变慢。例如&#xff0c;一些老旧的充电头可能…

刷题强训(day06) -- 大数加法、链表相加、大数乘法

目录 1、大数加法 1.1 题目 1.2 思路 1.3 代码实现 2、链表相加&#xff08;二&#xff09; 2.1 题目 2.2 思路 2.3 代码实现 3、大数乘法 3.1 题目 3.2 思路 3.3 代码实现 1、大数加法 1.1 题目 1.2 思路 这道题可以模拟列竖式相加解答&#xff0c; 将每一位都转…

数字后端教程之Innovus report_property和get_property使用方法及应用案例

数字IC后端实现Innovus中使用report_property可以报告出各种各样object的属性&#xff0c;主要有cell&#xff0c;net&#xff0c;PG Net&#xff0c;Pin&#xff0c;时钟clock&#xff0c;时序库lib属性&#xff0c;Design属性&#xff0c;timing path&#xff0c;timin arc等…

网络基础 - 网段划分篇

我们知道&#xff0c;IP 地址(IPv4 地址)由 “网络标识(网络地址)” 和 “主机标识(主机地址)” 两部分组成&#xff0c;例如 192.168.128.10/24&#xff0c;其中的 “/24” 表示从第 1 位开始到多少位属于网络标识&#xff0c;那么&#xff0c;剩余位就属于主机标识了&#xf…

python实战(八)——情感识别(多分类)

一、任务目标 本文使用的是来自Kaggle的一个情感识别数据集&#xff0c;这个数据集的总数据量是5934条&#xff0c;标签为anger、fear、joy三种情感的其中一种&#xff0c;很明显是一个多分类任务。这里&#xff0c;我们将使用微调技巧进行深度学习建模&#xff0c;同时我们会比…

23423234

c语言中的小小白-CSDN博客c语言中的小小白关注算法,c,c语言,贪心算法,链表,mysql,动态规划,后端,线性回归,数据结构,排序算法领域.https://blog.csdn.net/bhbcdxb123?spm1001.2014.3001.5343 给大家分享一句我很喜欢我话&#xff1a; 知不足而奋进&#xff0c;望远山而前行&am…

opencv入门学习总结

opencv学习总结 不多bb&#xff0c;直接上代码&#xff01;&#xff01;&#xff01; 案例一&#xff1a; import cv2 # 返回当前安装的 OpenCV 库的版本信息 并且是字符串格式 print(cv2.getVersionString()) """ 作用&#xff1a;它可以读取不同格式的图像文…

MySQL 中的索引下推功能

看到索引&#xff0c;应该大家都可以联想到这个是和查询效率有关系的&#xff0c;既然有这个功能&#xff0c;那么那句古话说的好啊&#xff1a;存在即合理。那么这个就是说有了这个功能&#xff0c;可以提升查询效率。 什么是索引下推 我们先有一个大概的理解&#xff1a;在…

重拾CSS,前端样式精读-媒体查询

前言 本文收录于CSS系列文章中&#xff0c;欢迎阅读指正 说到媒体查询&#xff0c;大家首先想到的可能是有关响应式的知识点&#xff0c;除此之外&#xff0c;它还可以用于条件加载资源&#xff0c;字体大小&#xff0c;图像和视频的优化&#xff0c;用户界面调整等等方面&am…

物理设备命名规则(Linux网络服务器 15)

Linux系统中的一切都是文件&#xff0c;硬件设备也不例外。既然都是文件&#xff0c;就必须有文件名称。系统内核中udev设备管理器会自动把硬件名称规范化起来&#xff0c;目的是让用户通过设备文件的名字可以大致了解设备属性以及分区信息。这对于陌生的设备来说特别方便。另外…

NVIDIA NIM 开发者指南:入门

NVIDIA NIM 开发者指南&#xff1a;入门 NVIDIA 开发者计划 想要了解有关 NIM 的更多信息&#xff1f;加入 NVIDIA 开发者计划&#xff0c;即可免费访问任何基础设施云、数据中心或个人工作站上最多 16 个 GPU 上的自托管 NVIDIA NIM 和微服务。 加入免费的 NVIDIA 开发者计…

猿创征文|Inscode桌面IDE:打造高效开发新体验

猿创征文&#xff5c;Inscode桌面IDE&#xff1a;打造高效开发新体验 引言 在当今快速发展的软件开发领域&#xff0c;一个高效、易用的集成开发环境&#xff08;IDE&#xff09;是每个开发者必不可少的工具。Inscode 桌面 IDE 作为一款新兴的开发工具&#xff0c;凭借其强大…

力扣 LeetCode 142. 环形链表II(Day2:链表)

解题思路&#xff1a; 使用set判断是否重复添加&#xff0c;如果set加入不进去证明之前到达过该节点&#xff0c;有环 public class Solution {public ListNode detectCycle(ListNode head) {Set<ListNode> set new HashSet<>();ListNode cur head;while (cur …

激活函数解析:神经网络背后的“驱动力”

神经网络中的激活函数&#xff08;Activation Function&#xff09;是其运作的核心组件之一&#xff0c;它们决定了神经元如何根据输入信号进行“激活”&#xff0c;进而影响整个模型的表现。理解激活函数的工作原理对于设计和优化神经网络至关重要。本篇博客将深入浅出地介绍各…