[PIC®/AVR®/dsPIC®产品] 【CuriosityNano测评报告】+模拟I2C驱动AT24C32EEPROM

[复制链接]
1022|0
 楼主| hu9jj 发表于 2021-1-22 15:59 | 显示全部楼层 |阅读模式
    继模拟I2C驱动到DS1307日历模块之后,顺便测试了日历模块上附带的AT24C32EEPROM芯片,这是32K内存的EEPROM,共4096*8位,也就是说其内部地址最大为4096,超过了8位地址的最大值256,其内部寻址使用的是16位地址,在I2C向器件发送内部寻址时要先发送高8位的地址,再发送低8位的地址,其读写的代码如下:
  1. /******************************************************************************************
  2. * 函数名称: I2C_16bitByteRead()
  3. * 功能说明: 从指定地址addr开始获取1个字节的数据
  4. * 输    入: uint8_t I2Caddr 器件地址
  5. *           uint16_t addr        双字节数据地址
  6. * 输    出: uint8_t 返回读取的数值
  7. * 备    注:
  8. ******************************************************************************************/
  9. uint8_t SI2C_16bitByteRead(uint8_t I2Caddr,uint16_t addr)
  10. {
  11.     uint8_t dat;

  12.     SI2C_Start();              //产生起始信号
  13.     SI2C_Send(I2Caddr);  //发送器件地址及读写位,0表示写
  14.     if(SI2CIsAck())           //检测从设备是否有响应
  15.     {
  16.         SI2C_Stop();         //产生停止信号
  17.         return 2;
  18.     }
  19.     SI2C_Send(addr>>8);             //发送读取数据的起始地址高8位
  20.     if(SI2CIsAck())          //检测从设备是否有响应
  21.     {
  22.         SI2C_Stop();        //产生停止信号
  23.         return 3;
  24.     }
  25.     SI2C_Send(addr|0x0F);           //发送读取数据的起始地址低8位
  26.     if(SI2CIsAck())          //检测器件是否有响应
  27.     {
  28.         SI2C_Stop();        //产生停止信号
  29.         return 3;
  30.     }
  31.    
  32.     SI2C_Start();           //产生Repeated Start
  33.     SI2C_Send(I2Caddr|1);           //发送从设备芯片地址及读写位,1表示读
  34.     if(SI2CIsAck())        //检测从设备是否有响应
  35.     {
  36.         SI2C_Stop();       //产生停止信号
  37.         return 4;
  38.     }

  39.     dat = SI2C_Receive();
  40.     SI2CDoAck();

  41.     SI2CNoAck();         //从设备要求必须使用NOAck来结束数据读取

  42.     SI2C_Stop();         //产生停止信号

  43.     return dat;
  44. }


  45. /******************************************************************************************
  46. * 函数名称: I2C_16bitByteWrite()
  47. * 功能说明: 从指定地址addr开始写入1个字节的数据
  48. * 输    入: uint8_t I2Caddr 器件地址
  49. *           uint16_t addr        双字节数据地址
  50. * 输    出: uint8_t 返回读取的数值
  51. * 备    注:
  52. ******************************************************************************************/
  53. uint8_t SI2C_16bitByteWrite(uint8_t I2Caddr,uint16_t addr,uint8_t dat)
  54. {
  55.     SI2C_Start();         //产生起始信号
  56.     SI2C_Send(I2Caddr|0);           //发送从设备芯片地址及读写位,0表示写
  57.     if(SI2CIsAck())       //检测从设备是否有响应
  58.     {
  59.         SI2C_Stop();      //产生停止信号
  60.         return 1;
  61.     }
  62.     SI2C_Send(addr>>8);             //发送读取数据的起始地址
  63.     if(SI2CIsAck())        //检测从设备是否有响应
  64.     {
  65.         SI2C_Stop();       //产生停止信号
  66.         return 3;
  67.     }
  68.     SI2C_Send(addr|0x0F);           //发送读取数据的起始地址低8位
  69.     if(SI2CIsAck())        //检测器件是否有响应
  70.     {
  71.         SI2C_Stop();      //产生停止信号
  72.         return 3;
  73.     }

  74.     SI2C_Send(dat);
  75.     if(SI2CIsAck())        //检测从设备是否有响应
  76.     {
  77.         SI2C_Stop();      //产生停止信号
  78.         return 3;
  79.     }

  80.     SI2C_Stop();          //产生停止信号
  81.    
  82.     return 0;

  83. }


    下面是测试代码,在主循环中每秒钟调用一次:
  1. void AT24C32_Test(void)
  2. {
  3.     uint8_t Txt[16];
  4.     SI2C_16bitBuffRead( 0xA0, 0, 16, Txt);
  5.     LCD_write_ASCII(0, 5, 1, Txt);
  6.     Txt[0] = 'D';
  7.     Txt[1] = year / 1000 + 0x30;
  8.     Txt[2] = year % 1000 / 100 + 0x30;
  9.     Txt[3] = year % 100 / 10 + 0x30;
  10.     Txt[4] = year % 10 + 0x30;
  11.     Txt[5] = month / 10 + 0x30;
  12.     Txt[6] = month % 10 + 0x30;
  13.     Txt[7] = day / 10 + 0x30;
  14.     Txt[8] = day % 10 + 0x30;
  15.     Txt[9] = hour / 10 + 0x30;
  16.     Txt[10] = hour % 10 + 0x30;
  17.     Txt[11] = minute / 10 + 0x30;
  18.     Txt[12] = minute % 10 + 0x30;
  19.     Txt[13] = second / 10 + 0x30;
  20.     Txt[14] = second % 10 + 0x30;
  21.     Txt[15] = 0;
  22.     SI2C_16bitBuffWrite( 0xA0, 0, 16, Txt);
  23. }


    这是测试过程的照片:


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:Microchip
简介:让我们来为您提供帮助。我们可提供各种资源来帮助您解决一切问题。是否需要与我们的客户支持团队联系?您可以通过电话、在线聊天功能或电子邮件与他们联系。

151

主题

1063

帖子

11

粉丝
快速回复 在线客服 返回列表 返回顶部