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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

關于AT24C02芯片的讀寫問題詳解,基于TX-1C單片機開發板

[復制鏈接]
ID:285031 發表于 2018-5-6 12:45 | 顯示全部樓層 |閱讀模式
作為基礎入門級的TX-1C開發板,里面有AT24C02芯片,在編寫程序時很多童鞋無法順利使用該芯片。
我作為初學者也是搗鼓了兩天,在詳細閱讀了datasheet之后,終于明白癥結所在,在這里和大家分享一下。

TX-1C的開發板,都已經焊接好電路,需要我們做的只是寫一下驅動程序。

該芯片可以采用IIC總線進行操作。時序圖請大家參照datasheet(附件),之前很多童鞋遇到時序圖寫對但是數據讀寫錯誤的問題。
我也遇到了,這里應該注意芯片每次字節寫操作(byte write opeartion)完成后,需要10ms的延時,用于芯片內部把數據轉化為不可擦除的。這段期間芯片對讀寫信號是不響應的。如果這段時間進行讀數據操作,就會出現錯誤。

另外,對于AT24C02芯片,2Kbit的EEPROM,也就是256Byte的大小,數據地址從0x00-0xff。需要注意的是,這個芯片是每8byte是一頁,一共32頁,這個在字節寫操作(byte write opeartion)里面沒影響,但是如果你想連續進字節,就需要注意了(AT24C04及以上型號都是16byte一頁)。在頁寫操作里面
(page write opeartion),一次連續寫只能寫一頁(8byte),只是因為芯片內部每寫完一個字節,數據地址就自加1,但是寫到這一頁的結尾,指針就會調到這一頁的開頭,而不是跳到下一頁的開頭,如果繼續寫,就會覆蓋前面的數據。寫完這一頁就要stop,在延時10ms,轉化為不可擦除數據。之后,重新開始start,寫下一頁。這是非常需要注意的。



讀操作沒有這個問題,字節讀取不需要延時10ms(讀不需要不可擦除的轉化),如果連續讀也不存在頁的問題,因為讀完一個字節,地址指針會跳到下一個字節,從0x00一直到0xff(我想是因為在寫操作的時候芯片需要轉化為不可擦除的過程限制,芯片可能沒有辦法把0x00-0xff這么多字節一次性都轉化為不可擦除的,所以才需要分頁寫)。



好了,要點已經講完(以上都是在datasheet,write/read operation上看到的,如果沒看明白可以參考原文),上代碼了。

代碼有點長,但是非常robust!!里面把ByteWrite,PageWrite,RandRead,SeqRead的代碼都寫進去,而且返回值是表示操作狀態

0表示操作錯誤,1表示操作正確,Read出來的數據都存在了外部變量AT24C02_data[]數組里面,我定義的最大容量是30,大家可以根據需要自己更改。

經過封裝以后可以直接作為AT24C02的驅動函數。

main函數是我寫的測試函數,如果讀寫過程有錯誤會有很長的蜂鳴器,如果正確,每個周期后會有短促的蜂鳴。希望對大家有啊幫助。

單片機源碼:
  1. #include <reg52.h>
  2. #include <intrins.h>

  3. #define MAXIUM 30
  4. #define uint unsigned int
  5. #define uchar unsigned char
  6.    
  7. sbit SDA=P2^0;
  8. sbit SCL=P2^1;
  9. sbit beep=P2^3;

  10. uchar AT24C02_data[MAXIUM];

  11. void delay(uint ms){
  12.     uint j,k;
  13.     for(j=ms;j>0;j--)
  14.         for(k=110;k>0;k--);
  15. }
  16. void nop(){
  17.     _nop_();
  18.     _nop_();
  19. }
  20. void AT24C02_Start(){
  21.     SDA=1;
  22.     nop();
  23.     SCL=1;
  24.     nop();
  25.     SDA=0;
  26.     nop();
  27.     SCL=0;
  28.     nop();
  29. }
  30. void AT24C02_Stop(){
  31.     SDA=0;
  32.     nop();
  33.     SCL=1;
  34.     nop();
  35.     SDA=1;
  36.     nop();
  37.     SCL=0;
  38.     nop();
  39. }

  40. void AT24C02_SendAck(){
  41.     SDA=0;
  42.     nop();
  43.     SCL=1;
  44.     nop();
  45.     SCL=0;
  46.     nop();
  47.     SDA=1;
  48.     nop();
  49. }

  50. uchar AT24C02_RecAck(){
  51.     uchar i,flag;
  52.     flag=0;
  53.     i=0;
  54.     SCL=1;
  55.     nop();
  56.     while((SDA==1)&&(i<255)) i++;
  57.     if(i==255) flag=1;
  58.     SCL=0;
  59.     nop();
  60.     return flag;
  61. }
  62. void AT24C02_Write(uchar dat){
  63.     uchar i,temp;
  64.     temp=dat;
  65.     for(i=0;i<8;i++){
  66.         temp=temp<<1;
  67.         SDA=CY;
  68.         nop();
  69.         SCL=1;
  70.         nop();
  71.         SCL=0;
  72.         nop();
  73.     }
  74.     SDA=1; nop();
  75. }
  76. uchar AT24C02_Read(){
  77.     uchar i,temp;
  78.     for(i=0;i<8;i++){
  79.         SCL=1;
  80.         nop();
  81.         temp=(temp<<1)|SDA;
  82.         SCL=0;
  83.         nop();
  84.     }
  85.     return temp;
  86. }
  87. //Return data is the state(0 means fault, 1 means success);
  88. uchar AT24C02_ByteWrite(uchar add, uchar dat){
  89.     uchar flag;
  90.     flag=0;
  91.     AT24C02_Start();
  92.     AT24C02_Write(0xa0);
  93.     if(!AT24C02_RecAck()){
  94.         AT24C02_Write(add);
  95.         if(!AT24C02_RecAck()){
  96.             AT24C02_Write(dat);
  97.             if(!AT24C02_RecAck()) flag=1;
  98.         }
  99.     }
  100.     AT24C02_Stop();
  101.     delay(10);
  102.     return flag;
  103. }
  104. //data word add(0x00-0xff) must be divided by 8(32 in total);
  105. //*p points to 8 uchar array;
  106. //Return data is the state(0 means fault, 1 means success);

  107. uchar AT24C02_PageWrite(uchar add, uchar *dat){
  108.     uchar flag;
  109.     uchar i, *p;
  110.     flag=0;
  111.     p=dat;
  112.     AT24C02_Start();
  113.     AT24C02_Write(0xa0);
  114.     if(!AT24C02_RecAck()){
  115.         AT24C02_Write(add);
  116.         if(!AT24C02_RecAck()){
  117.             for(i=0;i<8;i++){
  118.                 AT24C02_Write(*(p+i));
  119.                 if(AT24C02_RecAck()) break;  
  120.             }
  121.             if(i==8) flag=1;
  122.         }
  123.     }
  124.     AT24C02_Stop();
  125.     delay(10);
  126.     return flag;
  127. }

  128. //Data is saved in external variable AT24C02_data[0];
  129. //Return data is the state(0 means fault, 1 means success);
  130. uchar AT24C02_RandRead(uchar add){
  131.     uchar flag;
  132.     flag=0;
  133.     AT24C02_Start();
  134.     AT24C02_Write(0xa0);
  135.     if(!AT24C02_RecAck()){
  136.         AT24C02_Write(add);
  137.         if(!AT24C02_RecAck()){
  138.             AT24C02_Start();
  139.             AT24C02_Write(0xa1);
  140.             if(!AT24C02_RecAck()){
  141.                 AT24C02_data[0]=AT24C02_Read();
  142.                 AT24C02_Stop();
  143.                 flag=1;
  144.             }
  145.         }
  146.     }
  147.     return flag;
  148. }
  149. //Data is saved in external variable AT24C02_data[0],maxium num is 30;
  150. //Return data is the state(0 means fault, 1 means success;

  151. uchar AT24C02_SeqRead(uchar add,uchar num){
  152.     uchar i,flag;
  153.     flag=0;
  154.     AT24C02_Start();
  155.     AT24C02_Write(0xa0);
  156.     if(!AT24C02_RecAck()){
  157.         AT24C02_Write(add);
  158.         if(!AT24C02_RecAck()){
  159.             AT24C02_Start();
  160.             AT24C02_Write(0xa1);
  161.             if(!AT24C02_RecAck()){
  162.                 for(i=0;i<num-1;i++){
  163.                     AT24C02_data[ i]=AT24C02_Read();
  164.                     AT24C02_SendAck();
  165.                 }
  166.                 AT24C02_data[ i]=AT24C02_Read();
  167.                 AT24C02_Stop();
  168.                 flag=1;
  169.             }
  170.         }
  171.     }
  172.     return flag;
  173. }


  174. void main(){
  175.     uchar i;
  176.     uchar array[8]={1,2,3,4,5,6,7,8};
  177.    
  178.     for(i=0;i<MAXIUM;i++) AT24C02_data[ i]=0;
  179.     P1=0x00;
  180.     delay(1000);
  181.    
  182.     if(AT24C02_ByteWrite(0x00,0xff)){
  183.         if(!AT24C02_RandRead(0x00)){
  184.             beep=0;
  185.             delay(2000);
  186.             beep=1;
  187.         }
  188.     }
  189.     else{
  190.         beep=0;
  191.         delay(1000);
  192.         beep=1;
  193.     }
  194.     P1=AT24C02_data[0];
  195.     delay(1000);
  196.    
  197.     if(AT24C02_PageWrite(0x00,array)){
  198.         if(!AT24C02_SeqRead(0x00,8)){
  199.             beep=0;
  200.             delay(2000);
  201.             beep=1;
  202.         }
  203.     }
  204.     else{
  205.         beep=0;
  206.         delay(1000);
  207.         beep=1;
  208.     }
  209.     while(1){
  210.         for(i=0;i<8;i++){
  211.             P1=AT24C02_data[ i];
  212.             delay(1000);
  213.         }
  214.         beep=0;
  215.         delay(100);
  216.         beep=1;
  217.     }
  218. }
復制代碼


資料下載:
00_AT24C02A.pdf (184.52 KB, 下載次數: 11)

評分

參與人數 1黑幣 +100 收起 理由
admin + 100 共享資料的黑幣獎勵!

查看全部評分

回復

使用道具 舉報

ID:285031 發表于 2018-5-6 12:47 | 顯示全部樓層
自己搶沙發。。。
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲人人舔人人 | 日韩在线免费播放 | 国产特级毛片aaaaaa喷潮 | 99re6热在线精品视频播放 | 久久国产激情视频 | 91麻豆精品国产91久久久更新资源速度超快 | 日本中出视频 | 国产日韩欧美在线观看 | 91免费电影 | 亚洲视频一区在线 | 久久精品色欧美aⅴ一区二区 | 99视频免费在线观看 | xxxxxx国产| 日韩字幕 | 成人免费网站视频 | 久久丁香 | 99久久精品视频免费 | 欧美精品片 | 亚洲欧美在线观看 | 亚洲网站在线观看 | 国产免费福利小视频 | 玖玖免费| 国产无人区一区二区三区 | 欧美一区二区三区在线观看 | 国产欧美综合在线 | av一区二区在线观看 | 涩涩操 | 国产精品久久久久久婷婷天堂 | 超碰激情 | 国产超碰人人爽人人做人人爱 | 欧美成年黄网站色视频 | 久久黄色网 | 精品一区二区三区不卡 | 黄色毛片免费 | 亚洲综合视频 | 综合激情网 | 国产精品日韩欧美一区二区 | www.午夜 | 全免费a级毛片免费看视频免 | 欧美va大片| 亚洲草草视频 |