嵌入式培训机构四个月实训课程笔记(完整版)-Linux ARM驱动编程第四天-ARM Linux编程之IIC与uart (物联技术666)

链接:https://pan.baidu.com/s/1V0E9IHSoLbpiWJsncmFgdA?pwd=1688
提取码:1688

教学内容:

1I2C总线:

I2C(Inter-Integrated Circuit),PHILIPS公司开发的两线式半双工同步串行总线;可以用来连接存储器(EEPROM、FLASH)、A/D、D/A转换器、LCD驱动器、传感器等等。

I2C总线有两根信号线:双向数据线(SDA)、时钟线(SCL)。均为双向I/O线,通过上拉电阻接正电源;I2C总线可以连接多个设备,各设备的数据和时钟线均连到SDA、SCL信号线上,主机通过设备地址来区分具体的设备,每个设备有唯一的地址(7位或10位)。

起始和终止信号:

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

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

起始和终止信号都是由主机发出的,在起始信号产生后,总线就处于被占用的状态;在终止信号产生后,总线就处于空闲状态。连接到I2C总线上的器件,若具有I2C总线的硬件接口,则很容易检测到起始和终止信号。对于不具备I2C总线硬件接口的有些单片机来说,为了检测起始和终止信号,必须保证在每个时钟周期内对数据线SDA采样两次。接收器件收到一个完整的数据字节后,有可能需要完成一些其它工作,如处理内部中断服务等,可能无法立刻接收下一个字节,这时接收器件可以将SCL线拉成低电平,从而使主机处于等待状态。直到接收器件准备好接收下一个字节时,再释放SCL线使之为高电平,从而使数据传送可以继续进行。

       在起始信号后必须传送一个从机的地址(7位),第8位是数据的传送方向位(R/),用“0”表示主机发送数据(T),“1”表示主机接收数据(R)。每次数据传送总是由主机产生的终止信号结束。但是,若主机希望继续占用总线进行新的数据传送,则可以不产生终止信号,马上再次发出起始信号对另一从机进行寻址。

a、主机向从机发送数据,数据传送方向在整个传送过程中不变:

注:有阴影部分表示数据由主机向从机传送,无阴影部分则表示数据由从机向主机传送。

    A表示应答, 表示非应答(高电平)。S表示起始信号,P表示终止信号。。

b、主机在第一个字节后,立即由从机读数据

c、在传送过程中,当需要改变传送方向时,起始信号和从机地址都被重复产生一次,但两次读/写方向位正好反相。

模拟过程:(以AT24C02为外接设备)

//*************************************************

#define  IIC_CLK_SET()  

#define  IIC_CLK_CLR()

#define  IIC_DAT_SET()

#define  IIC_DAT_CLR()

#define  IIC_DAT_GET()

//IIC启动信号,CLK为高电平的时,DAT由高变低

void I2CStart()

{  

       IIC_DAT_SET();

    I2CDelay();

       IIC_CLK_SET();

       I2CDelay();  

    IIC_DAT_CLR();

    I2CDelay();

    IIC_CLK_CLR();

    I2CDelay();

}

//停止信号,CLK为高电平时,DAT信号由低变高

void I2CStop()

{

   IIC_DAT_CLR();

   I2CDelay();

   IIC_CLK_SET();

   I2CDelay();

   IIC_DAT_SET();

   I2CDelay();

   IIC_CLK_CLR();

   I2CDelay();

}

//IIc初始化函数 CLK信号置低,发送停止信号

void I2CInit()

{

   IIC_CLK_CLR();

   I2CStop();

}

//在CLK为高电平时读取1位总线数据与应答信号

bit I2CClock() //return SDA while SCL is HIGH

{

   unsigned char sample;

   IIC_CLK_SET();

   I2CDelay();

   sample = IIC_DAT_GET();

   IIC_CLK_CLR();

   I2CDelay();

   return sample;

}

// 发送一个字节的数据,并返回应答信号(1表示接收正常,0表示接收器件无应答或损坏)

unsigned int I2CSend(BYTE I2CData)

{

   BYTE i;

   for(i=0;i<8;i++)

   {

       if( (I2CData & 0x80) == 0x80 )

             IIC_DAT_SET();    

       else

             IIC_DAT_CLR();

       I2CData=I2CData << 1;

      

       IIC_CLK_SET();

       I2C_Delay();

       IIC_CLK_CLR();

       I2C_Delay();

   }

   IIC_DAT_SET();

   return (~I2CClock());

}

//主机应答信号,a=1时表示应答信号, a=0时表示非应答信号

void I2CAck(unsigned int a)

{

       if(a==0)

            IIC_DAT_CLR();

     else

           IIC_DAT_SET();

     IIC_CLK_SET();

       I2C_Delay();

       IIC_CLK_CLR();

       I2C_Delay();

}

//延时程序

void I2CDelay()

{

   BYTE ll;

   for(ll=0;ll<100;ll++)

   {

      ;

   }

}

//IIC总线器件接受一个字节的数据

BYTE I2CReceive()

{

   BYTE I2CData=0;

   BYTE kk;

   for(kk=0;kk<8;kk++)

   {

      I2CData = I2CData <<1;

      if(I2CClock())

      {

         I2CData= I2CData + 0x01;

      }

   }

   return I2CData;

}

//向指定器件发送指定字节的数据,包含子设备地址

int SendByte(unsigned char sla,unsigned char c ,int num )

{

       //启动IIC设备

       //发送器件地址,

       //检查应答信号

       //发送一个字节数据

       //结束总线

}

//想从指定的器件接收指定字节的数据,返回0代表失败,返回1代表成功

 unsigned int RevByte(unsigned char sla, char *c ,int num)

 {

       //启动IIC设备

       //发送器件地址

       //检查应答信号

       //接收一个字节数据

       //发送应答信号

      //结束总线

 }

//***************************************************

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

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

相关文章

C/C++重点解析——内存管理

1. C/C内存分布 我们先来看一段代码和其相关问题&#xff1a; int globalVar 1; static int staticGlobalVar 1; void Test() {static int staticVar 1;int localVar 1;int num1[10] { 1, 2, 3, 4 };char char2[] "abcd";const char* pChar3 "abcd"…

蓝桥杯刷题--python-6

0最大距离 - 蓝桥云课 (lanqiao.cn) n=int(input()) nums=list(map(int,input().split()))max_=float(-inf) for i in range (n):for j in range (i+1,n):tmp=abs(i-j)+abs(nums[i]-nums[j])max_=max(tmp,max_) print(max_) 0最长递增 - 蓝桥云课 (lanqiao.cn) import os im…

中科大计网学习记录笔记(十一):CDN

前言&#xff1a; 学习视频&#xff1a;中科大郑烇、杨坚全套《计算机网络&#xff08;自顶向下方法 第7版&#xff0c;James F.Kurose&#xff0c;Keith W.Ross&#xff09;》课程 该视频是B站非常著名的计网学习视频&#xff0c;但相信很多朋友和我一样在听完前面的部分发现信…

解决报错npm i -g ts-node

报错提示&#xff1a; npm ERR! code EPERM npm ERR! syscall mkdir npm ERR! path C:\Program Files\nodejs\node_modules\ts-node npm ERR! errno -4048 npm ERR! Error: EPERM: operation not permitted, mkdir C:\Program Files\nodejs\node_modules\ts-node npm ERR! [E…

【读书笔记】ICS设备及应用攻击(一)

工控系统通常是由互联设备所构成的大型复杂系统&#xff0c;这些设备包括类似于人机界面&#xff08;HMI&#xff09;、PLC、传感器、执行器以及其他使用协商好的协议进行相互通信的设备。所有交互背后的驱动力都是软件&#xff0c;软件为工控系统中几乎所有部分的运行提供支撑…

软件测试-自动化测试-面试题研究,知识要点,高频、重点知识点,自动化测试知识要点、知识梳理-PYTHON+自动化,评估试题

自动化项目实战能力评估 介绍一下你的自动化测试框架&#xff1f; 我的框架主要根据分层思想设计了几个独立模块&#xff1a; 模块一&#xff1a;主要存放通用业务代码&#xff0c;比如接口访问&#xff0c;数据库操作&#xff0c;excel 操作&#xff0c;等等 模块二&#xf…

2月12号

第一种判断方式 if (n 10) 更好&#xff0c;因为它具有更好的可读性、可以避免误操作&#xff0c;并符合常见的编程习惯和约定

问题:下列不属于影响职业选择的内在因素是()。 #微信#微信

问题&#xff1a;下列不属于影响职业选择的内在因素是&#xff08;&#xff09;。 A.健康 B.个性特征 C.性别 D.家庭的影响 参考答案如图所示

程序员搞什么副业才有性价比?

干一行恨一行&#xff0c;三百六十行&#xff0c;行行干破防&#xff01; 一份稳定的主业固然重要&#xff0c;但是有性价比的副业更令人心动。朝九晚五的工作日复一日&#xff0c;当然也可能是996的生活反复捶打。从整体来讲&#xff0c;程序员算是高收入群体&#xff0c;但往…

C++ 图上 bfs(五十八)【第五篇】

今天我们来学习一下图上bfs。 1.图上bfs 在图上&#xff0c;我们也可以进行 BFS&#xff0c;也可以解决图上 DFS 能解决的问题&#xff0c;比如连通块。 除此以外&#xff0c;根据 BFS 的性质&#xff0c;第一次到一个点的时候记下来的步数一定是到从起点到这个点的最小步数&…

promise【JavaScript

Promise有四种状态&#xff1a; 1.pending&#xff08;进行中&#xff09;&#xff1a;初始状态&#xff0c;表示异步操作尚未完成。当创建一个Promise对象时&#xff0c;它的初始状态就是pending。 2.fulfilled&#xff08;已成功&#xff09;&#xff1a;表示异步操作已成功…

【论文精读】GPT2

摘要 在单一领域数据集上训练单一任务的模型是当前系统普遍缺乏泛化能力的主要原因&#xff0c;要想使用当前的架构构建出稳健的系统&#xff0c;可能需要多任务学习。但多任务需要多数据集&#xff0c;而继续扩大数据集和目标设计的规模是个难以处理的问题&#xff0c;所以只能…

Leetcode 516.最长回文子序列

题意理解&#xff1a; 给你一个字符串 s &#xff0c;找出其中最长的回文子序列&#xff0c;并返回该序列的长度。 子序列定义为&#xff1a;不改变剩余字符顺序的情况下&#xff0c;删除某些字符或者不删除任何字符形成的一个序列。 回文理解为元素对称的字串&#xff0c;这里…

PR:视频编辑播放速度技巧

想要视频片段加速或者减速&#xff0c;可以在片段上右击&#xff0c;选择“速度/持续时间...” 速度&#xff1a;可以更改百分比&#xff0c;如改成200%就是加速一倍&#xff0c;改成50%就是减速一倍。 注&#xff1a;如果源视频是正常速度录制的&#xff0c;比如每秒25帧&…

Linux split命令教程:如何分割大文件(附实例详解和注意事项)

Linux split命令介绍 split命令在Linux中用于将大文件分割成多个小文件。你可以根据需要自定义参数来分割文件。默认情况下&#xff0c;split命令会创建每1000行的新文件。 Linux split命令适用的Linux版本 split命令在所有主流的Linux发行版中都可以使用&#xff0c;包括但…

MySQL性能调优篇(6)-主从复制的配置与管理

MySQL数据库主从复制是一种常用的数据复制和高可用性解决方案。它允许将一个MySQL主服务器上的数据自动复制到多个从服务器上&#xff0c;从而提供了数据冗余备份、读写分离等优势。本文将详细介绍MySQL数据库主从复制的配置与管理。 1. 原理概述 MySQL主从复制是基于二进制日…

CSS弹性布局

CSS弹性布局 一、概念 ​ 弹性盒子是 CSS3 的一种新的布局模式。 ​ CSS3 弹性盒&#xff08; Flexible Box 或 flexbox&#xff09;&#xff0c;是一种当页面需要适应不同的屏幕大小以及设备类型时确保元素拥有恰当的行为的布局方式。 ​ 引入弹性盒布局模型的目的是提供一…

【制作100个unity游戏之23】实现类似七日杀、森林一样的生存游戏17(附项目源码)

本节最终效果演示 文章目录 本节最终效果演示系列目录前言制作木板UI直接复制和工具一样的即可检查背包是否有指定数量的空插槽 源码完结 系列目录 前言 欢迎来到【制作100个Unity游戏】系列&#xff01;本系列将引导您一步步学习如何使用Unity开发各种类型的游戏。在这第23篇…

如何使用机器人和物联网实现仓库自动化

自动化和机器人化不再仅限于制造过程; 现代仓库也正在采用大量新技术。 物联网 (IoT) 的出现使得极其精确的室内地理定位成为可能; 仓库工作人员正在使用智能仓储车; 先进的传感器确保存储货物的质量。 了解仓库自动化以及它如何保护并加快您的物流流程。 什么是物联网? Io…

实战过程记录:濒临宕机的业务系统仅优化1个SQL即恢复!!

记录一次真实Oracle系统SQL问题的案例 问题现像&#xff1a; 某客户业务的应用人员找到我&#xff0c;说是重要的业务系统出问题了&#xff0c;今天早上开始就很卡&#xff0c;现在卡到几乎无法工作。 问题的现象如下&#xff1a; 前台窗口查询啥都半天没有返回结果&#xff…