3.25号arm

1. I2C总线

1.1 i2c概述

I2C总线是PHLIPS公司在八十年代初推出的一种串行的半双工总线,主要用于连接整体电路。

I2C总线为两线制,只有两根双向信号线。一根是数据线SDA,另一根是时钟线SCL。

I2C硬件结构简单,接口连接方便,成本较低。因此在各个领域得到了广泛的应用。

I2C:同步半双工串行总线

i2c支持一主机多从机通信,每个接到I2C总线上的器件都有唯一的地址。主机如果想和哪一个从机进行通信需要先发送一个从机地址到I2C总线上,每一个从机都会将这个从机地址和自己的地址进行匹配,匹配成功的从机会往数据线上发送一个应答信号,主机确认从机应答后开始进行通信

主机与其它器件进行数据传送时总线上发送数据的器件为发送器,总线上接收数据的器件则为接收器。

1.2 I2C的寻址

I2C总线上传输的数据信号既有地址信号,也有数据信号

主机在起始信号之后必须要传输一个从机的地址信号(7位),第八位是数据的传送方向位,0表示主机发送数据(W),1表示主机接收数据(R)。从机上每个器件都会将七位地址码进行比较,如果相同则认为被主机寻址,并根据R/W位确定是接收器还是发送器

1.3 i2c总线的信号

在I2C总线数据传输过程中存在四种信号:起始信号、终止信号、应答信号、非应答信号

起始信号:i2c总线传输数据的开始

SCL线为高电平期间,SDA线由高电平向低电平的变化表示起始信号

终止信号:i2c总线一次数据传输的结束标志

SCL线为高电平期间,SDA线由低电平向高电平的变化表示终止信号

应答信号和非应答信号

每一个字节必须保证是8位长度。数据传送时,先传送最高位(MSB),每一个被传送的字节后面都必须跟随一位应答位(即一帧共有9位)。

应答信号:第九个时钟周期,接收方往数据线上发送了一个低电平,就是应答信号

非应答信号:第九个时钟周期,接收方往数据线上发送了一个高电平,就是非应答信号

当接收方接收到数据后不想再接收数据,此时会回应发送方一个非应答信号

当接收方接收到数据后还想再接收数据,此时会回应发送方一个应答信号

1.4 I2C总线上数据读写的时机

当时钟线为高电平时,接收方可以读取数据

当时钟线为低电平时,发送方可以写入数据

1.5 i2c主机的读写时序(重点)

主机向从机发送一个字节数据

主机发起起始信号

主机发送7bit从机地址+1bit写标志位

从机回应应答信号

主机发送8bit寄存器地址

从机回应应答信号

主机发送8bit数据

从机回应应答信号

主机发起终止信号

主机向从机发送多个字节数据

主机发起起始信号

主机发送7bit从机地址+1bit写标志位

从机回应应答信号

主机发送8bit寄存器地址

从机回应应答信号

主机发送8bit数据

从机回应应答信号

.。。。。。

主机发起终止信号

主机读取从机一个字节数据

主机发起起始信号

主机发送7bit从机地址+1bit写标志

从机回应一个应答信号

主机发送8bit寄存器地址

从机回应一个应答信号

主机发起一个重复起始信号

主机发送7bit从机地址+1bit读标志位

从机回应应答信号

从机发送一个字节数据

主机回应非应答信号

主机发起终止信号

主机读取多个字节的时序

主机发起起始信号

主机发送7bit从机地址+1bit写标志

从机回应一个应答信号

主机发送8bit寄存器地址

从机回应一个应答信号

主机发起一个重复起始信号

主机发送7bit从机地址+1bit读标志位

从机回应应答信号

从机发送一个字节数据

主机回应回应应答信号

只要主机回应应答信号,从机就一直发,直到主机回应非应答信号

主机回应非应答信号

主机发起终止信号

2. I2C总线读取温湿度传感器数据实验

STM32MP157AAA读取SI7006数据框图

2.1查询SI7006数据手册

1.SI7006的从机地址

2.确定读取温度和湿度的对应寄存器地址

3.确定温度数据和湿度数据的字节数

4.如何初始化si7006芯片

5.如何将读取到的温湿度数据转换成标准温湿度形式

从机地址

读取温度和湿度数据的寄存器地址

读取湿度的寄存器地址是0XE5
读取温度的寄存器地址是0XE3
读取上一次测量的温度的寄存器地址是0XE0
完成SI7006芯片的初始化需要向用户写寄存器中写入一个数值,用户写寄存器地址是0XE6

主机保持模式下读取温湿度数据的时序

关于SI7006的初始化

完成SI7006的初始化,需要向用户写寄存器(0XE6)中写入一个0X3A

温湿度数据的计算公式

作业

设置温度湿度阈值,当温度过高时,打开风扇,蜂鸣器报警

当湿度比较高时,打开LED1灯,蜂鸣器报警

main.c

#include "uart4.h"

#include "led.h"

#include "key_in.h"

#include "iic.h"

#include "si7006.h"

 int main()

{   

    i2c_init();

	si7006_init();
	all_led_init();
	while(1)

	{

		short tem;

		unsigned short hum;

		tem=si7006_read_tem();

		hum=si7006_read_hum();

		hum=125*hum/65536-6;

        tem=175.72*tem/65536-46.85;

        printf("hum:%d\n",hum);

        printf("tem:%d\n",tem);


		if(tem>30)

		{

				fan_on();

		}else 

		{

			  fan_off();

		}

		

		if(hum>44)

		{

				bee_on();

		}else 

		{

			bee_off();

		}


		delay(1000);

		bee_off();


	}



	return 0;

}

si7600.c

#include "si7006.h"

void delay(int ms)
{
		int i,j;
	
	
	for(i=0;i<ms;i++)
	{
		for(j=0;j<2000;j++)
		{

		}
	}

}


void si7006_init()
{
  i2c_start();
  i2c_write_byte(0x40<<1|0);
  i2c_wait_ack();
  i2c_write_byte(0xe6);
  i2c_wait_ack();
  i2c_write_byte(0x3a);
  i2c_wait_ack();
  i2c_stop();
}

short si7006_read_tem()
{
  short tem;
  char tem_l,tem_h;
  i2c_start();
  i2c_write_byte(0x40<<1|0);
  i2c_wait_ack();
  i2c_write_byte(0xe3);
  i2c_wait_ack();
  i2c_start();
  i2c_write_byte(0x40<<1|1);
  i2c_wait_ack();
  delay(100);
  tem_h=i2c_read_byte(0);
  tem_l=i2c_read_byte(1);

  tem=tem_h<<8|tem_l;
  return tem;

}

unsigned short si7006_read_hum()
{
  short hum;
  char hum_l,hum_h;
  i2c_start();
  i2c_write_byte(0x40<<1|0);
  i2c_wait_ack();
  i2c_write_byte(0xe5);
  i2c_wait_ack();
  i2c_start();
  i2c_write_byte(0x40<<1|1);
  i2c_wait_ack();
  delay(100);
  hum_h=i2c_read_byte(0);
  hum_l=i2c_read_byte(1);

  hum=hum_h<<8|hum_l;
  return hum;

}

led.c

#include "led.h"

void all_led_init()
{
  RCC->MP_AHB4ENSETR |= (0x3<<4);


  //pe10 设置输出
  GPIOE->MODER &= (~(0x3 <<20));
  GPIOE->MODER |= (0x1 <<20);
  //pf10设置输出
  GPIOF->MODER &= (~(0x3 <<20));
  GPIOF->MODER |= (0x1 <<20);
  //pe8设置输出
  GPIOE->MODER &= (~(0x3 <<16));
  GPIOE->MODER |= (0x1 <<16);

  //蜂鸣器设置输出
  GPIOB->MODER &= (~(0x3 <<12));
  GPIOB->MODER |= (0x1 <<12);
  //风扇设置输出
  GPIOE->MODER &= (~(0x3 <<18));
  GPIOE->MODER |= (0x1 <<18);
  //马达设置输出
  GPIOF->MODER &= (~(0x3 <<12));
  GPIOF->MODER |= (0x1 <<12);

  //设置推挽
  GPIOE->OTYPER &= (~(0x1 <<10));
  GPIOF->OTYPER &= (~(0x1 <<10));
  GPIOE->OTYPER &= (~(0x1 <<8));

  //设置低速
  GPIOE->OSPEEDR &= (~(0x3 <<20));
  GPIOF->OSPEEDR &= (~(0x3 <<20));
  GPIOE->OSPEEDR &= (~(0x3 <<16));
  
  //设置无上拉下拉
  GPIOE->PUPDR &= (~(0x3 <<20));
  GPIOF->PUPDR &= (~(0x3 <<20));
  GPIOE->PUPDR &= (~(0x3 <<16));
  //默认输出低电平
  GPIOE->ODR &=(~(0x1 <<10));
  GPIOF->ODR &=(~(0x1 <<10));
  GPIOE->ODR &=(~(0x1 <<8));


}

void LED1_ON()
{
  GPIOE->ODR |=(0x1 <<10);

}

void LED2_ON()
{
  GPIOF->ODR |= (0x1 <<10);
}

void LED3_ON()
{
  GPIOE->ODR |=(0x1 <<8);
}

void LED1_OFF()
{
  GPIOE->ODR &=(~(0x1 <<10));
}

void LED2_OFF()
{
  GPIOF->ODR &=(~(0x1 <<10));
}

void LED3_OFF()
{
  GPIOE->ODR &=(~(0x1 <<8));
}

void bee_on()
{
  
  GPIOB->ODR |=(0x1 <<6);
}

void bee_off()
{
  GPIOB->ODR &=(~(0x1 <<6));
}

void fan_on()
{
  GPIOE->ODR |=(0x1 <<9);
}

void fan_off()
{
  GPIOE->ODR &=(~(0x1 <<9));
}

void motor_on()
{
  GPIOF->ODR |=(0x1 <<6);
}
void motor_off()
{
  GPIOF->ODR &=(~(0x1 <<6));
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【OpenModelica】1 OpenModelica项目架构

1 OpenModelica项目架构 文章目录 1 OpenModelica项目架构一、 架构总览图二、OpenModelica各部分作用 一、 架构总览图 OpenModelica 环境由几个相互连接的子系统组成&#xff0c;如图 1.1 所示。 其中包括&#xff1a; MDT Eclipse 插件图形模型编辑器/浏览器文本模型编辑器…

日本科技巨头富士通遭遇网络攻击,客户数据被窃

日本科技巨头富士通3月15日发布通告&#xff0c;宣称公司经历了一起网络攻击事件&#xff0c;客户个人数据已被黑客窃取。 富士通在一份通知中写道&#xff1a;“我们已经确认有几台商用计算机上存在恶意软件&#xff0c;并且经过我们的内部调查&#xff0c;发现包含个人信息和…

SAP前台处理:物料计价方式:价格控制与价格确定 - 02 <CKM3>

一、背景&#xff1a; 物料主数据中我们讲解到物料的计价方式&#xff0c;SAP应用到的主要计价方式有移动平均价和标准价格方式两种&#xff0c;但也有按照批次计价等方式&#xff0c;我们主要介绍最常用的V2移动平均价和S3的标准价格&#xff1b; 二、示例差异分析&#xff…

k8s入门到实战(二)—— windows安装minikube

minikube 安装 minikube 是一个用于在本地计算机上运行单个节点的 k8s 集群的工具。它允许开发人员可以在自己的计算机上进行本地的 k8s 开发和测试。通过minikube&#xff0c;您可以模拟一个完整的 k8s 集群环境&#xff0c;包括节点、Pod、服务和存储等组件。它是一个轻量级…

Xcode-双架构arm64 x86_64编译

要启用通用构建&#xff0c;在最新版本的 Xcode 中&#xff0c;请打开您的项目设置&#xff0c;然后依次选择&#xff1a; 1. “Build Settings” 选项卡。 2. 在顶部输入框中输入 “Architectures”。 3. 在 “Architectures” 下拉列表中选择 “Other”。 4. 在输入框中输入 …

代码随想录刷题day32|K次反转后最大的数组和加油站分发糖果

文章目录 day34学习内容一、K次反转后最大的数组和1.1、思路1.2、代码-正确写法1.2.1、如何理解if (k % 2 1) &#xff1f;1.2.2、原始nums数组[2,-3,-1,5,-4]&#xff0c;那么排序后数组等于什么&#xff1f; 二、加油站2.1、思路2.2、正确写法12.2.1、 如何理解上面这段代码…

数据可视化-ECharts Html项目实战(7)

在之前的文章中&#xff0c;我们学习了如何设置漏斗图、仪表盘。想了解的朋友可以查看这篇文章。同时&#xff0c;希望我的文章能帮助到你&#xff0c;如果觉得我的文章写的不错&#xff0c;请留下你宝贵的点赞&#xff0c;谢谢 数据可视化-ECharts Html项目实战&#xff08;6…

JavaScript 学习日记(1)---初识JavaScript

初识JavaScript 文章目录 初识JavaScript一、JavaScript 是什么?二、java 和JavaScript 的关系三、JavaScript 的组成四、JS的基本输入输出 ---> 单行注释五、js变量基本概念六、js基本数据类型七、js转义字符八、js类型转换九、运算符 END! 一、JavaScript 是什么? 我们…

FDGaussian:又快又好的三维重建方案 | Gaussian Splatting和扩散模型超强联合

项目地址&#xff1a;https://qjfeng.net/FDGaussian/ 文章链接&#xff1a;https://arxiv.org/pdf/2403.10242 本文介绍了一种名为FDGaussian的新型两阶段框架&#xff0c;用于单张图像的三维重建。最近的方法通常利用预先训练好的二维扩散模型从输入图像生成可能的新视图&…

DARTS-: ROBUSTLY STEPPING OUT OF PERFORMANCE COLLAPSE WITHOUT INDICATORS

DARTS-&#xff1a;增加辅助跳跃连接&#xff0c;鲁棒走出搜索性能崩溃 论文链接&#xff1a;https://arxiv.org/abs/2009.01027 项目链接&#xff1a;GitHub - Meituan-AutoML/DARTS-: Code for “DARTS-: Robustly Stepping out of Performance Collapse Without Indicators…

RAG笔记:常见问题以及解决方法

1 内容缺失 知识库中缺少必要的上下文信息。当知识库没有包含正确答案时&#xff0c;RAG 系统可能会给出一个貌似合理但实际上错误的回答&#xff0c;而不是明确表示它不知道答案。 1.1 解决方法 1.1.1 设置阈值 在回答问题前先设定一个质量标准。如果召回内容达不到标准或…

大数据Hadoop生态圈体系视频课程

课程介绍 熟悉大数据概念&#xff0c;明确大数据职位都有哪些&#xff1b;熟悉Hadoop生态系统都有哪些组件&#xff1b;学习Hadoop生态环境架构&#xff0c;了解分布式集群优势&#xff1b;动手操作Hbase的例子&#xff0c;成功部署伪分布式集群&#xff1b;动手Hadoop安装和配…

真假“长文本”,国产大模型混战

文&#xff5c;郝 鑫 Kimi有多火爆&#xff1f;凭一己之力搅乱A股和大模型圈。 Kimi概念股连日引爆资本市场&#xff0c;多个概念股随之涨停。在一片看好的态势中&#xff0c;谁都想来沾个边&#xff0c;据光锥智能不完全统计&#xff0c;目前&#xff0c;至少有包括读客…

(二)BSQ,BIL,BIP存储格式的相互转换算法

环境&#xff1a;Windows10专业版 IDEA2021.2.3 jdk11.0.1 GDAL(release-1928-x64-gdal-3-5-2-mapserver-8-0-0) 系列文章&#xff1a; &#xff08;一&#xff09;PythonGDAL实现BSQ&#xff0c;BIP&#xff0c;BIL格式的相互转换 &#xff08;二&#xff09;BSQ,BIL,BIP存…

【中间件】docker数据卷

&#x1f4dd;个人主页&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;中间件 ⛺️稳中求进&#xff0c;晒太阳 1.数据卷&#xff08;容器数据管理&#xff09; 修改nginx的html页面时&#xff0c;需要进入nginx内部。并且因为内部没有编辑器&#xff0c;修改…

手把手教集成环信新版UIKit组件,快速构建Android应用

前言 环信新版UIKit已重磅发布&#xff01;目前包含单群聊UIKit、聊天室ChatroomUIKit&#xff0c;本文详细讲解Android端单群聊UIKit的集成教程。 环信单群聊 UIKit 是基于环信即时通讯云 IM SDK 开发的一款即时通讯 UI 组件库&#xff0c;提供各种组件实现会话列表、聊天界…

网络编程(Internet)

网络编程三要素 在网络通信协议下&#xff0c;不同计算机上运行的程序&#xff0c;可以进行数据传输。 IP地址 要想让网络中的计算机能够互相通信&#xff0c;必须为每台计算机指定一个标识号&#xff0c;通过这个标识号来指定要接收数据的计算机和识别发送的计算机&#xf…

【超图 SuperMap3D】【基础API使用示例】54、超图SuperMap3D -鼠标左键拖拽绘制圆

前言 引擎下载地址&#xff1a;[添加链接描述](http://support.supermap.com.cn/DownloadCenter/DownloadPage.aspx?id2524) 通过左键按下拖拽的方式在地图上进行贴地的圆绘制 完整代码拷贝直接本地运行即可查看效果效果 核心代码 // 绘制圆形 function startDrawCircleHand…

探究橡胶手套与乳胶手套的区别及选择指南

在探寻手部防护的世界里&#xff0c;橡胶手套与乳胶手套各自闪耀着独特的光芒。然而&#xff0c;对于许多人来说&#xff0c;这两者之间的细微差异仍然笼罩在一层迷雾之中。本文将如同一盏明灯&#xff0c;照亮这片迷雾&#xff0c;为您提供一份详尽的选择指南。 首先&#xff…

高性价比 惠海MOS管选型推荐 30V60V100V150V NMOS管和PMOS管

mos管选型建议&#xff1a; 需要抗电流冲击的&#xff0c;普通逻辑开关或者工作频率很低比如50kHZ以内的&#xff0c;电流非常大的情况比如实际工作6A以上的话一般建议选择平面mos管。6A以内的应用&#xff0c;大电流沟槽型mos管即可。 需要高频开关&#xff0c;比如500kHZ以…