3.25号arm

这篇具有很好参考价值的文章主要介绍了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线由高电平向低电平的变化表示起始信号

3.25号arm,笔记

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

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

3.25号arm,笔记

应答信号和非应答信号

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

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

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

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

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

3.25号arm,笔记

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

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

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

3.25号arm,笔记

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

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

主机发起起始信号

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

从机回应应答信号

主机发送8bit寄存器地址

从机回应应答信号

主机发送8bit数据

从机回应应答信号

主机发起终止信号

3.25号arm,笔记

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

主机发起起始信号

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

从机回应应答信号

主机发送8bit寄存器地址

从机回应应答信号

主机发送8bit数据

从机回应应答信号

.。。。。。

主机发起终止信号

3.25号arm,笔记

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

主机发起起始信号

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

从机回应一个应答信号

主机发送8bit寄存器地址

从机回应一个应答信号

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

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

从机回应应答信号

从机发送一个字节数据

主机回应非应答信号

主机发起终止信号

3.25号arm,笔记

主机读取多个字节的时序

主机发起起始信号

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

从机回应一个应答信号

主机发送8bit寄存器地址

从机回应一个应答信号

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

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

从机回应应答信号

从机发送一个字节数据

主机回应回应应答信号

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

主机回应非应答信号

主机发起终止信号

3.25号arm,笔记

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

STM32MP157AAA读取SI7006数据框图

3.25号arm,笔记

2.1查询SI7006数据手册

1.SI7006的从机地址

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

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

4.如何初始化si7006芯片

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

从机地址

3.25号arm,笔记

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

3.25号arm,笔记

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

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

3.25号arm,笔记

关于SI7006的初始化

3.25号arm,笔记

3.25号arm,笔记

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

温湿度数据的计算公式

3.25号arm,笔记

3.25号arm,笔记

作业

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

当湿度比较高时,打开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文章来源地址https://www.toymoban.com/news/detail-853074.html

#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));
}

到了这里,关于3.25号arm的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • cmake工程出现CMake Error at /usr/local/share/cmake-3.25/Modules/CMakeDetermineCompilerId.cmake:739

    描述:ubuntu20.04在执行cmake -S . -B build时出现、 CMake Error at /usr/local/share/cmake-3.25/Modules/CMakeDetermineCompilerId.cmake:739 (message):   Compiling the CUDA compiler identification source file   \\\"CMakeCUDACompilerId.cu\\\" failed.   Compiler: /usr/bin/nvcc   Build flags:   Id flags: --keep;--keep-dir;tmp -v      The output was:  

    2024年04月17日
    浏览(88)
  • ARM学习(25)链接装载高阶认识

    ARM学习(25)链接装载高阶认识 笔者先引入几个编译链接的例子来介绍一下: 声明无效:declared implicitly?,属于编译错误还是链接错误? 编译阶段的错误 ,属于编译错误,因为编译器发现这个函数没有声明,声明异常 标识符/符号找不到:xxxx is undefined? undefined xxxxx? 无法解

    2024年03月27日
    浏览(43)
  • 实训笔记8.25

    将海量的数据通过某种技术采集到大数据环境中进行存储和管理,为后期的大数据处理分析做准备 常见的数据:网站/软件的运行日志、记录的日志,软件的结构化数据、爬虫数据、传感器采集数据… Flume是apache开源的顶尖项目,专门是采集和聚合海量的日志数据。但是随着

    2024年02月11日
    浏览(35)
  • 企业架构LNMP学习笔记25

    高可用服务搭建: HA高可用:是一个解决方案。 高可用HA(High Availability) 是 分布式系统架构中必须考虑的因素 之一。 它通常是指通过设计,减少系统服务不可用的时间 ,假设系统一直能够提供服务,我们说系统的可用性是100%,如果系统每运行一个100个时间单位,会有一

    2024年02月09日
    浏览(40)
  • WPF实战学习笔记25-首页汇总

    注意:本实现与视频不一致。本实现中单独做了汇总接口,而视频中则合并到国todo接口当中了。 添加汇总webapi接口 添加汇总数据客户端接口 总数据客户端接口对接3 首页数据模型 添加数据汇总字段类 新建文件MyToDo.Share.Models.SummaryDto 添加汇总webapi接口 添加汇总接口 添加文

    2024年02月15日
    浏览(37)
  • effective c++ 笔记 条款18-25

    使用外覆类型(wrapper)提醒调用者传参错误检查,将参数的附加条件限制在类型本身 三个参数类型相同的函数容易造成误用 导入新的类型 限制取值 从语法层面限制调用者不能做的事 operate*的返回类型上加上const修饰,防止无意的错误赋值if (a * b = c) 接口应表现出与内置类型

    2024年02月21日
    浏览(43)
  • 刷题笔记25——图论课程表

    为了最终理解你所不理解的,你必须经历一条愚昧无知的道路。为了占有你从未占有的东西,你必须经历被剥夺的道路。为了达到你现在所不在的名位,你必须经历那条你不在其中的道路。——艾略特 非常奇妙,我最初的错误是如下,在找到目标节点后直接加入到res中,但是

    2024年02月07日
    浏览(39)
  • openGauss学习笔记-25 openGauss 聚集函数

    25.1 sum(expression) 描述:所有输入行的expression总和。 返回类型: 通常情况下输入数据类型和输出数据类型是相同的,但以下情况会发生类型转换: 对于SMALLINT或INT输入,输出类型为BIGINT。 对于BIGINT输入,输出类型为NUMBER 。 对于浮点数输入,输出类型为DOUBLE PRECISION。 示例:

    2024年02月14日
    浏览(37)
  • 【云开发笔记NO.25】缓存和技术中台

    在云开发领域中,缓存技术是一项至关重要的技术,它具有多个特征和广泛的应用。缓存技术的核心原理是将经常访问或需要快速响应的数据存储在更接近用户或请求源的地方,以便能够更快地提供这些数据,减少对原始数据源(如数据库或远程服务器)的频繁访问。 缓存技

    2024年04月14日
    浏览(35)
  • Linux shell编程学习笔记25:tty

    在 1830 年代和 1840 年代,开发了称为电传打字机(teletypewriters)的机器,这些机器可以将发件人在键盘上输入的消息“沿着线路”发送在接收端并打印在纸上。 电传打字机的名称由teletypewriters, 缩短为teletypes,并最终缩短为 TTY。 电传打字机:teletypewriters →  teletypes → t

    2024年02月05日
    浏览(55)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包