AT24C01-AT24C256通用源程序(C51)

 据说是AT24C01-AT24C256通用源程序,但按照我的经验,这个源程序仅适合AT24C04-AT24C256。

 

  1. /*Sample:
  2. /*main(){    ...
  3. /*    ReadMem(l,x,y);    /*读。l为本次访问的器件号,在宏定义时分配不同芯片的不同
  4. 器件号,
  5.             x为本次欲读出的字节数;y为本次读数的起始地址*/
  6. /*    ...
  7. /*    WriteMem(l,x,y);    /*写。l为本次访问的器件号,在宏定义时分配不同芯片不同
  8. 的器件号,
  9.             x为本次欲写入的字节数;y为本次写数的起始地址,
  10.             注:当心页写入的地址规律,即页地址在同一页内滚动;否则会出现页溢出*/ 
  11. /*}*/
  12. #define    Wait_1us    {_nop_();_nop_();}
  13. #define    Wait_2us    {Wait_1us;Wait_1us;}
  14. #define    Sla_Wr        0xa0    /*0000 0 0 0 0*/
  15. #define    Sla_Rd        0xa1    /*0000 0 0 0 1*/
  16. #define    AT24C01      0x01
  17. #define    AT24C01A     0x02
  18. #define    AT24C02      0x03
  19. #define    AT24C04      0x04
  20. #define    AT24C08      0x05
  21. #define    AT24C16      0x06
  22. #define    AT24C32      0x07
  23. #define    AT24C64      0x08
  24. #define    AT24C128     0x09
  25. #define    AT24C256     0x0a
  26. #define    AT24C512     0x0b
  27. #define    Mem_Size    AT24C256     // 01/01A/02/04/08/16/32/64/128/256/512
  28. #define    Chip_1        0x00     //本器件的器件地址,可以第一8个不同地址的芯片使之能用同一段程序进行读写
  29. sbit    bSda        =P3^7;
  30. sbit    bScl        =P3^6;    
  31. bit bScan_Err;
  32. unsigned char idata cShare_Buf[8]={0,1,2,3,4,5,6,7};    //I2c read and write buffer
  33. void Start_I2c(void);
  34. void End_I2c(void);
  35. unsigned char Scan_I2c();
  36. void Send_I2c(unsigned char cData);
  37. void Send_Ack(void);
  38. void Send_Not_Ack(void);
  39. void Write_Mem(unsigned char cMem_Size,cChips_Address,cData_Size,unsigned int 
  40. cStart_Address);
  41. void Read_Mem(unsigned char cMem_Size,cChips_Address,cData_Size,unsigned int 
  42. cStart_Address);
  43. /************Name:ScanI2c***********
  44. Function:read 1byte from 24C01/512
  45. NO.:1
  46. Run time:79us    1=4+2us    0=5+1us    f=111kbps/83.3Kbps
  47. **********Function Start************/
  48. void Start_I2c(void)
  49. {
  50.     unsigned char /*idata*/ i;
  51.     bSda=bScl=1;
  52.     for(i=0;i<2;i++);     //wait 7us
  53.     bSda=0;
  54.     for(i=0;i<2;i++);     //wait 7us
  55.     bScl=0;
  56. }
  57. /**********Function End*************/
  58. /************Name:ScanI2c***********
  59. Function:read 1byte from 24C01/512
  60. NO.:1
  61. Run time:79us    1=4+2us    0=5+1us    f=111kbps/83.3Kbps
  62. **********Function Start************/
  63. void End_I2c(void)
  64. {
  65.     unsigned char /*idata*/ i;
  66.     bSda=0;
  67.     bScl=1;
  68.     for(i=0;i<2;i++);     //wait 7us
  69.     bSda=1;
  70. }
  71. /**********Function End*************/
  72. /************Name:ScanI2c***********
  73. Function:read 1byte from 24C01/512
  74. NO.:1
  75. Run time:79us    1=3/5us    0=1/5us    f=250/100kbps
  76. **********Function Start************/
  77. unsigned char Scan_I2c()
  78. {
  79.     unsigned char /*idata*/ i,j;//IIC data
  80.     bSda=1;
  81.     j=0;
  82.     for(i=0;i<8;i++)
  83.     {
  84.         bScl=1;
  85.         j<<=1;
  86.         Wait_2us;
  87.         j|=bSda;  
  88. //Scan 0    Scan 1
  89.         bScl=0;
  90.         Wait_2us;
  91.         Wait_2us;
  92.     }
  93.     return j;
  94. }
  95. /**********Function End*************/
  96. /************Name:SendI2c***********
  97. Function:Send 1byte to 24C01/512
  98. NO.:2
  99. Run time:82us    1=1/3us    0=3us    f=250/100kbps
  100. **********Function Start************/
  101. void Send_I2c(unsigned char cData)
  102. {
  103.     unsigned char /*idata*/ i;
  104.     for(i=0;i<8;i++)
  105.     {
  106.         bSda=(bit)(cData&0x80);
  107.         bScl=1;
  108.         cData<<=1;
  109.         Wait_2us;
  110.         Wait_2us;
  111.         bScl=0;
  112.         Wait_2us;
  113.     }
  114.     bSda=bScl=1;     //检测ACK
  115.     for(i=0;(bSda==1)&&(bScan_Err==0);i++)
  116.     {
  117.         if(i==30)        
  118.             bScan_Err=1; //如果101us没有响应就错误
  119.     }
  120.     bScl=0;
  121. }
  122. /**********Function End************/
  123. /************Name:SendAck***********
  124. Function:Send ack
  125. NO.:3
  126. Run time:10us+4us
  127. **********Function Start************/
  128. void Send_Ack(void)
  129. {
  130.     unsigned char /*idata*/ i;
  131.     bSda=0;
  132.     bScl=1;
  133.     for(i=0;i<2;i++);    //wait 8us
  134.     bScl=0;
  135.     bSda=1;
  136. }
  137. /**********Function End*************/
  138. /************Name:SendNotAck***********
  139. Function:send not ack
  140. NO.:4
  141. Run time:10us+4us
  142. **********Function Start************/
  143. void Send_Not_Ack(void)
  144. {
  145.     unsigned char /*idata*/ i;
  146.     bScl=bSda=1;
  147.     for(i=0;i<2;i++);    //wait 8us
  148.     bScl=0;
  149. }    
  150. /**********Function End*************/
  151. /************Name:WriteMem***********
  152. Function:write data to 24C01/512
  153. NO.:5
  154. Run time:80us(1byte)*cData_Size+
  155. **********Function Start************/
  156. void Write_Mem(unsigned char cMem_Size,cChips_Address,cData_Size,unsigned int cStart_Address)
  157. {
  158.     unsigned char /*idata*/ i,cAddress[2];    //0-L;1-H
  159.     bScan_Err=0;
  160.     cAddress[0]=cStart_Address;
  161.     cStart_Address>>=8;
  162.     cAddress[1]=cStart_Address;
  163.     i=Sla_Wr;
  164.     i|=cChips_Address;
  165.     if(cMem_Size==AT24C256)
  166.         i&=0xf7;
  167.     Start_I2c();
  168.     Send_I2c(i); //SLA:1010 xxx0
  169.     if(cMem_Size==AT24C256)     //1-16用1个字节地址,32-512用2个字节地址,匹配地址AT24C32、64
  170.         Send_I2c(cAddress[1]);     //先发送高字节地址
  171.     
  172.     Send_I2c(cAddress[0]); //如果是双字节地址则为低地址否则为高地址
  173.     for(i=0;(bScan_Err==0)&&(i!=cData_Size);i++)
  174.         Send_I2c(cShare_Buf[i]);    //写一个字节数据
  175.     End_I2c();
  176.     
  177. }
  178. /**********Function End*************/
  179. /************Name:ReadMem***********
  180. Function:Read data from 24C01/512
  181. NO.:6
  182. Run time:80us(1byte)*cData_Size+
  183. **********Function Start************/
  184. void Read_Mem(unsigned char cMem_Size,cChips_Address,cData_Size,unsigned int cStart_Address)
  185. {
  186.     unsigned char /*idata*/ i,cAddress[2];
  187.     
  188.     bScan_Err=0;
  189.     cAddress[0]=cStart_Address;     //将16位地址分解为高低字节
  190.     cStart_Address>>=8;
  191.     cAddress[1]=cStart_Address;
  192.     i=Sla_Wr;
  193.     i|=cChips_Address;
  194.     if(cMem_Size==AT24C256)
  195.         i&=0xf7;
  196.     Start_I2c();
  197.     Send_I2c(i);//SLA:1010 xxx0
  198.     if(cMem_Size==AT24C256)     //1-16用1个字节地址,32-512用2个字节地址,匹配地址AT24C32、64
  199.         Send_I2c(cAddress[1]);    //先发送高字节地址
  200.     Send_I2c(cAddress[0]); //address and write
  201.     i|=0x01;     //Read
  202.     Start_I2c();
  203.     Send_I2c(i); //address and  read
  204.     for(i=0;(bScan_Err==0)&&(i!=cData_Size);i++)
  205.     {
  206.         cShare_Buf[i]=Scan_I2c(); //读入第一个字节
  207.         if(i==(cData_Size-1))
  208.             Send_Not_Ack();            
  209.         else 
  210.             Send_Ack();
  211.     }
  212.     End_I2c();
  213. }
  214. /**********Function End*************/
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值