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

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

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

相关文章

Golang安装

目录 Go安装下载安装Go Go安装 下载安装Go 地址&#xff1a;https://studygolang.com/dl 1、根据系统来选择下载包。 2、我是Window&#xff0c;所以直接下载windows的安装包来安装。 3、在控制台窗口输入“go version”可查看Go版本&#xff0c;检测是否安装成功。 4、配置…

ansible-playbook roles模块编写lnmp剧本

目录 一&#xff1a;集中式编写lnmp剧本 二&#xff1a;分布式安装lnmp 1、nginx 配置 2、mysql配置 3、php配置 4、运行剧本 一&#xff1a;集中式编写lnmp剧本 vim /etc/ansible/lnmp.yml- name: lnmp playhosts: dbserversremote_user: roottasks:- name: perpare condif…

Hadoop_HDFS_常见的文件组织格式与压缩格式

参考资料 1. HDFS中的常用压缩算法及区别_大数据_王知无_InfoQ写作社区 2. orc格式和parquet格式对比-阿里云开发者社区 3.Hadoop 压缩格式 gzip/snappy/lzo/bzip2 比较与总结 | 海牛部落 高品质的 大数据技术社区 4. Hive中的文件存储格式TEXTFILE、SEQUENCEFILE、RCFILE…

【Windows11】家庭版开启组策略指南

目录 背景新建一个cmd文件运行运行结果 背景 Win11找不到gpedit.msc怎么办&#xff1f;有用户通过命令窗口想要去打开本地组策略的时候&#xff0c;系统突然弹出了一个错误提示&#xff0c;显示系统缺少了gpedit.msc导致无法开启本地组策略编辑器了。那么这个情况要怎么去进行…

计算机网络

一&#xff0c;数据通信基础 1&#xff0c;通信方式 单工、半双工、双工 2&#xff0c;信号和数据 2种信号&#xff1a;正弦波&#xff08;模拟信号&#xff09;、光波&#xff08;数字信号&#xff09; 正弦波数字数据&#xff1a;3种调制方式&#xff08;调幅&#xff0…

边听歌边充电LDR6028+LDR9201既能充电又能OTG方案

随着type-c接口的普及&#xff0c;市面上的手机&#xff0c;平板&#xff0c;笔电逐渐都采用了type-c接口&#xff0c;设备为了不断的追求更轻薄的机身和防水要求慢慢的取消了一些影响手机外观完整性的接口&#xff0c;比如3.5mm耳机孔。 有线耳机用户一般会选择使用C口转3.5m…

[自然语言处理] 自然语言处理库spaCy使用指北

spaCy是一个基于Python编写的开源自然语言处理库。基于自然处理领域的最新研究&#xff0c;spaCy提供了一系列高效且易用的工具&#xff0c;用于文本预处理、文本解析、命名实体识别、词性标注、句法分析和文本分类等任务。 spaCy的官方仓库地址为&#xff1a;spaCy-github。本…

nest的核心概念

请求进来 --- 中间件 --- 守卫 --- 拦截器 --- 通道 --- 处理&#xff08;controller层&#xff09; --- 拦截器 --- 返回 Pipe &#xff1a; 就是实现 PipeTransform 接口的 transform 方法&#xff0c;它的返回值就是传给 handler 的值。 ---------------------------------…

C计数问题---2023河南萌新联赛第(三)场:郑州大学

解析&#xff1a; n 可以分成两个数&#xff0c;记录每个数的因子对数&#xff0c;乘起来即可。 注意当因子相同时&#xff0c;只1 #include<bits/stdc.h> using namespace std; int n,res; int main(){cin>>n;for(int i1;i<n;i){int xi,yn-i;int cnt10,cnt20;…

Windows10系统还原操作

哈喽&#xff0c;大家好&#xff0c;我是雷工&#xff01; 复制了下虚拟机的Win10系统&#xff0c;但其中有一些软件&#xff0c;想实现类似手机的格式化出厂操作&#xff0c;下面记录Windows10系统的还原操作。 一、系统环境&#xff1a; 虚拟机内的Windows10&#xff0c;64…

软件测试面试题:说说你对TDD测试驱动开发的理解?

很多公司在面测试中高级岗时&#xff0c;都会不同程度地问到“有没有了解过TDD”“你认为TDD可以解决什么问题”或者“说说测试驱动开发的流程”等等&#xff0c;即使公司并不会用到此开发流程&#xff0c;面试官也会通过你对这个相对还比较“陌生”的概念的讲述来了解你对一些…

测试libcurl库的demo时,报错 curl_easy_perform() failed: SSL connect error

系统&#xff1a;麒麟V10 arm roothg-TR3250:/home/cur765/curl-7.65.3/docs/examples# cat /etc/os-release NAME"Kylin" VERSION"银河麒麟桌面操作系统(国防版)V10" VERSION_US"Kylin Linux Desktop (GFB)V10" IDkylin ID_LIKEdebian PRETT…

计算机视觉:卷积层的参数量是多少?

本文重点 卷积核的参数量是卷积神经网络中一个重要的概念,它决定了网络的复杂度和计算量。在深度学习中,卷积操作是一种常用的操作,用于提取图像、语音等数据中的特征。卷积神经网络的优势点在于稀疏连接和权值共享,这使得卷积核的参数相较于传统的神经网络要少很多。 举例…

NICE-SLAM: Neural Implicit Scalable Encoding for SLAM论文阅读

论文信息 标题&#xff1a;NICE-SLAM: Neural Implicit Scalable Encoding for SLAM 作者&#xff1a;Zihan Zhu&#xff0c; Songyou Peng&#xff0c;Viktor Larsson — Zhejiang University 来源&#xff1a;CVPR 代码&#xff1a;https://pengsongyou.github.io/nice-slam…

ES-5-进阶

单机 & 集群 单台 Elasticsearch 服务器提供服务&#xff0c;往往都有最大的负载能力&#xff0c;超过这个阈值&#xff0c;服务器 性能就会大大降低甚至不可用&#xff0c;所以生产环境中&#xff0c;一般都是运行在指定服务器集群中 配置服务器集群时&#xff0c;集…

OpenAI宣布安卓版ChatGPT正式上线;一站式 LLM底层技术原理入门指南

&#x1f989; AI新闻 &#x1f680; OpenAI宣布安卓版ChatGPT正式上线 摘要&#xff1a;OpenAI今日宣布&#xff0c;安卓版ChatGPT已正式上线&#xff0c;目前美国、印度、孟加拉国和巴西四国的安卓用户已可在谷歌Play商店下载&#xff0c;并计划在下周拓展到更多地区。Chat…

linux快速安装tomcat

linux快速安装tomcat 前提安装好jdk 下载Tomcat安装包 wget https://dlcdn.apache.org/tomcat/tomcat-10/v10.0.27/bin/apache-tomcat-10.0.27.tar.gz如果出现颁发的证书已经过期的错误提示,用下面命令 wget --no-check-certificate https://dlcdn.apache.org/tomcat/tomcat-1…

web浏览器脚本的调试

水一贴。 在浏览器中按F12点击"source"或者"源程序"点击html、js、css等源码文件所在的窗口的左边&#xff0c;此时点击处显示为蓝色光标&#xff0c;表示断点中断已经设置完毕。配合窗口右上角的"继续" “下一步” "跳过"等控制按钮…

android stduio 打开工程后直接报Connection refused解决

报错如下:Connection refused 解决方案: 打开gradle-wrapper.properties修改distributionUrl 将: distributionUrlhttp\://localhost/gradle/distributions/gradle-6.5-bin.zip 替换为: distributionUrlhttps\://services.gradle.org/distributions/gradle-6.5-bin.zip 错…

【外卖系统】文件上传与下载

文件上传 文件上传又称upload&#xff0c;将本地图片、视频等文件上传到服务器上&#xff0c;供其他用户下载或者浏览。 form表单&#xff1a;HTML中的form元素用于创建一个包含表单字段的区域&#xff0c;用户可以在该区域输入数据&#xff0c;并通过提交表单将数据发送到服务…