关于IIC通讯协议的有关问题

news2024/9/29 9:36:41

问题:如何正确使用IIC这么优秀的通讯协议呢?

解决:

第一步:知道起始信号和终止信号

当SCL为1的时候,SDA从1变成0,这个就是起始信号,说明可以开始传输;当SCL为1的时候,SDA从0变成1,这个就是终止信号,说明传输停止。可想而知需要操作很多次,我们要编写相关函数。

第二步:知道ACK应答和NACK非应答

当传输完一个字节的数据的时候,如果还需要继续继续传输数据,那么从机需要给主机发送对应的信号,当还要继续传输的时候,SDA从1变成0;当SDA一直是1的时候,表示可以结束传输。

另外:应答的时候,SDA=0,SCL需要等于1,非应答的时候,SDA=1,SCL也需要等于1。

第三步:IIC到底是如何读写数据的呢?

一般而言,从机的设备地址为七位,剩下的一位表示读写,0表示写,1表示读.

例如图2 24c02,1010 0000表示给这个从机写入,1010 0001表示从这个从机读出。

第四步:其他,怎么连接?

这样接即可,需要接上拉电阻。图2说的是,当SCL=0的时候,数据才可以传递。

具体配置:起始,结束,应答,非应答

问题来了,从机发送信号给主机,是否继续传输信号,那么主机如何判断呢?没有接收到应答信号应该如何?这个时候就要写一个等待应答函数,没有应答超过一定时间,就停止传输。如下

那么数据到底是如何写和读的呢?如下

//产生IIC起始信号函数,具体配置如下
void IIC_start()
{
        SDA=1;
        delay_10us(1);
        SCL=1;
        delay_10us(1);
        SDA=0;
        delay_10us(1);
        SCL=0;    //为传输数据做准备
        delay_10us(1);
}

//产生IIC停止信号函数
void IIC_stop()
{
    SDA=0;
    delay_10us(1);
    SCL=1;
    delay_10us(1);
    SDA=1;
    delay_10us(1);
}

//产生ACK应答信号函数
void IIC_ack()
{
    SCL=0;    //产生ACK需要保证SCL=0
    SDA=0;    //低电平表示应答
    delay_10us(1);
    SCL=1;
    delay_10us(1);
    SCL=0;
}

//产生NACK非应答信号函数
void IIC_nack()
{
    SCL=0;    //产生ACK需要保证SCL=0
    SDA=1;    //高电平表示非应答
    delay_10us(1);
    SCL=1;
    delay_10us(1);
    SCL=0;
}

//等待接收ACK应答函数,如果接收到了返回1,没有接收到,返回0,等待应答是为了进行下次传输
u8 IIC_wait_ack()
{
        u8 num_time=0;
        SCL=1;
        delay_10us(1);
        while(SDA)
        {
            num_time++;
            if(num_time>100)
            {
                IIC_stop();//停止传输
                return 0;
            }
        }
        SCL=0;//允许传输
        return 1;
}

//IIC发送一个字节
void IIC_write_byte(u8 dat)
{
    u8 num_f;
    SCL=0;
    for(num_f=0;num_f<8;num_f++)
    {
            if((dat&0x80)>0)            SDA=1;//表示1高电平
            else                        SDA=0;//表示低电平
            dat=dat<<1;    //从高位依次写入
            delay_10us(1);
            SCL=1;
            delay_10us(1);
            SCL=0;
            delay_10us(1);
    }
}

//IIC接收一个字节,将接收到的返回,ack=1,表示应答,ack=0表示非应答
u8 IIC_read_byte(u8 ack)
{
        u8 num_f,receive=0;
    for(num_f=0;num_f<8;num_f++)
    {
            SCL=0;
            delay_10us(1);
            SCL=1;
            receive=receive<<1;//从高位依次读出
        if(SDA)  receive++;
                    delay_10us(1);

    }
    if(!ack)  IIC_nack();
    else         IIC_ack();
    return receive;
}

实际应用:

对到这个图理解效果会更好.

//往24c02里指定地址写入一个字节的数据
void AT24C02_write_byte(u8 address,u8 dat)
{
        IIC_start();//起始条件
      IIC_write_byte(0xA0);//从设备地址,并且是写入
        IIC_wait_ack();//等待应答
        IIC_write_byte(address);//写入地址数据
        IIC_wait_ack();//等待应答
        IIC_write_byte(dat);//发送数据
        IIC_wait_ack();//等待应答
        IIC_stop();//写入一个字节,停止一下
        delay_ms(10);
}

//在24c02里指定地址读出一个字节的数据
u8 AT24c02_read_byte(u8 address)
{
        u8 temp=0;
        IIC_start();//起始条件
      IIC_write_byte(0xA0);//从设备地址,表示读出
        IIC_wait_ack();//等待应答
      IIC_write_byte(address);//写入地址数据
        IIC_wait_ack();//等待应答,否则停止传输
        IIC_start();
      IIC_write_byte(0xA1);//发送读命令
        IIC_wait_ack();//等待应答
        temp=IIC_read_byte(0);//将读出的数据给temp,并且0表示非应答,表示结束
        IIC_stop();
        return temp;
}

注意:当SCL为0的时候,SDA状态可以变,用于传输数据,SCL为1的时候,SDA状态不能变,只能读。

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

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

相关文章

Spire.Office for Java 8.2.0 强大之喜Xaspose

Spire.Office for Java是由E-iceblue开发的一款Java系列的Office文档操作类库&#xff0c;用于操作MS Word、PDF、MS Power Point 以及条形码&#xff0c;可实现文档创建、编辑、转换、打印等功能&#xff0c;是E-iceblue 所有 Java组件&#xff0c;包括Spire.Doc for Java、Sp…

Java爬虫入门——HttpClient,JSoup

一&#xff0c;网络爬虫介绍爬虫也叫网络机器人&#xff0c;可以代替人工&#xff0c;自动的在网络上采集和处理信息。爬虫包括数据采集&#xff0c;分析&#xff0c;存储三部爬虫引入依赖<!--引入httpClient依赖--><dependency><groupId>org.apache.httpcom…

Netty服务端请求接受过程源码剖析

目标 服务器启动后&#xff0c;客户端进行连接&#xff0c;服务器端此时要接受客户端请求&#xff0c;并且返回给客户端想要的请求&#xff0c;下面我们的目标就是分析Netty 服务器端启动后是怎么接受到客户端请求的。我们的代码依然与上一篇中用同一个demo&#xff0c; 用io.…

Tektronix TAP3500/泰克TAP3500有源探头

产品概览 泰克 TAP3500 有源探头&#xff0c;2 .5 GHz 泰克 TAP3500 单端有源 FET 探头是一种多功能且易于使用的探头&#xff0c;可提供数字系统设计所需的高速电气和机械性能。泰克 TAP3500 探头专为使用和连接到 TekVPI™ 探头接口而设计。 泰克 TAP3500 有源探头的特性和规…

带你认识一下什么是函数式接口Comparator

函数式接口Comparator 1、函数式接口是什么&#xff1f; 所谓的函数式接口&#xff0c;实际上就是接口里面只能有一个抽象方法的接口。Comparator接口就是一个典型的函数式接口&#xff0c;它只有一个抽象方法compare。 有人会说equales方法也没有方法体&#xff0c;也是抽象…

江苏专转本考试倒计时,该如何自救?

专转本考试倒计时&#xff0c;该如何自救&#xff1f;第一点&#xff1a;回归考纲教材&#xff0c;刷题。 最后一段时间&#xff0c;一定要回归考纲及教材&#xff01;要把知识点看细&#xff0c;看明白。 另外大家也可以根据历年考试题对知识点进行系统地复习和梳理&#xff0…

【java】Spring Boot --深入SpringBoot注解原理及使用

步骤一 首先&#xff0c;先看SpringBoot的主配置类&#xff1a; SpringBootApplication public class StartEurekaApplication {public static void main(String[] args){SpringApplication.run(StartEurekaApplication.class, args);} }步骤二 点进SpringBootApplication来…

线程间通信的常用方式

线程间通信的常用方式 1.简介 线程通信简单来说就是实现线程的交替工作&#xff0c;传递信息。例如在一个方法中我有两个线程A和B在运行&#xff0c;我希望线程A先向一个集合里面循环新增数据&#xff0c;当增加到第五次的时候&#xff0c;线程B才开始执行其他的操作。 线程间…

博客系统测试用例

博客系统测试用例目录博客系统测试用例博客系统删除功能测试用例 (判定表)提交BUG 1测试用例 1测试用例 2提交BUG提交BUG 2博客系统测试用例 博客系统删除功能测试用例 (判定表) # 首先确定输入条件与输出条件 输入条件: 博客作者, 非博客作者, 点击删除博客输出条件: 删除成…

web移动端:rem适配布局(重点)

目录 1. rem基础 2.媒体查询 2.1 媒体查询的概念 2.2 语法规范 2.2.1 2.2.2 关键字 2.2.3 媒体特性 2.2 根据页面宽度改变颜色 2.3 媒体查询rem 实现元素动态大小变化 2.4 引入资源&#xff08;理解&#xff09; 2.4.1 语法规范 3. less基础 3.1 css弊端 3.2 less介绍…

基于SuperPoint与SuperGlue实现图像配准

基于SuperPoint与SuperGlue实现图像配准&#xff0c;项目地址https://github.com/magicleap/SuperGluePretrainedNetwork&#xff0c;使用到了特殊算子grid_sample&#xff0c;在转onnx时要求opset_version为16及以上&#xff08;即pytorch版本为1.9以上&#xff09;。SuperPoi…

计讯物联污染源自动监控系统,坚守“绿水青山就是金山银山”

近年来&#xff0c;“绿水青山就是金山银山”的理念在全国各地落地生根&#xff0c;各大城市积极构建环境监测体系&#xff0c;旨在让生态文明成色更足&#xff0c;绿色发展底色更亮。计讯物联污染源自动监控系统作为生态环境部门监督企业排污的“火眼金睛”&#xff0c;充分运…

apifox持续集成+java+企微机器人+xxljob定时推送

总览&#xff1a; apifox做接口测试后&#xff0c;把用例合并组装成测试套件&#xff0c;然后apifox-cli通过终端命令实现把套件执行后&#xff0c;输出本地文件的测试报告html或json。本地解析后拿到有用的解决通过定时执行推送到企微群里。 然后把html一起推到群里。 这个…

【Spark分布式内存计算框架——Spark SQL】8. Shuffle 分区数目、Dataset(上)

4.4 Shuffle 分区数目 运行上述程序时&#xff0c;查看WEB UI监控页面发现&#xff0c;某个Stage中有200个Task任务&#xff0c;也就是说RDD有200分区Partition。 原因&#xff1a;在SparkSQL中当Job中产生Shuffle时&#xff0c;默认的分区数&#xff08;spark.sql.shuffle.p…

基于STM32采用CS创世 SD NAND(贴片SD卡)完成FATFS文件系统移植与测试

一、前言 在STM32项目开发中&#xff0c;经常会用到存储芯片存储数据。 比如&#xff1a;关机时保存机器运行过程中的状态数据&#xff0c;上电再从存储芯片里读取数据恢复&#xff1b;在存储芯片里也会存放很多资源文件。比如&#xff0c;开机音乐&#xff0c;界面上的菜单图…

Selenium + python自动化测试环境搭建

selenium 是一个web的自动化测试工具&#xff0c;不少学习功能自动化的同学开始首选selenium &#xff0c;相因为它相比QTP有诸多有点&#xff1a; 免费&#xff0c;也不用再为破解QTP而大伤脑筋 小巧&#xff0c;对于不同的语言它只是一个包而已&#xff0c;而QTP需要下载安…

JSON字符串解析

目录 依赖 方法 示例 判断JSON是否合格 依赖 方法 JSON.parseObject() JSON.parseArray() 示例 Data public class OrderVo {public String name;public Integer price;public Integer count; } JSON数据 { "name": "苹果手机", "pric…

BIT.8_Linux 多线程

目录Linux线程概念什么是线程线程的优点线程的缺点线程异常线程用途Linux进程VS线程进程和线程总结Linux线程控制POSIX线程库创建线程线程ID及进程地址空间布局进程和线程ID区别内核层面&#xff1a;pid & tgid线程终止线程等待__thread 和 pthread_self()分离线程Linux线程…

《爆肝整理》保姆级系列教程python接口自动化(十七)--Json 数据处理---一次爬坑记(详解)

简介 有些 post 的请求参数是 json 格式的&#xff0c;这个前面发送post 请求里面提到过&#xff0c;需要导入 json模块处理。现在企业公司一般常见的接口因为json数据容易处理&#xff0c;所以绝大多数返回数据也是 json 格式的&#xff0c;我们在做判断时候&#xff0c;往往只…

Guava常用工具类总结

-“Null的含糊语义让人很不舒服。Null很少可以明确地表示某种语义&#xff0c;例如&#xff0c;Map.get(key)返回Null时&#xff0c;可能表示map中的值是null&#xff0c;亦或map中没有key对应的值。Null可以表示失败、成功或几乎任何情况。使用Null以外的特定值&#xff0c;会…