找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2252|回复: 0
打印 上一主题 下一主题
收起左侧

AT24C02 IIC驱动 C代码

[复制链接]
跳转到指定楼层
楼主
ID:75926 发表于 2015-4-10 17:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. #define SCL_L  //拉低SCL线的宏
  2. #define SCL_H  //拉高SCL线的宏
  3. #define SDA_L  //拉低SDA线的宏
  4. #define SDA_H  //拉高SDA线的宏
  5. #define SDA_Read //读SDA线的宏
  6. #define Wait //延时宏 大约为5us

  7. void IIC_Start(void)//启动IIC函数
  8. {
  9.     SDA_H;
  10.     SCL_H;
  11.     Wait;
  12.     SDA_L;
  13.     Wait;
  14.     SCL_L;
  15.     Wait;
  16. }
  17. void IIC_Stop(void)//停止IIC函数
  18. {
  19.     SDA_L;
  20.     SCL_H;
  21.     Wait;
  22.     SDA_H;
  23. }
  24. void IIC_Send_Byte(uint8_t data)//想IIC器件发送8个位数据
  25. {
  26.     uint8_t i;
  27.     for(i=0;i<8;i++)
  28.     {
  29.         if(data&(0x80>>i))
  30.             SDA_H;
  31.         else
  32.              SDA_L;
  33.         Wait;
  34.         SCL_H;
  35.         Wait;
  36.         SCL_L;
  37.         Wait;
  38.     }
  39.         SDA_H;
  40.         Wait;
  41. }

  42. uint8_t IIC_Read_Byte()//读取8位数据
  43. {
  44.     uint8_t i,buff=0x00;
  45.     for(i=0;i<8;i++)
  46.     {
  47.         buff<<=1;
  48.         SCL_H;
  49.         Wait;
  50.         if(SDA_Read)
  51.             buff|=0x01;
  52.         SCL_L;
  53.         Wait;
  54.     }
  55.     return buff;
  56. }

  57. uint8_t Wait_Ack(void)//等待应答
  58. {
  59.     uint8_t flag;
  60.     SDA_H;
  61.     Wait;
  62.     SCL_H;
  63.     Wait;
  64.     if(SDA_Read)
  65.         flag=1;
  66.     else
  67.         flag=0;
  68.     SCL_L;
  69.     Wait;
  70.     return flag;
  71. }

  72. void Ack(void)//发送应答
  73. {
  74.     SDA_L;
  75.     Wait;
  76.     SCL_H;
  77.     Wait;
  78.     SCL_L;
  79.     Wait;
  80.     SDA_H;
  81. }

  82. void NAck(void)//发送非应答
  83. {
  84.     SDA_H;
  85.     Wait;
  86.     SCL_H;
  87.     Wait;
  88.     SCL_L;
  89.     Wait;
  90. }

  91. uint8_t AT24C02_Pag_Write(uint8_t address,uint8_t *data,uint8_t size)//AT24C02写数据函数  第一个参数是 AT24C02的要写页的地址 0-255,第二个参数是 缓冲区指针,第三个参数是 要写的字节数//不能超过8个字节
  92. {
  93.     uint8_t i;
  94.     IIC_Stop();
  95.     for(i=0;i<100;i++)
  96.     {
  97.         IIC_Start();
  98.         IIC_Send_Byte(0xa0);
  99.         if(Wait_Ack()==0)
  100.             {
  101.                 break;
  102.             }
  103.     }
  104.     if(m=100)
  105.     {
  106.         IIC_Stop();
  107.         return 0;   
  108.     }
  109.     IIC_Send_Byte(address);
  110.     if(Wait_Ack())
  111.         {
  112.                IIC_Stop();
  113.             return 0;
  114.         }
  115.     for(i=0;i<size;i++)
  116.     {
  117.         IIC_Send_Byte(*(data+i));
  118.         if(Wait_Ack())
  119.             {
  120.                 IIC_Stop();
  121.                 return 0;
  122.             }
  123.     }
  124.     IIC_Stpo();
  125.     return 1;
  126. }
  127. uint8_t AT24C02_Write(uint8_t address,uint8_t *data,uint8_t size)//对任意AT24C02的地址进行写操作  其中第一个参数是 AT24C02要写的地址 第二个参数是 缓冲区指针 第三个参数是 要写的字节数 0-255;
  128. {
  129.     uint8_t Page=0;//所需要的页数
  130.     uint8_t Cont=0;//不足一页的字节数
  131.     uint8_t Add_Pag=0;//某一页已经写了的字节数
  132.     uint8_t Sur=0;//某一页还能写的字节数
  133.    
  134.     Page=size/8;
  135.     Cont=size%8;
  136.     Add_Pag=address%8;
  137.     Sur=8-Add_Pag;
  138.    
  139.     if(Add_Pag==0)
  140.     {
  141.         if(Page==0)
  142.         {
  143.             AT24C02_Pag_Write(address,data,size);
  144.             Delay();//此函数没有定义 需要自己定义 大约延时2000us
  145.         }
  146.         else
  147.         {
  148.             while(Page--)
  149.             {
  150.                 AT24C02_Pag_Write(address,data,8);
  151.                 Delay();
  152.                 address+=8;
  153.                 data+=8;
  154.             }
  155.             if(Cont!=0)
  156.             {
  157.                 AT24C02_Pag_Write(address,data,Cont);
  158. Delay(2000);
  159.             }
  160.         }
  161.     }
  162.     else
  163.     {
  164.         if(Page==0)
  165.         {
  166.             if(Sur>=size)
  167.             {
  168.                 AT24C02_Pag_Write(address,data,size);
  169.                 Delay;
  170.             }
  171.             else
  172.             {
  173.                 AT24C02_Pag_Write(address,data,Sur);
  174.                 Delay;
  175.                 address+=Sur;
  176.                 data+=Sur;
  177.                 AT24C02_Pag_Write(address,data,size-Sur) ;
  178.                 Delay;
  179.             }
  180.         }
  181.         else
  182.         {
  183.             AT24C02_Pag_Write(address,data,Sur);
  184. Delay(2000);
  185. address+=Sur;
  186. data+=Sur;
  187. Page=size/8;
  188. Cont=size%8;
  189. Add_Page=address%8;
  190. Sur=8-Add_Page;
  191. if(Page==0)//
  192. {
  193.         AT24C02_Pag_Write(address,data,size);
  194.         Delay(2000);
  195. }
  196. else//
  197. {
  198. while(Page--)
  199. {
  200. AT24C02_Pag_Write(address,data,8);
  201. Delay(2000);
  202. address+=8;
  203. data+=8;
  204. }
  205.             if(Cont!=0)
  206. {
  207. AT24C02_Pag_Write(address,data,Cont);
  208. Delay(2000);
  209. }
  210. }
  211.         }
  212.     }
  213. }


  214. uint8_t AT24C02_Read(uint8_t address,uint8_t *data,uint8_t size)//从AT24C02读取size个字节 第一个参数是 读AT24C02 的数据的首地址 第二个参数是 缓冲区指针 第三个参数是 要读取的字节数
  215. {
  216.     uint8_t i;
  217.     IIC_Start();
  218.     IIC_Send_Byte(0xa0);
  219.     if(Wait_Ack())
  220.     {
  221.         IIC_Stop();
  222.         return 0;
  223.     }
  224.     IIC_Send_Byte(address)
  225.     if(Wait_Ack())
  226.     {
  227.         IIC_Stop();
  228.         return 0;
  229.     }
  230.     IIC_Start();
  231.     IIC_Send_Byte(0xa1);
  232.     if(Wait_Ack())
  233.     {
  234.         IIC_Stop();
  235.         return 0;
  236.     }
  237.     for(i=0;i<size;i++)
  238.     {
  239.         *(data+i)=IIC_Read_Byte();
  240.         if(i!=size-1)
  241.         {
  242.             Ack();
  243.         }
  244.         else
  245.         {
  246.             NAck();
  247.         }
  248.     }
  249.     IIC_Stop();
  250.     return 1;
  251. }
复制代码


评分

参与人数 1黑币 +5 收起 理由
细风 + 5 很给力!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表