[求助] IIC写时一开始只要将SCL拉低,而读时,把SCL拉低后马上又拉高呢?

16816   2016-10-4 23:52 楼主

请各位大师帮我解答解答,下面几个问题想了几天也没想明白,先谢了!!

/*------------------------------------------------
              发送一个字节
------------------------------------------------*/
         void Send(unsigned char Data)
         {
          unsigned char BitCounter=8;
          unsigned char temp;

          do
            {
                 temp=Data;
                 Scl=0;            //这里只要将他拉低就可以了,然后就进入数据发送
                 _nop_();  
                 if((temp&0x80)==0x80)
                    Sda=1;
                 else
                    Sda=0;

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


/*------------------------------------------------
               ¶áèëò»¸ö×Ö½ú2¢·μ»Ø
------------------------------------------------*/
          unsigned char Read(void)
          {
           unsigned char temp=0;
           unsigned char temp1=0;
           unsigned char BitCounter=8;

           Sda=1;
           do
             {
                  Scl=0;            // 这里将SCL拉低后,接着又拉高了,为什么和上面写时时序不同?应该一样的啊
          _nop_();
                  Scl=1;           //
                  _nop_();
                  if(Sda)
                     temp=temp|0x01;
                  else
                     temp=temp&0xfe;

                  if(BitCounter-1)
                     {
                          temp1=temp<<1;
                          temp=temp1;
                          }
                          BitCounter--;
                         }
                while(BitCounter);
                return(temp);
          }
}

还有这下面
/////////////////////////////////////////////////////////////////////////////////////////

/*------------------------------------------------
                    写入DA数模转换值
------------------------------------------------*/
          void DAC(unsigned char Data)
          {
                   Start();
                   Send(AddWr); //这里是写入芯片地址,但为什么AddWr的地址要等于0x90呢?
                   Ack();
                   Send(0x40);  //这里是发送的芯片内部地址吗?也就是8591的内部地址吗?
                   Ack();
                   Send(Data);  //写数据
                   Ack();
                   Stop();
                 
           }

/*------------------------------------------------
                 读取AD模数转换的值,有返回值
------------------------------------------------*/
          unsigned char ReadADC(unsigned char Chl)
          {
       unsigned char Data;
                   Start();      
                   Send(AddWr);   //写入芯片地址
                   Ack();
                   Send(0x40|Chl);//写入选择的通道,Chl的值分别为0、1、2、3,分别代表1-4通道。不明白为什么这里
                                           //是怎么做到通道选择的,还有0x40什么意思? 和chl相或就是在选择通道吗?
                   Ack();
                   Start();
                   Send(AddRd);    //读入地址
                   Ack();
                   Data=Read();    //读数据
                   Scl=0;
                   NoAck();
                   Stop();
                   return Data;   //返回值
          }



回复评论 (4)

你可以看下IIC写数据和读数据时的时序,另外你需要参考外设芯片手册来查看你需要写入的数据,有些是固定的数据,有些是需要变化的数据
  • QQ截图20161005075659.png
点赞  2016-10-5 08:00
读写的时序本身就不一样。看看i2c的时序,另外, i2c从设备的手册也应该有时序说明。以手册时序为标准,就可以了。不管程序的语句是怎么样的,时序一定要按照手册时序来做。你可以运行一下,看看时序对不对。
点赞  2016-10-5 16:36
引用: ienglgge 发表于 2016-10-5 16:36
读写的时序本身就不一样。看看i2c的时序,另外, i2c从设备的手册也应该有时序说明。以手册时序为标准,就 ...

谢谢!我找找看
点赞  2016-10-5 21:06
引用: youseeme 发表于 2016-10-5 08:00
你可以看下IIC写数据和读数据时的时序,另外你需要参考外设芯片手册来查看你需要写入的数据,有些是固定的 ...

谢谢,我查查8591的数据手册看看
点赞  2016-10-5 21:14
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复