微波EDA网,见证研发工程师的成长! 2025年03月27日 星期四
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 关于IIC 的读写问题 急求大神~~~~~~~~~~~~~~~~~~~~~~~

关于IIC 的读写问题 急求大神~~~~~~~~~~~~~~~~~~~~~~~

时间:10-02 整理:3721RD 点击:

  1. void  writebyte(char date)
  2. {
  3.         char i,temp;
  4.         temp = date;
  5.         for( i = 0; i < 8; i++)
  6.         {
  7.                 temp = temp<<1;
  8.                 SCL = 0;
  9.                 delay();
  10.                 SDA = CY;
  11.                 delay();
  12.                 SCL = 1;
  13.                 delay();
  14.         }
  15.         SCL = 0;                                          // scl 为什么要拉低?
  16.         delay();                       
  17.         SDA = 1 ;                                         // sda 为什么要拉高?       
  18.         delay();
  19. }

  20. char readbyte()
  21. {
  22.         char i,k;
  23.         SCL = 0;
  24.         delay();
  25.         SDA = 1;                          //这里的scl 和 sda 为何要分别为低电平和高电平?
  26.         delay();
  27.         for(i = 0; i < 8;i++)
  28.         {
  29.                 SCL = 1;                                     //当 scl为高电平的时候数据不可以改变
  30.         delay();
  31.                 k = ( k<<1 )|SDA;
  32.                 SCL = 0;                              
  33.                 delay();                  

  34.         }

  35.         return k;
  36. }

复制代码

http://bbs.elecfans.com/jishu_270523_1_1.html

  1.         SCL = 0;                                          // scl 为什么要拉低?

  2.           delay();                        

  3.              SDA = 1 ;                                         // sda 为什么要拉高?  
  4.    

复制代码

如果要释放总线 scl 不应该也是高电平吗? 然后等待应答信号

SCL拉低的原因应该是要改变SDA,只有SCL为低电平的时候SDA才可以改变,至于SDA=1应该是读取非应答位的,个人理解,我也是没学习多久的

因为你写的是模拟I2C所以在总线上主机不会自动拉高进行ACK,ACK是指在scl为低电平的时候从机经行应答,所以在你里面需要先拉低scl再拉高SDA

看看,数据手册,看读写时序。。

自己把I2C时序翻出来看一下

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top