久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2773|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

AT24C02 IIC驅(qū)動 C代碼

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:75926 發(fā)表于 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函數(shù)
  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函數(shù)
  18. {
  19.     SDA_L;
  20.     SCL_H;
  21.     Wait;
  22.     SDA_H;
  23. }
  24. void IIC_Send_Byte(uint8_t data)//想IIC器件發(fā)送8個位數(shù)據(jù)
  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位數(shù)據(jù)
  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)//等待應(yīng)答
  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)//發(fā)送應(yīng)答
  73. {
  74.     SDA_L;
  75.     Wait;
  76.     SCL_H;
  77.     Wait;
  78.     SCL_L;
  79.     Wait;
  80.     SDA_H;
  81. }

  82. void NAck(void)//發(fā)送非應(yīng)答
  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寫數(shù)據(jù)函數(shù)  第一個參數(shù)是 AT24C02的要寫頁的地址 0-255,第二個參數(shù)是 緩沖區(qū)指針,第三個參數(shù)是 要寫的字節(jié)數(shù)//不能超過8個字節(jié)
  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的地址進行寫操作  其中第一個參數(shù)是 AT24C02要寫的地址 第二個參數(shù)是 緩沖區(qū)指針 第三個參數(shù)是 要寫的字節(jié)數(shù) 0-255;
  128. {
  129.     uint8_t Page=0;//所需要的頁數(shù)
  130.     uint8_t Cont=0;//不足一頁的字節(jié)數(shù)
  131.     uint8_t Add_Pag=0;//某一頁已經(jīng)寫了的字節(jié)數(shù)
  132.     uint8_t Sur=0;//某一頁還能寫的字節(jié)數(shù)
  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();//此函數(shù)沒有定義 需要自己定義 大約延時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個字節(jié) 第一個參數(shù)是 讀AT24C02 的數(shù)據(jù)的首地址 第二個參數(shù)是 緩沖區(qū)指針 第三個參數(shù)是 要讀取的字節(jié)數(shù)
  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. }
復(fù)制代碼


評分

參與人數(shù) 1黑幣 +5 收起 理由
細風 + 5 很給力!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 中文字幕一区二区三区四区五区 | 91亚洲精选 | 黄色网址大全在线观看 | 国产精品美女久久久久久久久久久 | 久久视频免费看 | 99中文字幕 | 国产精品一区二区三区在线播放 | 免费观看黄网站 | 亚洲第1页 | 91玖玖 | 国产亚洲人成a在线v网站 | www.日本在线播放 | 99re6在线视频精品免费 | 日本aa毛片a级毛片免费观看 | 久久国产一区二区三区 | 亚洲精品一区二区三区蜜桃久 | 日韩久久在线 | 男人天堂免费在线 | 国产免费观看一级国产 | 一区二区三区欧美在线 | 毛片网站在线观看视频 | 日日草夜夜草 | 成人av看片 | 亚洲精品一区二区三区免 | 亚洲午夜精品一区二区三区他趣 | 日本亚洲欧美 | 999热视频| 国产二区视频 | 免费成人在线网站 | 国产精品久久久久无码av | 亚洲午夜精品视频 | 国产一区二区美女 | 欧美激情国产日韩精品一区18 | 日日日视频 | 亚洲久久久 | 国产精品免费一区二区三区 | 亚洲欧美一区二区三区1000 | 色片在线观看 | 99热精品在线 | 久色视频在线观看 | 日韩精品一区二区三区视频播放 |