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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

24C02、24C16進(jìn)行字節(jié)、頁讀取、頁存取操作

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:372961 發(fā)表于 2019-9-26 12:25 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
本帖最后由 Vence 于 2019-9-26 12:51 編輯

以下這篇文章是自己折騰了三天存儲芯片后,并且能夠成功進(jìn)行字節(jié)操作、頁操作的一篇應(yīng)用型文章,不太想研究原理的可以直接采用本文的代碼和注意事項(xiàng)。

在對24C02或者24C16進(jìn)行字節(jié)、頁讀取、頁存取前,我們需要弄清楚I2C協(xié)議、24C02/24C16存儲空間、字節(jié)操作和頁操作的時(shí)序
————————————————
版權(quán)聲明:本文為CSDN博主「Pvence」的原創(chuàng)文章,遵循 CC 4.0 BY-SA 版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/weixin_40814407/article/details/101228190

I2C協(xié)議:I2C是什么協(xié)議網(wǎng)上進(jìn)行百度方可知道,以下只寫使用代碼

  1. void i2cStart(void)            //開始時(shí)序
  2. {
  3.   SDA=1;
  4.   SCL=1;
  5.   _delay(2);  //延時(shí)2μs
  6.   SDA=0;
  7.   _delay(2);
  8.   SCL=0;
  9. }

  10. void i2cStop(void)            //結(jié)束時(shí)序
  11. {
  12.   SDA=0;
  13.   _delay(2);
  14.   SCL=1;
  15.   _delay(2);
  16.   SDA=1;
  17. }

  18. void i2cAck_MCU(void)        //應(yīng)答時(shí)序
  19. {
  20.   SDA=0;
  21.   _delay(2);
  22.   SCL=1;
  23.   _delay(2);
  24.   SCL=0;
  25.   _delay(2);
  26.   SDA=1;
  27.   _delay(4);
  28. }


  29. void i2cNoAck_MCU(void)      //非應(yīng)答時(shí)序
  30. {
  31.   SDA=1;
  32.   _delay(2);
  33.   SCL=1;
  34.   _delay(2);
  35.   SCL=0;
  36.   _delay(2);
復(fù)制代碼
24C02/24C16存儲空間大小24C02就是有2Kbit = 2000/8 = 250個(gè)字節(jié),24C16就是有16kbit  = 2000個(gè)字節(jié),24C02一頁最多可以寫入8個(gè)字節(jié),因此可以分成32頁,24C16一頁最多可以寫入16個(gè)字節(jié),因此可以分成128頁。


字節(jié)寫操作
  1. void WriteByte_24LC16B(unsigned char input)
  2. {
  3.   unsigned char bit_count;
  4.   for(bit_count=8;bit_count!=0;bit_count--)
  5.   {
  6.     _delay(2);
  7.     SDA=(_Bool)(input&0x80);
  8.     _delay(2);
  9.     SCL=1;
  10.     _delay(2);
  11.     SCL=0;
  12.     input=input<<1;
  13.     _delay(2);
  14.   }
  15.   SDA=1;
  16.   SDA_CTRL=1;        //這里需要看自己使用的芯片設(shè)置SDA的IO口為輸入狀態(tài),我用的是HT45F67芯片,SDA端口設(shè)置為輸入狀態(tài),用于判斷SDA是否接到主機(jī)的應(yīng)答信號
  17.   _delay(2);
  18.   SCL=1;
  19.   _delay(2);
  20.   if(SDA == 1)
  21.           ack = 0;
  22.   else
  23.     ack = 1;
  24.   SCL=0;
  25.   SDA_CTRL=0;    //此處根據(jù)自己所使用的芯片將SDA所在的Io口設(shè)置為輸出狀態(tài)
  26. }

  27. void Write_24LC16B(unsigned char Wdata,unsigned int RomAddress)
  28. {
  29.   unsigned char block;
  30.   WriteDeviceAddress=0B10100000;
  31.   block=RomAddress/256;
  32.   RomAddress=RomAddress%256;
  33.   WriteDeviceAddress=WriteDeviceAddress|(block<<1);
  34.   i2cStart();
  35.   WriteByte_24LC16B(WriteDeviceAddress);
  36.   WriteByte_24LC16B((unsigned char)RomAddress);
  37.   WriteByte_24LC16B(Wdata);
  38.   i2cStop();
  39.   _delay(5500);
  40. }
復(fù)制代碼

字節(jié)讀操作

  1. unsigned char ReadByte_24LC16B()
  2. {
  3.   unsigned char bit_count,rbyte=0;
  4.   SDA=1;
  5.   SDA_CTRL=1;
  6.   _delay(10);
  7.   for(bit_count=8;bit_count!=0;bit_count--)
  8.   {
  9.     rbyte=rbyte<<1;
  10.     _delay(2);
  11.     SCL=1;
  12.     rbyte=rbyte|((unsigned char)(SDA));
  13.     _delay(2);
  14.     SCL=0;
  15.     _delay(2);
  16.   }
  17.   SDA_CTRL=0;
  18.   return(rbyte);
  19. }


  20. unsigned char Read_24LC16B(unsigned int RomAddress)
  21. {
  22.   unsigned char output,block;
  23.   ReadDeviceAddress=0B10100001;
  24.   WriteDeviceAddress=0B10100000;
  25.   block=RomAddress/256;
  26.   RomAddress=RomAddress%256;
  27.   WriteDeviceAddress=WriteDeviceAddress|(block<<1);
  28.   ReadDeviceAddress=ReadDeviceAddress|(block<<1);
  29.   i2cStart();
  30.   WriteByte_24LC16B(WriteDeviceAddress);
  31.   WriteByte_24LC16B((unsigned char)RomAddress);
  32.   i2cStart();
  33.   WriteByte_24LC16B(ReadDeviceAddress);
  34.   output=ReadByte_24LC16B();
  35.   i2cNoAck_MCU();
  36.   i2cStop();
  37.   _delay(2000);
  38.   return(output);  
  39. }
復(fù)制代碼

頁寫操作
  1. Wdata為輸入數(shù)組的首地址,RomAddress為需要進(jìn)行存儲的地址,范圍在0~2047之間,cnt為一次需要寫入的字節(jié)個(gè)數(shù),建議采用8的倍數(shù)的cnt,因?yàn)楸竞瘮?shù)不采用自動(dòng)分頁,不是8的倍數(shù)會(huì)在超出頁寫入最多的字節(jié)數(shù)之后覆蓋掉原來的數(shù)。
  2. void WritePage_24LC16B(unsigned char *Wdata,unsigned int RomAddress,unsigned char cnt)
  3. {
  4.   unsigned char block;
  5.   WriteDeviceAddress=0B10100000;
  6.   block=RomAddress/256;
  7.   RomAddress=RomAddress%256;
  8.   WriteDeviceAddress=WriteDeviceAddress|(block<<1);
  9.   i2cStart();
  10.   WriteByte_24LC16B(WriteDeviceAddress);
  11.   WriteByte_24LC16B((unsigned char)RomAddress);
  12.   while(cnt--)
  13.   {
  14.           WriteByte_24LC16B(*Wdata++);
  15.   }
  16.   i2cStop();
  17. }

  18. 注意:連續(xù)進(jìn)行多頁寫操作,需要在WritePage_24LC16B函數(shù)后添加150μs以上的延遲,這段時(shí)間,24C02內(nèi)部需要將數(shù)據(jù)存儲到芯片內(nèi)部。
  19. 例子:
  20. D_buffer[8] = {1,2,3,4,5,6,7,8};
  21. WritePage_24LC16B(D_buffer,0,8);
  22. _delay(150);        //延遲150μs以及以上
  23. WritePage_24LC16B(D_buffer,8,8);
復(fù)制代碼

頁讀操作
  1. void ReadPage_24LC16B(unsigned char *Rdata,unsigned int RomAddress,unsigned char cnt)
  2. {
  3.   unsigned char block;
  4.   ReadDeviceAddress=0B10100001;
  5.   WriteDeviceAddress=0B10100000;
  6.   block=RomAddress/256;
  7.   RomAddress=RomAddress%256;
  8.   WriteDeviceAddress=WriteDeviceAddress|(block<<1);
  9.   ReadDeviceAddress=ReadDeviceAddress|(block<<1);
  10.   i2cStart();
  11.   WriteByte_24LC16B(WriteDeviceAddress);
  12.   WriteByte_24LC16B((unsigned char)RomAddress);
  13.   i2cStart();
  14.   WriteByte_24LC16B(ReadDeviceAddress);
  15.   while(cnt>1)
  16.   {
  17.           *Rdata++ = ReadByte_24LC16B();
  18.           cnt--;
  19.           i2cAck_MCU();                        //發(fā)送完讀地址后,需要應(yīng)答一下
  20.   }
  21.   *Rdata = ReadByte_24LC16B();
  22.   i2cNoAck_MCU();                        //讀取最后一個(gè)字節(jié)需要非應(yīng)答
  23.   i2cStop();
  24.   _delay(2000);
  25. }
復(fù)制代碼






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

使用道具 舉報(bào)

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 久草色播| 91av视频在线播放 | 一区精品国产欧美在线 | 91视视频在线观看入口直接观看 | 亚洲精品视频在线 | 国产亚洲欧美在线视频 | 国产精品成人一区二区 | 天天干天天插天天 | 国产精品久久久久久久久久久免费看 | 欧美精品一二区 | av中文字幕网站 | 国产99久久精品一区二区永久免费 | 亚洲视频免费在线播放 | 国产区免费视频 | 欧美日本韩国一区二区三区 | 一区二区在线 | 国产精品99久久久久久人 | 国产美女特级嫩嫩嫩bbb片 | 日韩免费在线 | 91精品国产高清久久久久久久久 | 精品亚洲91 | 成人免费网站www网站高清 | 男女羞羞免费视频 | 国产精品一区二区在线观看 | 久色激情| 国产精品日韩一区二区 | 国产亚洲一区二区三区在线 | 欧美日韩亚洲国产 | 亚洲午夜精品视频 | 成人av高清在线观看 | 午夜在线视频 | 999国产精品视频 | 欧美在线综合 | 国产精品精品视频一区二区三区 | 亚洲成人一区二区三区 | 欧美在线资源 | 亚洲另类春色偷拍在线观看 | 久久99精品久久久久蜜桃tv | 国产一区二区三区在线免费 | 久久9久| 亚洲在线免费观看 |