当前位置: 首页 > news >正文

Linux 学习记录59(ARM篇)

Linux 学习记录59(ARM篇)

在这里插入图片描述

本文目录

  • Linux 学习记录59(ARM篇)
  • 一、IIC总线
    • 1. 概念
    • 2. IIC总线硬件连接
  • 二、系统框图
  • 三、IIC时序
    • 1. 起始信号 / 停止信号
    • 2. 数据传输信号
    • 3. 应答信号 / 非应答信号
    • 4. 寻址信号
  • 四、IIC协议
    • 1. 主机给从机发送一个字节(写)
    • 2. 主机给从机发送多个连续字节
    • 3. 从机给主机发送一个字节(读)
    • 4. 从机给主机发送多个连续字节
  • 五、软件模拟IIC
    • 1. IIC的GPIO初始化
    • 2. 宏定义及函数声明
    • 3. 切换SDA的GPIO模式
    • 4. 起始信号
    • 5. 停止信号
    • 6. 等待应答信号
    • 7. ACK应答
    • 8. 发送/读取一个字节

一、IIC总线

1. 概念

  1. I2C总线是PHLIPS公司在八十年代初推出的一种串行半双工同步总线,主要用于连接整体电路
  1. 两个芯片之间通讯 SOC(stm32mp157a)<------- IIC总线 ------->温湿度传感器(si7006)
  2. 两个设备之间通讯 PC<------ UART总线 ------>开发板
  1. I2C总线为两线制,只有两根双向信号线,一根是数据线SDA,另一根是时钟线SCL
  1. SDA数据线作用:完成数据传输
  2. SCL时钟线作用:完成数据收发同步
  1. IIC传输速率
  1. 低速:100K
  2. 中速:400K
  3. 高速:3.4M
  1. I2C硬件结构简单,接口连接方便,成本较低。因此在各个领域得到了广泛的应用
  2. 、IIC总线外接两个上拉电阻作用:在总线处于空闲状态时,SCL线和SDA线处于高电平状态

在这里插入图片描述

2. IIC总线硬件连接

在这里插入图片描述

1. IIC总线支持多主机多从机模式,在同一时刻,只能与一个从机进行通讯
2. 在实际使用过程中,大多数都使用单主机多从机模式
3. 挂接到IIC总线上的每个从机设备,都有自己唯一的7位从机地址(从对应的芯片手册中进行查找从机地址)
4. 主动发起数据的叫做主机(起始信号),只能被动接收数据的叫做从机
5. 在总线上,发送数据叫做发送器,接收数据的叫做接收器
6. 起始信号、时钟信号、停止信号都是由主机产生
7. 时钟信号只能由主机产生,作用给从机,完成数据收发同步

二、系统框图

在这里插入图片描述

三、IIC时序

1. 起始信号 / 停止信号

在这里插入图片描述

1、起始信号:在SCL为高电平期间,SDA从高到低的变化(下降沿)
2、停止信号:在SCL为高电平期间,SDA从低到高的变化(上升沿)
3、起始信号和停止信号由主机产生
4、起始信号产生之后,总线处于占用状态
5、停止信号产生之后,总线处于空闲状态

2. 数据传输信号

在这里插入图片描述

1、在SCL为高电平期间,数据线上数据保持稳定,接收器从数据线上读取数据
2、在SCL为低电平期间,数据线上数据允许发生变化,发送器向数据线上写入数据

3. 应答信号 / 非应答信号

在这里插入图片描述

1、每一个字节必须保证是8位长度,数据传输时,先传送最高位,在传送低位每一个被传送的字节后面都必须跟随一位应答位,一帧数据 = 8位数据位 + 1位应答位 = 92、发送器在发送完8位数据之后,接收器在第九个时钟周期,返回一个应答信号(0)/非应答信号(1)
第九个时钟周期,接收器向数据线上写入应答/非应答信号
第九个时钟周期,发送器从数据线上读
读0:应答信号
读1:非应答信号

4. 寻址信号

在这里插入图片描述

1、IIC总线上数据传输是广义的,包括从机地址,传输数据信号
2、在起始信号产生之后,寻址从机,需要发送7位从机地址 +(1)/(0)
3、从总线上读取数据:7位从机地址 +(1)
4、向总线上写入数据:7位从机地址 +(0)

四、IIC协议

1. 主机给从机发送一个字节(写)

主机作为 “发送器” 从机作为“接收器”

在这里插入图片描述

IIC_Start();//起始信号
/*add_RH 为从机地址例如0x40 或上0表示要写入数据*/
IIC_Send_Byte((add_RH << 1) | 0);//发送从机地址
IIC_Wait_Ack();//等待回应
/*USER_W表示要写入的寄存器或命令*/
IIC_Send_Byte(USER_W);//发送从机地址
IIC_Wait_Ack();//等待回应
/*start_M表示要写入该寄存器的数据*/
IIC_Send_Byte(start_M);//发送从机地址
IIC_Wait_Ack();//等待回应
IIC_Stop();

2. 主机给从机发送多个连续字节

每发送一个8位数据后寄存器地址自动偏移
在这里插入图片描述

3. 从机给主机发送一个字节(读)

在这里插入图片描述

uint8_t buf;
IIC_Start();//起始信号
/*add_RH 为从机地址例如0x40 或上0表示要写入数据*/
IIC_Send_Byte(add_RH << 1);//发送从机地址
IIC_Wait_Ack();//等待回应
/*USER_R表示要读取的寄存器或命令*/
IIC_Send_Byte(USER_R);//发送从机命令
IIC_Wait_Ack();//等待回应
/*从机开始作为发送方*/
IIC_Start();//起始信号
/*add_RH 为从机地址例如0x40 或上1表示要读取数据*/
IIC_Send_Byte((add_RH << 1) |1);//发送从机地址
IIC_Wait_Ack();//等待回应
/*IIC_R_NACK 表示不读取后续数据*/
buf= IIC_Read_Byte(IIC_R_NACK);//IIC读取一个字节
IIC_Stop();

4. 从机给主机发送多个连续字节

在这里插入图片描述

五、软件模拟IIC

1. IIC的GPIO初始化

//初始化IIC
void IIC_Init(void)
{			GPIO_InitTypeDef  GPIO_InitStructure;RCC_MP_AHB4_ENSETR |= (0x1 << 1);//使能GPIO F-E时钟;//使能GPIOB时钟//GPIOB8,B9初始化设置GPIO_InitStructure.GPIO_Pin = IIC_SCL_Pin;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//普通输出模式GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Fast_Speed;//100MHzGPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉GPIO_Init(IIC_GPIOx, &GPIO_InitStructure);//初始化GPIO_InitStructure.GPIO_Pin = IIC_SDA_Pin;GPIO_Init(IIC_GPIOx, &GPIO_InitStructure);//初始化IIC_SCL_H;//将时钟线和数据线拉高IIC_SDA_H;
}

2. 宏定义及函数声明

#define IIC_GPIOx GPIOF#define IIC_R_ACK 1
#define IIC_R_NACK 0#define IIC_SCL_Pin 14
#define IIC_SDA_Pin 15#define IIC_SCL_H   GPIO_SetBits(IIC_GPIOx,IIC_SCL_Pin)
#define IIC_SDA_H   GPIO_SetBits(IIC_GPIOx,IIC_SDA_Pin)#define IIC_SCL_L   GPIO_ResetBits(IIC_GPIOx,IIC_SCL_Pin)
#define IIC_SDA_L   GPIO_ResetBits(IIC_GPIOx,IIC_SDA_Pin)#define READ_SDA	GPIO_ReadInputDataBit(IIC_GPIOx,IIC_SDA_Pin)//IIC所有操作函数
void IIC_Init(void);                //初始化IIC的IO口				 
void IIC_Start(void);				//发送IIC开始信号
void IIC_Stop(void);	  			//发送IIC停止信号
void IIC_Send_Byte(uint8_t txd);			//IIC发送一个字节
uint8_t IIC_Read_Byte(unsigned char ack);//IIC读取一个字节
uint8_t IIC_Wait_Ack(void); 				//IIC等待ACK信号
void IIC_Ack(void);					//IIC发送ACK信号
void IIC_NAck(void);				//IIC不发送ACK信号

3. 切换SDA的GPIO模式

void SDA_OUT(void)
{GPIO_InitTypeDef  GPIO_InitStructure;//GPIOB8,B9初始化设置GPIO_InitStructure.GPIO_Pin = IIC_SDA_Pin;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//普通输出模式GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Fast_Speed;//100MHzGPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉GPIO_Init(IIC_GPIOx, &GPIO_InitStructure);//初始化
}void SDA_IN(void)
{GPIO_InitTypeDef  GPIO_InitStructure;//GPIOB8,B9初始化设置GPIO_InitStructure.GPIO_Pin = IIC_SDA_Pin;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;//普通输出模式GPIO_Init(IIC_GPIOx, &GPIO_InitStructure);//初始化
}

4. 起始信号

//产生IIC起始信号
void IIC_Start(void)
{SDA_OUT();     //sda线输出IIC_SDA_H;IIC_SCL_H;delay_us(4);IIC_SDA_L;//START:when CLK is high,DATA change form high to low delay_us(4);IIC_SCL_L;//钳住I2C总线,准备发送或接收数据 
}

5. 停止信号

//产生IIC停止信号
void IIC_Stop(void)
{SDA_OUT();//sda线输出IIC_SCL_L;IIC_SDA_L;//STOP:when CLK is high DATA change form low to highdelay_us(4);IIC_SCL_H;IIC_SDA_H;//发送I2C总线结束信号delay_us(4);							   	
}

6. 等待应答信号

//等待应答信号到来
//返回值:1,接收应答失败
//        0,接收应答成功
uint8_t IIC_Wait_Ack(void)
{uint8_t ucErrTime=0;SDA_IN();      //SDA设置为输入  IIC_SDA_H;delay_us(1);	   IIC_SCL_H;delay_us(1);	 while(READ_SDA){ucErrTime++;if(ucErrTime>250){IIC_Stop();return 1;}}IIC_SCL_L;//时钟输出0 	   return 0;  
}

7. ACK应答

//产生ACK应答
void IIC_Ack(void)
{IIC_SCL_L;SDA_OUT();IIC_SDA_L;delay_us(2);IIC_SCL_H;delay_us(2);IIC_SCL_L;
}
//不产生ACK应答		    
void IIC_NAck(void)
{IIC_SCL_L;SDA_OUT();IIC_SDA_L;delay_us(2);IIC_SCL_H;delay_us(2);IIC_SCL_L;
}

8. 发送/读取一个字节

//IIC发送一个字节
//返回从机有无应答
//1,有应答
//0,无应答			  
void IIC_Send_Byte(uint8_t txd)
{                        uint8_t t;   SDA_OUT(); 	    IIC_SCL_L;//拉低时钟开始数据传输for(t=0;t<8;t++){if((txd&0x80)>>7){IIC_SDA_H;}else{IIC_SDA_L;}txd<<=1; 	  delay_us(2);   //对TEA5767这三个延时都是必须的IIC_SCL_H;delay_us(2); IIC_SCL_L;	delay_us(2);}	 
} 	    
//读1个字节,ack=1时,发送ACK,ack=0,发送nACK   
uint8_t IIC_Read_Byte(unsigned char ack)
{unsigned char i,receive=0;SDA_IN();//SDA设置为输入for(i=0;i<8;i++ ){IIC_SCL_L; delay_us(2);IIC_SCL_H;receive<<=1;if(READ_SDA)receive |= 1;   else receive |= 0; delay_us(1); }					 if (!ack)IIC_NAck();//发送nACKelseIIC_Ack(); //发送ACK   return receive;
}

相关文章:

Linux 学习记录59(ARM篇)

Linux 学习记录59(ARM篇) 本文目录 Linux 学习记录59(ARM篇)一、IIC总线1. 概念2. IIC总线硬件连接 二、系统框图三、IIC时序1. 起始信号 / 停止信号2. 数据传输信号3. 应答信号 / 非应答信号4. 寻址信号 四、IIC协议1. 主机给从机发送一个字节(写)2. 主机给从机发送多个连续字…...

TypeScript -- 函数

文章目录 TypeScript -- 函数JS -- 函数的两种表现形式函数声明函数的表达式es6 箭头函数 TS -- 定义一个函数TS -- 函数声明使用接口(定义)ts 定义参数可选参数写法 -- ?的使用TS函数 -- 设置剩余参数函数重载 TypeScript – 函数 JS – 函数的两种表现形式 我们熟知js有两…...

网页开发基础——HTML

一、flask框架 Flask是一种轻量级的Python web应用程序框架&#xff0c;可以帮助使用者快速构建Web应用程序和API。由于其简洁、灵活和易于上手的特点&#xff0c;Flask被广泛用于开发小型到中型的Web应用程序和后端API。本次我们主要是使用flask框架&#xff0c;进行一个小型w…...

C# 继承,封装,多态等知识点

一&#xff1a;面向对象的三大特征&#xff1a;继承性&#xff0c;封装性&#xff0c;多态性 1&#xff1a;继承性&#xff1a;继承主要描述是类与类之间的关系&#xff0c;通过继承可以在无需重新编写原有的类的情况下&#xff0c;对原有的类的功能进行扩展。 2&#xff1a;封…...

决策树概述

文章目录 决策树介绍1.介绍**决策树API:**构建决策树的三个步骤决策树的优缺点通过sklearn实现决策树分类并进一步认识决策树2. ID3 决策树1. 信息熵2. 信息增益**定义:****根据信息增益选择特征方法是:****算法:**3. ID3算法步骤4. 例子:3. C4.5 决策树1. 信息增益率计算…...

青枫壁纸小程序V1.4.0(后端SpringBoot)

引言 那么距离上次的更新已经过去了5个多月&#xff0c;期间因为忙着毕业设计的原因&#xff0c;更新的速度变缓了许多。所以&#xff0c;这次的更新无论是界面UI、用户功能、后台功能都有了非常大的区别。希望这次更新可以给用户带来更加好的使用体验 因为热爱&#xff0c;更…...

Error: unknown flag: --export 【k8s,kubernets报错】

报错情况如下&#xff1a; [rootk8smaster ~]# kubectl get deploy nginx -oyaml --export > my2.yaml Error: unknown flag: --export See kubectl get --help for usage.原因&#xff1a; --export在所使用的版本中已被移除 解决&#xff1a;去除--export即可&#xff0c…...

进入linux系统中修改网段-ip

第一步 &#xff1a;开启虚拟机 cd 到 /etc/sysconfig/network-scripts 目录下&#xff0c;输入命令给ls,展示这个目录下文件和文件夹 第二步&#xff1a;进入到以ifcfg开头的文件 # ifcfg开头的文件&#xff0c;如果有多个网卡&#xff0c;有多个ifcfg-ensxx文件 命令…...

通过REST API接口上传Nexus仓库

一、Nexus API文档 API文档链接&#xff1a;Components API 二、上传API接口说明 在Nexus中可以直接调试api接口&#xff0c;url参考&#xff1a;http://localhost:8081/#admin/system/api 三、上传请求案例 $ curl -X POST "http://localhost:8081/service/rest/v1/c…...

Docker镜像端口映射简介及配置指南

目录 引言&#xff1a;什么是端口映射&#xff1f;配置端口映射的步骤&#xff1a;1. 创建Docker镜像&#xff1a;2. 选择要映射的端口&#xff1a;3. 运行容器并进行端口映射&#xff1a;4. 验证端口映射&#xff1a; 示例&#xff1a;结论&#xff1a; 引言&#xff1a; Doc…...

Excel双向柱状图的绘制

Excel双向柱状图在绘制增减比较的时候经常用到&#xff0c;叫法繁多&#xff0c;双向柱状图、上下柱状图、增减柱状图都有。 这里主要介绍一下Excel的基础绘制方法和复杂一点的双向柱状图的绘制 基础双向柱状图的绘制 首先升降的数据如下&#xff1a; 月份上升下降20220359-…...

Linux6.17 Docker 安全及日志管理

文章目录 计算机系统5G云计算第四章 LINUX Docker 安全及日志管理一、Docker 容器与虚拟机的区别1.隔离与共享2.性能与损耗 二、Docker 存在的安全问题1.Docker 自身漏洞2.Docker 源码问题 三、Docker 架构缺陷与安全机制1.容器之间的局域网攻击2.DDoS 攻击耗尽资源3.有漏洞的系…...

学好Elasticsearch系列-索引的CRUD

本文已收录至Github&#xff0c;推荐阅读 &#x1f449; Java随想录 文章目录 创建索引删除索引查询数据添加 & 更新数据cat命令公共参数 常用命令aliases 显示别名allocation 显示每个节点的分片数和磁盘使用情况count 显示整个集群或者索引的文档个数fielddata 显示每个节…...

Python - OpenCV机器视觉库的简单使用经验

OpenCV是一个开源的计算机视觉库&#xff0c;它支持多种编程语言&#xff0c;包括Python。下面是Python 3中OpenCV的详细解析&#xff1a; 安装OpenCV 在Python 3中安装OpenCV&#xff0c;可以使用pip命令来安装。例如&#xff0c;在终端中输入以下命令&#xff1a; pip ins…...

【计算机网络 01】说在前面 信息服务 因特网 ISP RFC技术文档 边缘与核心 交换方式 定义与分类 网络性能指标 计算机网络体系结构 章节小结

第一章--概述 说在前面1.1 计算机网络 信息时代作用1.2 因特网概述1.3 三种交换方式1.4 计算机网络 定义与分类1.5 计算机网络的性能指标1.6 计算机网络体系结构1 常见的计算机网络体系结构2 计算机网络体系结构分层的必要性3 计算机网络体系结构分层思想举例4 计算机网络体系结…...

POI信息点的diPointX、diPointY转化成经纬度

需求&#xff1a;接口返回某个地点的数据&#xff08;diPointX、diPointY&#xff09;&#xff0c;前端需把该地点转化成经纬度形式在地图上进行Marker标记。 实现&#xff1a;&#xff08;查找百度地图开发文档&#xff09; 代码验证&#xff1a; console.log(new BMap.Merca…...

虚拟机(VMware)安装Linux(Ubuntu)安装教程

清华大学开源网站镜像站网址&#xff1a;清华大学开源软件镜像站 | Tsinghua Open Source Mirror 进入之后在搜索框中搜索“ubuntu” 直接点击箭头所指的蓝色字体“ubuntu-20.04.1-desktop-amd64.iso”即可下载...

linux系统下(centos7.9)安装Jenkins全流程

一、卸载历史版本 # rpm卸载 rpm -e jenkins# 检查是否卸载成功 rpm -ql jenkins# 彻底删除残留文件 find / -iname jenkins | xargs -n 1000 rm -rf二、环境依赖安装 yum -y install epel-releaseyum -y install daemonize三、安装Jenkins Jenkins官网传送带&#xff1a; …...

Java版知识付费源码 Spring Cloud+Spring Boot+Mybatis+uniapp+前后端分离实现知识付费平台

提供职业教育、企业培训、知识付费系统搭建服务。系统功能包含&#xff1a;录播课、直播课、题库、营销、公司组织架构、员工入职培训等。 提供私有化部署&#xff0c;免费售后&#xff0c;专业技术指导&#xff0c;支持PC、APP、H5、小程序多终端同步&#xff0c;支持二次开发…...

[OnWork.Tools]系列 01-简介

说明 OnWork.Tools 是基于 Net6 的桌面程序。支持Windows7SP1及以上系统&#xff0c;主要是日常办公或者是开发工作过程中常用的工具集合。界面使用WPF Mvvm模式开发&#xff0c;目的是将开源项目中&#xff0c;好用的项目集成到一起&#xff0c;方便大家使用和学习。 功能 …...

大数据学习栈记——Neo4j的安装与使用

本文介绍图数据库Neofj的安装与使用&#xff0c;操作系统&#xff1a;Ubuntu24.04&#xff0c;Neofj版本&#xff1a;2025.04.0。 Apt安装 Neofj可以进行官网安装&#xff1a;Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...

SkyWalking 10.2.0 SWCK 配置过程

SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外&#xff0c;K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案&#xff0c;全安装在K8S群集中。 具体可参…...

从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路

进入2025年以来&#xff0c;尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断&#xff0c;但全球市场热度依然高涨&#xff0c;入局者持续增加。 以国内市场为例&#xff0c;天眼查专业版数据显示&#xff0c;截至5月底&#xff0c;我国现存在业、存续状态的机器人相关企…...

ESP32读取DHT11温湿度数据

芯片&#xff1a;ESP32 环境&#xff1a;Arduino 一、安装DHT11传感器库 红框的库&#xff0c;别安装错了 二、代码 注意&#xff0c;DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...

华为OD机试-食堂供餐-二分法

import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...

微信小程序云开发平台MySQL的连接方式

注&#xff1a;微信小程序云开发平台指的是腾讯云开发 先给结论&#xff1a;微信小程序云开发平台的MySQL&#xff0c;无法通过获取数据库连接信息的方式进行连接&#xff0c;连接只能通过云开发的SDK连接&#xff0c;具体要参考官方文档&#xff1a; 为什么&#xff1f; 因为…...

select、poll、epoll 与 Reactor 模式

在高并发网络编程领域&#xff0c;高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表&#xff0c;以及基于它们实现的 Reactor 模式&#xff0c;为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。​ 一、I…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

Java毕业设计:WML信息查询与后端信息发布系统开发

JAVAWML信息查询与后端信息发布系统实现 一、系统概述 本系统基于Java和WML(无线标记语言)技术开发&#xff0c;实现了移动设备上的信息查询与后端信息发布功能。系统采用B/S架构&#xff0c;服务器端使用Java Servlet处理请求&#xff0c;数据库采用MySQL存储信息&#xff0…...

现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?

现有的 Redis 分布式锁库&#xff08;如 Redisson&#xff09;相比于开发者自己基于 Redis 命令&#xff08;如 SETNX, EXPIRE, DEL&#xff09;手动实现分布式锁&#xff0c;提供了巨大的便利性和健壮性。主要体现在以下几个方面&#xff1a; 原子性保证 (Atomicity)&#xff…...