5440|13

87

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

请教关于51单片机IIC通信程序 [复制链接]

哪位朋友可以指点一下单片机IIC 程序应该怎么写呢 书上写的看了 但是没弄明白究竟是怎么回事。。

最新回复

这是硬件i2c处理应答信号的常用办法,就是主机等待从机应答信号,当一段时间从机还未应答的话,就认为是已经应答,进而继续处理继续的内容。这样做节省MCU的时间,而且也体现了i2c的灵活性。   详情 回复 发表于 2010-4-25 13:10
点赞 关注

回复
举报

59

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
IIC的时序是非常简单的
通过沿变化来起始和停止
楼主要是学习的话
可以调试一下AT24C02这个片子
是个存储芯片
时序就是IIC的
非常典型
而且网上也有非常成熟
非常规范的代码
可供参考
下载一份其datasheet
楼主调试完这个片子
可对IIC协议有个通透的理解
IIC,SPI,CAN,USB等等通讯协议
IIC是最简便易用的
————————————————————————————————————————————————
菜鸟来顶贴学习。
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
看IIC的读写时序图 慢慢看会有收获的 不要心急,要理解器件地址的确定,内部存储空间的地址也就是子地址,然后读写时序中怎样是读 怎样是写,何时需要ACK,何时不需要,何时是NACK,耐心看一个诸如AT24C02这样的简单的器件手册就会有收获
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

4
 
和SPI通讯很相似,一根时钟线一根数据线,数据一位一位传输,楼主如果知道SPI通讯的话,看看IIC例程就清楚了
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

5
 

  1. #include   
  2. #include

  3. #define AddWr 0xae   
  4. #define AddRd 0xaf   


  5. sbit Sda=P1^2;      
  6. sbit Scl=P1^1;
  7. sbit WP=P1^0;        

  8. /*------------------------------------------------
  9.                    延时程序
  10. ------------------------------------------------*/
  11. void mDelay(unsigned char j)
  12. {
  13.   unsigned int i;
  14.   for(;j>0;j--)
  15.      {
  16.       for(i=0;i<125;i++)
  17.          {;}
  18.       }
  19.   }

  20. /*------------------------------------------------
  21.                     启动IIC总线
  22. ------------------------------------------------*/
  23.   void Start(void)
  24.   {
  25.    Sda=1;
  26.    _nop_();_nop_();
  27.    Scl=1;
  28.    _nop_();_nop_();_nop_();_nop_();_nop_();
  29.    Sda=0;
  30.    _nop_();_nop_();_nop_();_nop_();_nop_();
  31.    Scl=0;
  32.   }


  33. /*------------------------------------------------
  34.                     停止IIC总线
  35. ------------------------------------------------*/
  36.   void Stop(void)
  37.   {
  38.    Sda=0;
  39.    _nop_();
  40.    Scl=1;
  41.    _nop_();_nop_();_nop_();_nop_();_nop_();
  42.    Sda=1;
  43.    _nop_();_nop_();_nop_();_nop_();_nop_();
  44.    Scl=0;
  45.    }


  46. /*------------------------------------------------
  47.                    应答IIC总线
  48. ------------------------------------------------*/
  49.    void Ack(void)
  50.    {
  51.     Sda=0;
  52.     _nop_();_nop_();_nop_();
  53.     Scl=1;
  54.     _nop_();_nop_();_nop_();_nop_();_nop_();
  55.     Scl=0;
  56.     _nop_();_nop_();
  57.     }


  58. /*------------------------------------------------
  59.                  非应答IIC总线
  60. ------------------------------------------------*/
  61.     void NoAck(void)
  62.     {
  63.      Sda=1;
  64.      _nop_();_nop_();_nop_();
  65.      Scl=1;
  66.      _nop_();_nop_();_nop_();_nop_();_nop_();
  67.      Scl=0;
  68.      _nop_();_nop_();
  69.      }


  70. /*------------------------------------------------
  71.               发送一个字节
  72. ------------------------------------------------*/
  73.      void Send(unsigned char Data)
  74.      {
  75.       unsigned char BitCounter=8;
  76.       unsigned char temp;

  77.       do
  78.         {
  79.          temp=Data;
  80.          Scl=0;
  81.          _nop_();_nop_();_nop_();_nop_();_nop_();
  82.          if((temp&0x80)==0x80)
  83.             Sda=1;
  84.          else
  85.             Sda=0;


  86.             Scl=1;
  87.             temp=Data<<1;
  88.             Data=temp;
  89.             BitCounter--;
  90.           }
  91.       while(BitCounter);
  92.           Scl=0;
  93.       }


  94. /*------------------------------------------------
  95.                读入一个字节并返回
  96. ------------------------------------------------*/
  97.       unsigned char Read(void)
  98.       {
  99.        unsigned char temp=0;
  100.        unsigned char temp1=0;
  101.        unsigned char BitCounter=8;

  102.        Sda=1;
  103.        do
  104.          {
  105.           Scl=0;
  106.           _nop_();_nop_();_nop_();_nop_();_nop_();
  107.           Scl=1;
  108.           _nop_();_nop_();_nop_();_nop_();_nop_();
  109.           if(Sda)
  110.              temp=temp|0x01;
  111.           else
  112.              temp=temp&0xfe;

  113.           if(BitCounter-1)
  114.              {
  115.               temp1=temp<<1;
  116.               temp=temp1;
  117.                   }
  118.               BitCounter--;
  119.                  }
  120.         while(BitCounter);
  121.         return(temp);
  122.       }

  123. /*------------------------------------------------
  124.                   写入数据  
  125. ------------------------------------------------*/
  126.       void WrToROM(unsigned char Data[],unsigned char Address,unsigned char Num)
  127.       {
  128.        unsigned char i;
  129.        unsigned char *PData;
  130.        PData=Data;
  131.        for(i=0;i
  132.           {
  133.            Start();
  134.            Send(AddWr);   
  135.            Ack();
  136.            Send(Address+i);
  137.            Ack();
  138.            Send(*(PData+i));
  139.            Ack();
  140.            Stop();
  141.            mDelay(20);
  142.            }
  143.        }

  144. /*------------------------------------------------
  145.                  读出数据
  146. ------------------------------------------------*/
  147.       void RdFromROM(unsigned char Data[],unsigned char Address,unsigned char Num)
  148.       {
  149.        unsigned char i;
  150.        unsigned char *PData;
  151.        PData=Data;
  152.        for(i=0;i
  153.           {
  154.            Start();        
  155.            Send(AddWr);
  156.            Ack();
  157.            Send(Address+i);
  158.            Ack();
  159.            Start();
  160.            Send(AddRd);   
  161.            Ack();
  162.            *(PData+i)=Read();
  163.            Scl=0;
  164.            NoAck();
  165.            Stop();
  166.            }
  167.       }

  168. /*------------------------------------------------
  169.                    主程序
  170. ------------------------------------------------*/
  171.     void main()
  172.     {
  173.      unsigned char Number[4]={0x06,0x5b,0x4f,0x66};
  174.      unsigned char i;
  175.      WP=0;                                         
  176.      P2=0x00;
  177.      
  178.      WrToROM(Number,4,4);                          
  179.      mDelay(200);
  180.      Number[0]=0;                                 
  181.      Number[1]=0;
  182.      Number[2]=0;
  183.      Number[3]=0;
  184.      RdFromROM(Number,4,4);                        
  185.      
  186.      while(1)
  187.           {
  188.            
  189.            P0=Number[i];                           
  190.            mDelay(200);                             
  191.            mDelay(200);
  192.            i++;
  193.            if(i==4)
  194.               i=0;
  195.           }
  196.     }

复制代码


这有个24c02的程序  看的我直迷糊  哎。。  真是晕的很  是不是太笨了
 
 
 

回复

86

帖子

0

TA的资源

一粒金砂(初级)

6
 
不要直接看程序,看IIC的读写时序图 然后对照程序看
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

7
 
引用 5 楼 wjk864 的回复:
不要直接看程序,看IIC的读写时序图 然后对照程序看
没错
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

8
 
往上搜了一下 又看了一遍 感觉有那么点意思了  起始用下降沿 终止用上升沿 数据传输时SCL为高 SDA数据保持稳定 SCL为低 允许SDA数据变化 然后每一帧最后加一应答位 不知道是不是这样理解 我觉得我还是晕着的。。
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

9
 
觉得晕的时候就对照程序 看看过程是否跟你想象的一样
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

10
 

  1. void stopi2c()
  2. {
  3.     SCL=0;
  4.     DELAY(1);
  5.     DSA=0;
  6.     DELAY(1);
  7.     SCL=1;
  8.     DELAY(1);
  9.     SDA=1;
  10.     DELAY(1);
  11. }
复制代码

我的书上的终止信号是这么写的和上面那个不一样 上面那个是开发板带的24c02资料 有什么区别么
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

11
 
看下时序图呢 具体时序我也不记得啊
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

12
 

  1. void respons()                //回应信号
  2. {
  3.         uchar i=0;SCL=1;delay();
  4.         while((SDA==1)&&())
  5.               i++;
  6.         SCL=0;
  7.         delay();}

复制代码

那个i<255这句是什么意思呢  是延时的作用么?
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

13
 
时序------还有要有一些硬件工具。
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

14
 
引用 11 楼 libra_boy 的回复:

C/C++ code

void respons()        //回应信号
{
    uchar i=0;SCL=1;delay();
        while((SDA==1)&&())
              i++;
    SCL=0;
        delay();}



那个i<255这句是什么意思呢  是延时的作用么?


这是硬件i2c处理应答信号的常用办法,就是主机等待从机应答信号,当一段时间从机还未应答的话,就认为是已经应答,进而继续处理继续的内容。这样做节省MCU的时间,而且也体现了i2c的灵活性。
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表