单片机/MCUwilliam hill官网
直播中

韦小齐

12年用户 85经验值
私信 关注
[问答]

关于I2C总线的一些问题

最近一直在看DA/AD之类的问题,后来遇到了PCF8591这样的芯片,须要用I2C总线的一些知识。看到这样一段程序,有些地方不太明白,在此求助,望高手出手相助。程序如下:
               发送一个字节
------------------------------------------------*/
  void Send(unsigned char Data)
  {
   unsigned char BitCounter=8;
   unsigned char temp;
   do
     {
   temp=Data;
   Scl=0;
   _nop_();_nop_();_nop_();_nop_();_nop_();
   if((temp&0x80)==0x80)   ///我想此处应该是屏蔽低七位,然后根据最高位的值来决定数据总线上的值,可是为什么要这么做
                                             ///呢?
      Sda=1;
   else
      Sda=0;

   Scl=1;
   temp=Data<<1;
   Data=temp;
   BitCounter--;
    }
   while(BitCounter);
       Scl=0;
   }

/*------------------------------------------------
               读入一个字节并返回
------------------------------------------------*/
   unsigned char Read(void)
   {
    unsigned char temp=0;
    unsigned char temp1=0;
    unsigned char BitCounter=8;
    Sda=1;
    do
      {
    Scl=0;
          _nop_();_nop_();_nop_();_nop_();_nop_();
    Scl=1;
    _nop_();_nop_();_nop_();_nop_();_nop_();
    if(Sda)                                     ////此处及以下程序做何解释,为何要这么做呢?
       temp=temp|0x01;
    else
       temp=temp&0xfe;
    if(BitCounter-1)
       {
     temp1=temp<<1;
     temp=temp1;
     }
     BitCounter--;
    }
  while(BitCounter);
  return(temp);
   }

回帖(6)

lstcspring

2012-8-6 18:02:44
1、判别最高位是否为‘1’
2、判别读取数据位是否为1
举报

李仲元

2012-8-6 18:32:13
举报

张三

2012-8-6 19:36:58
都是用来作为读取数据用的
举报

邹俊康

2012-12-21 14:41:46
举报

yintianye

2012-12-21 21:20:21
人家是一位一位传送的,需要一位一位的判断,然后直接给sda,也可以别的做法!
举报

1653384077.075000

2012-12-21 22:13:23
楼上几位的解释 正解。。。。但是说实话,这段代码写的不咋的。。个人觉得,楼主需要注意这几个方面,
1、要熟悉这种学习过程。一般而言,要用到iic或者spi 之类的,又要用到io端口模拟通信, 需要先了解这些通信协议,然后再尝试自己写,可以参考别人的代码,最后再测试,这样子才能进步, 要是一开始就看别人的代码,效果估计不是很好, 主要是 c语言太灵活了,先不论别人写的代码质量如何,光是那些时序就有多种实现方法,不然下次别人换中表示方法,就要迷糊......还有就是读别人代码,本来就比自己写代码费事.....
2、此外,建议楼主熟悉一下c语言的基本语法。 楼主的那两处疑惑都是关于位操作的。。。特定位 置1 或者清0, 这个不难,熟悉一下就好...很快上手
3、就以上代码段而言, 第一处,按照 先高位,再低位发送的顺序,肯定每次判断是最高有效位,所以需要屏蔽掉其他位,第二处,判断此时io的电平高低,来确定此时收到的位是 1还是 0, 那么置对应的位.......
举报

更多回帖

发帖
×
20
完善资料,
赚取积分