打印

关于IIC总线的问题,求助

[复制链接]
1419|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 飞扬跋扈 于 2013-7-17 10:27 编辑

正在学习IIC总线,程序感觉完全是按照时序图写的但是就是得不到想要的结果啊,求大神帮忙分析一下

#include<reg52.h>
#define uchar unsigned char
sbit sda=P1^0;
sbit scl=P1^1;
void delay()
{ ; ;}
void delay1(uchar a)
{
  uchar i,j;
  for(i=a;i>0;i--)
  for(j=110;j>0;j--);
}
void start()
{       
    sda=1;
        scl=1;
        delay();
        sda=0;
        delay();
        scl=0;

}

void  stop()
{
   sda=0;
   scl=1;
   delay();
   sda=1;
   delay();
}
  void response()
  {
    uchar i;
        while((sda==1)&&(i<250))
        i++;
    scl=1;
        delay();
        scl=0;
        delay();
  }

void write_byte(uchar date)
{
    uchar i,temp;
        temp=date;
    scl=0;
        delay();
        for(i=0;i<8;i++)
        {
       temp=temp<<1;
           scl=0;
           delay();
           sda=CY;
           delay();
           scl=1;
           delay();
        }
        sda=1;
        delay();
  }

uchar read_byte()
   {  
      uchar i,k;
          scl=0;
          delay();
          sda=1;
          delay();
          for(i=0;i<8;i++)
          {
              scl=1;
                 delay();
                 k=(k>>1)|sda;
             scl=0;
                 delay();
          }
          return k;
        }
  void main()
{
    //主机发送数据给从机
          start();
          write_byte(0xa0);//被控器件地址 主机发送
          response();
          write_byte(0x03);//发送数据的存储地址
          response();
          write_byte(0xfe);        //主机发送的数据
          response();

          //主机接收从机的数据(原先主机发送的数据)
          delay1(100);
          start();
          write_byte(0xa0);        //被控器件地址 主机发送
          response();
          write_byte(0x03);//从机发送数据的起始地址
          response();
          start();
          write_byte(0xa1);        //主机通知从机,现在主机是接收
          P2=read_byte();  //P2口接收从机的数据应该是0xfe
          stop();
      while(1);
  }

相关帖子

沙发
叶伤| | 2013-7-17 11:37 | 只看该作者
{ ; ;}这种写法很可能会被编译器当成空函数给优化。两个空指令保证能大于4.7μS?这俺懒得算了。一般习惯性使用
#include <intrins.h> 头文件里的_nop_(),这个函数编译器不会优化,1μS(12Mhz)周期的要使用5个以上,一般使用7个,太快了I2C识别不了。

k=(k>>1)|sda;这句话太过于非主流,uchar和bit相或的结果,俺新手不懂。建议使用
data<<=1;
if(SDA)retc+=1;

如果是其它问题,那抱歉,程序太乱,没心情看了。俺英文能力不行,response是什么玩意谁说下?

使用特权

评论回复
板凳
logokfu| | 2013-7-17 14:45 | 只看该作者
叶伤 发表于 2013-7-17 11:37
{ ; ;}这种写法很可能会被编译器当成空函数给优化。两个空指令保证能大于4.7μS?这俺懒得算了。一般习惯性 ...

response就是ACK

使用特权

评论回复
地板
飞扬跋扈|  楼主 | 2013-7-17 15:13 | 只看该作者
**kfu 发表于 2013-7-17 14:45
response就是ACK

谢谢大神解释:lol

使用特权

评论回复
5
飞扬跋扈|  楼主 | 2013-7-17 15:19 | 只看该作者
叶伤 发表于 2013-7-17 11:37
{ ; ;}这种写法很可能会被编译器当成空函数给优化。两个空指令保证能大于4.7μS?这俺懒得算了。一般习惯性 ...

要感谢大神踌躇而雁行时间来看我的乱糟糟的程序,并且提出宝贵的意见。。那个response 就是应答,响应。。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

6

帖子

0

粉丝