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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6028|回復: 1
收起左側

stm8用IIC讀寫24c02源程序

[復制鏈接]
ID:170809 發表于 2017-3-15 09:06 | 顯示全部樓層 |閱讀模式
給大家分享一個 stm8單片機用IIC總線方式讀寫24c02存儲芯片 里面是自己寫的程序
0.png
完整源碼下載:
4.I2C 24C02.rar (396.59 KB, 下載次數: 85)


下面是部分文件預覽:
  1. #include"i2c.h"

  2. uint8_t receive[N],send[N];             //全局數組變量

  3. void I2C_Start()       //發送起始信號——在SCL為高電平期間,SDA由高拉低
  4. {
  5.   SDA_OUT;
  6.   SDA_1;
  7.   SCL_1;
  8.   Delay_us(3);
  9.   SDA_0;
  10.   Delay_us(5);
  11.   SCL_0;
  12.   Delay_us(1);  
  13. }

  14. void I2C_Stop()          //結束信號——在SCL為高電平期間,SDA由低拉高
  15. {
  16.    SDA_OUT;
  17.    SDA_0;
  18.    SCL_0;
  19.    Delay_us(1);
  20.    SCL_1;
  21.    Delay_us(3);
  22.    SDA_1;
  23.    Delay_us(5);
  24.    SCL_0;  
  25.    Delay_us(1);
  26. }

  27. void I2C_Ack()            //檢測應答——第9個時鐘周期時,由24C16將SDA拉低
  28. {
  29.   SDA_1;
  30.   Delay_us(3);
  31.   SDA_IN;
  32.   Delay_us(1);
  33.   SCL_1;
  34.   Delay_us(2);
  35.   SCL_0;
  36.   Delay_us(3);
  37. }
  38. uint8_t I2C_Ack2()          //檢測應答2
  39. {

  40.   SDA_1;
  41.   Delay_us(3);
  42.   SDA_IN;
  43.   Delay_us(2);  
  44.   SCL_1;
  45.   Delay_us(2);

  46. //  while(SDA);             //很快能完成應答,不需要等待,防止硬件故障導致出錯
  47.   SCL_0;
  48.   Delay_us(2);
  49.   return SDA;
  50. }


  51. uint8_t I2C_Send(uint8_t buffer)           //發送1個字節的數據
  52. {
  53.   uint8_t temp = 0;
  54.   uint8_t BitCnt = 7;
  55.   
  56.   SDA_OUT;             //SDA為輸出
  57.   Delay_us(1);
  58.   if((buffer&0x80)==0)    //由高位開始發送
  59.     SDA_0;
  60.   else
  61.     SDA_1;
  62.   Delay_us(1);
  63.   SCL_1;
  64.   Delay_us(1);
  65.   temp = buffer<<1;
  66.   buffer = temp;
  67.   while(BitCnt)
  68.   {
  69.     if((buffer&0x80)==0)
  70.     {
  71.       SCL_0;
  72.       SDA_0;
  73.     }
  74.     else
  75.     {
  76.       SCL_0;
  77.       SDA_1;
  78.     }
  79.     Delay_us(3);
  80.     SCL_1;
  81.     Delay_us(2);
  82.     temp = buffer<<1;
  83.     buffer = temp;
  84.     BitCnt--;
  85.   }
  86.   SCL_0;  
  87.   if(I2C_Ack2())           //發送8位數據后,檢測應答 0:無應答 1:有應答   
  88.     return 0;
  89.   else
  90.     return 1;  
  91. }


  92. uint8_t I2C_Receive()             //接收一個字節的數據
  93. {
  94.   uint8_t ReceiveData,i;
  95.   SDA_IN;               //SDA為輸入
  96.   Delay_us(1);
  97.   for(i=0;i<8;i++)      //SCL高電平時,記錄SDA,由高位開始
  98.   {
  99.     SCL_1;
  100.     Delay_us(2);        //延時的時間
  101.     if(SDA==0)
  102.       ReceiveData &= 0xfe;
  103.     else
  104.       ReceiveData |= 0x01;
  105.     if(i<7)
  106.       ReceiveData = ReceiveData<<1;

  107.     SCL_0;
  108.     Delay_us(1);
  109.   }
  110.   return ReceiveData;
  111. }

  112. void I2C_NoAck()                //接收數據后不發送應答
  113. {
  114.   SDA_1;
  115.   SDA_OUT;
  116.   SDA_1;
  117.   Delay_us(1);
  118.   SCL_1;
  119.   Delay_us(2);
  120.   SCL_0;
  121.   Delay_us(2);
  122.   SDA_0;
  123.   Delay_us(2);
  124. }

  125. void I2C_SendAck()              //接收數據后發送應答,由主機發送,告知24C16已經接收到一個字節的數據
  126. {
  127.   SDA_OUT;
  128.   SDA_0;
  129.   Delay_us(1);
  130.   SCL_1;
  131.   Delay_us(3);
  132.   SCL_0;
  133.   SDA_0;
  134.   Delay_us(2);
  135. }

  136. void I2C_Write_Byte(uint8_t addr,uint8_t data)       //向24C06寫入數據——單字節寫
  137. {                                                                  

  138.     I2C_Start();                                //起始信號
  139.     I2C_Send(0xa0);                             //發送器件地址
  140.     I2C_Send(addr);                             //發送字節地址
  141.     I2C_Send(data);                             //發送數據
  142.     I2C_Stop();                                 //結束信號
  143. }

  144. void I2C_Write_Page(uint8_t addr,uint8_t data)       //向24C06寫入數據——頁寫 16個字節
  145. {                                                                  
  146.   uint8_t i,j,k,p;
  147.   
  148.   if((N/16)==0)                 //判斷N是否小于16 是:一次頁寫即可完成   否:需要多次頁寫
  149.   {
  150.       I2C_Start();                              //起始信號
  151.       I2C_Send(0xa0);                           //發送器件地址
  152.       I2C_Send(addr);                           //發送字節地址
  153.       for(j=0;j<N;j++)
  154.       {  
  155.         send[j] = data+j;
  156.         I2C_Send(send[j]);                      //發送數據      
  157.       }
  158.       I2C_Stop();                               //結束信號     
  159.       Delay_ms(5);
  160.   }
  161.   else                                          //多次頁寫
  162.   {
  163.     for(i=0;i<(N/16);i++)                       //i次頁寫
  164.     {
  165.       I2C_Start();                              //起始信號
  166.       I2C_Send(0xa0);                           //發送器件地址
  167.       I2C_Send(addr+i*16);                      //發送字節地址
  168.       for(j=0;j<16;j++)
  169.       {  
  170.         send[i*16+j] = data+i*16+j;
  171.         I2C_Send(send[i*16+j]);                 //發送數據      
  172.       }
  173.       I2C_Stop();                               //結束信號  
  174.       Delay_ms(5);
  175.     }
  176.    
  177.     if(N%16)                                    //寫剩余的數據
  178.     {
  179.       p=N-(N%16);
  180.       I2C_Start();                              //起始信號
  181.       I2C_Send(0xa0);                           //發送器件地址   
  182.       I2C_Send(addr+p);                         //發送字節地址
  183.       for(k=0;k<(N%16);k++)  
  184.       {  
  185.         send[i*16+k] = data+i*16+k;
  186.         I2C_Send(send[i*16+k]);                 //發送數據      
  187.       }
  188.       I2C_Stop();                               //結束信號
  189.       Delay_ms(5);
  190.     }
  191.   }
  192. }


  193. void I2C_Read2(uint8_t add_start)//連續讀
  194. {
  195.   uint8_t i;
  196.   
  197.   I2C_Start();                  //起始信號
  198.   I2C_Send(0xa0);               //發送器件地址——寫
  199.   I2C_Send(add_start);          //發送字節地址
  200.   I2C_Start();                  //起始信號
  201.   I2C_Send(0xa1);               //發送器件地址——讀
  202.   for(i=0;i<N-1;i++)
  203.   {  
  204.     receive[i]=I2C_Receive();
  205.     I2C_SendAck();              //主機發送應答,繼續讀
  206.   }
  207.   receive[i]=I2C_Receive();
  208.   I2C_NoAck();                  //第九個周期發送不應答
  209.   I2C_Stop();                   //停止信號
  210. // return receive;
  211. }


  212. uint8_t I2C_Read(uint8_t addr)                  //從24C06讀出數據  
  213. {
  214.   uint8_t receive;
  215.   I2C_Start();                  //起始信號
  216.   I2C_Send(0xa0);               //發送器件地址——寫
  217.   I2C_Send(addr);               //發送字節地址
  218.   I2C_Start();                  //起始信號
  219.   I2C_Send(0xa1);               //發送器件地址——讀
  220.   receive=I2C_Receive();        //讀出數據
  221.   I2C_Stop();                 //停止信號,結束讀數據操作
  222.   return receive;
  223. }  

  224. void I2C_Ack_Check()          //應答查詢
  225. {
  226.   I2C_Start();
  227.   I2C_Send(0xa0);
  228.   I2C_Ack2();
  229. }

  230. /*
  231. void test_1(uint8_t add,uint8_t data)     //單次測試
  232. {
  233.   uint8_t test=0;
  234.   I2C_Write_Byte(add,data);
  235.   Delay_ms(5);
  236.   test = I2C_Read(add);

  237.   if(test==data)
  238.     LED = LED1;
  239.   else
  240.     LED = LED2;
  241. }

  242. void test_write(uint8_t add,uint8_t data)     //測試_寫
  243. {
  244.   
  245.   I2C_Write_Byte(add,data);
  246.   Delay_ms(5);
  247. }  
  248. uint8_t test_read(uint8_t add)                //測試_讀
  249. {
  250.   uint8_t test=0;
  251.   test = I2C_Read(add);
  252.   return test;
  253. }

  254. void test1(uint8_t add_start)                  //測試函數1  
  255. {
  256.   uint8_t read[N]={0},write[N]={0},i,k=0;
  257.   
  258.   for(i=0;i<N;i++)
  259.   {
  260.     write[i]=0x02+i;
  261.     test_write(add_start+i,write[i]);
  262.   }
  263.   
  264.   for(i=0;i<N;i++)
  265.   {
  266.     read[i]=test_read(add_start+i);
  267.   }
  268.   for(i=0;i<N;i++)
  269.   {
  270.     if(write[i]==read[i])
  271.       k+=1;
  272.   }
  273.   if(k==N)
  274.     LED = LED1;
  275.   else
  276.     LED = LED2;
  277. }
  278. */
  279. void test2(uint8_t add_start,uint8_t data)                  //測試函數2  
  280. {
  281.   uint8_t i,k=0;
  282.   I2C_Write_Page(add_start,data);
  283.   I2C_Read2(add_start);
  284.   for(i=0;i<N;i++)
  285.   {
  286.     if(receive[i]==send[i])
  287.       k+=1;
  288.   }
  289.   if(k==N)
  290.     LED = LED1;
  291.   else
  292.     LED = LED2;
  293.   for(i=0;i<N;i++)
  294.   {
  295.     receive[i]=0;
  296.     send[i]=0;
  297.   }
  298.   
  299. }


  300. #pragma vector=5                //PA口的中斷服務函數
  301. __interrupt void PORTA_IRQHandler(void)
  302. {
  303.   Delay_ms(20);                 //軟件消抖
  304.   if(!(PA_IDR&0x04))
  305.   {
  306.     Delay_ms(20);
  307.     while(!(PA_IDR&0x04));

  308.     test2(0x00,0x06);
  309.   }
  310. }
復制代碼


回復

使用道具 舉報

ID:99174 發表于 2017-3-23 19:26 | 顯示全部樓層
建議,延時加長,數據手冊上說的是4.7us. 應答信號要加防出錯標志,不等直接過,大批量的生產就會出問題
回復

使用道具 舉報

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

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 青青草精品 | 一区二区三区四区视频 | www一级片 | 人人精品 | 欧美精品电影一区 | www.性色| 中文字幕成人av | 中文字幕日韩一区 | 亚洲天堂成人在线视频 | 99精品一级欧美片免费播放 | 精品视频国产 | 国产精品久久精品 | 欧美日韩精品一区二区 | 亚洲欧美日韩系列 | 国产99久久久国产精品下药 | 中文字幕精品一区 | 免费成人高清在线视频 | 国产视频在线观看一区二区三区 | 二区中文 | 日韩网站免费观看 | 中文字幕一区二区在线观看 | 国产永久免费 | 亚洲一区二区三区在线播放 | 草久久久 | 欧美中文字幕在线观看 | 日韩在线不卡 | 国产精品免费观看 | 蜜月va乱码一区二区三区 | 国产伦精品一区二区三区精品视频 | 成人在线观看网站 | 自拍偷拍亚洲一区 | 亚洲一区二区三区四区五区午夜 | 黄网免费| 欧美久久一区二区三区 | 国产精品亚洲综合 | 国产1区2区 | 欧美一级黄色网 | 亚洲欧美在线视频 | 中文字幕一区在线 | 美女久久 | 色网在线看 |