由于工程需要,必须使用一个大容量的EEPROM才能够用,所以使用了16K的EEPROM,我使用的是FMD(辉芒微)公司的FT24C16A-ELR-T芯片,使用方式与AT24C16是一样的。
     首先我在网上搜索到的现成的代码,有一些地址码直接就是U8的,8位地址最多只能支持到256字节,16K的有2048个字节,所以地位需要用U16的才够用,后来找到地址是U16的示范代码,去测试开始是没有问题的,但是当容量超过256个字节后会出错了。

废话不多说,直接贴上我修改后的读写函数和初始化三大主要部分。大家如果和我一样,使用STM8S003F3F6的芯片读写16KEEPROM时按下面的使用,应该就没有问题了。下面的代码中部分是从其它作者的代码中复制过来的,由于太懒没有标明出处,望见谅。

#define I2C_SPEED             400000
#define I2C_SLAVE_ADDRESS7     0xA0

void IIC_Read(uint16_t Addr , unsigned char *buffer , unsigned short num)
{
  uint8_t Did;//设备ID
  uint8_t Tmp;//方便计算中间量
  Tmp=(Addr>>8);
  if (Addr>255) Did=0xA0+(Tmp*2); //这里的计算目的就是把超过256字节部分需要做页偏移的数值计算到后四位中的p0 p1 p2的前三个位置 
  else Did=0xA0;  
  
  while (I2C_GetFlagStatus(I2C_FLAG_BUSBUSY));
  
  //产生应答信号 
  I2C_AcknowledgeConfig(I2C_ACK_CURR);
  
  //发送起始信号 
  I2C_GenerateSTART(ENABLE);
  
  //等待起始信号产生
  while (!I2C_CheckEvent(I2C_EVENT_MASTER_MODE_SELECT));
  
  //发送器件地地址,并清除SB标志位
  I2C_Send7bitAddress(Did, I2C_DIRECTION_TX);
  
  //等待器件地址发送完成
  while (!I2C_CheckEvent(I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));

//发送数据地址
  I2C_SendData((Addr&0x00FF));
  //等待数据地址发送完成
  while(!I2C_CheckEvent(I2C_EVENT_MASTER_BYTE_TRANSMITTED));

//重新发送起始信号
  I2C_GenerateSTART(ENABLE);
  
  //等待起始信号产生
  while (!I2C_CheckEvent(I2C_EVENT_MASTER_MODE_SELECT));

//发送器件地地址,并清除SB标志位
  I2C_Send7bitAddress(Did, I2C_DIRECTION_RX);

//等待器件地址发送完成
  while (!I2C_CheckEvent(I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));

while(num)
  {
    if(num == 1)
    {   
      I2C_AcknowledgeConfig(I2C_ACK_NONE);//最后一个字节不产生应答信号   
    }
    //等待数据接收完成
    while (!I2C_CheckEvent(I2C_EVENT_MASTER_BYTE_RECEIVED));

*buffer = I2C_ReceiveData();  //读出数据
    buffer++;   //读出数据缓存地址递加
    num--;      //接收数据数目减1
  }
  I2C_GenerateSTOP(ENABLE);
}
/*******************************************************************************
**函数名称:void IIC_Write(uint16_t Addr, unsigned char *buffer , unsigned short num)
**功能描述:向IIC器件写数据
**入口参数:
           Addr     : 确定器件写地址的起始地址
          *buffer   : 写数据的起址地址
          num        : 要写数据的个数  FT24C16A的页写模式最多支持16字节 要根据偏移量计算,本例中每次只写4个字节,可不考虑偏移量问题
**输出:无
*******************************************************************************/
void IIC_Write(uint16_t Addr, unsigned char *buffer , unsigned short num)
{
  uint8_t  Did;//设备ID
  uint8_t Tmp;//方便计算中间量
  Tmp=(Addr>>8);
  if (Addr>255) Did=0xA0+(Tmp*2); 
  else Did=0xA0;  
  
  while(I2C_GetFlagStatus(I2C_FLAG_BUSBUSY));
  
  //发送起始信号/*!< Send STRAT condition */
  I2C_GenerateSTART( ENABLE);  
  
  //等待起始信号产生
  while (!I2C_CheckEvent(I2C_EVENT_MASTER_MODE_SELECT));
  
  //发送器件地地址,并清除SB标志位
  I2C_Send7bitAddress(Did, I2C_DIRECTION_TX);
  
  //等待器件地址发送完成并清除发送器件地址标志位
  while (!I2C_CheckEvent(I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));

//发送数据地址
  I2C_SendData((Addr&0x00FF));
  //等待数据地址发送完成
  while(!I2C_CheckEvent(I2C_EVENT_MASTER_BYTE_TRANSMITTED));

while(num > 0)
    {//发送器件存储首地址
        I2C_SendData(*buffer);
        //等待移位发送器发送完成
        while (!I2C_CheckEvent(I2C_EVENT_MASTER_BYTE_TRANSMITTED));

buffer++;
        num--;
    }    
    //发送停止信号结束数据传输
    I2C_GenerateSTOP(ENABLE);
}
/*******************************************************************************
**函数名称:void IIC_Init() 
**功能描述:初始化IIC1接口
**入口参数:
**输出:无
*******************************************************************************/
void IIC_Init(void)
{

CLK_PeripheralClockConfig(CLK_PERIPHERAL_I2C, ENABLE);
  I2C_Cmd(ENABLE);  
  /* sEE_I2C configuration after enabling it */
  I2C_Init(I2C_SPEED, I2C_SLAVE_ADDRESS7, 
           I2C_DUTYCYCLE_2, I2C_ACK_CURR,
           I2C_ADDMODE_7BIT, 16);
}

由于个人水平有限,可能上面写的并不专业,甚至可能还有错误,欢迎大家留言批评指正,谢谢!

使用STM8S003F3P6的硬件I2C读写AT24C16的EEPROM的经验心得相关推荐

  1. STM32F10x_硬件I2C读写EEPROM(标准外设库版本)

    Ⅰ.写在前面 上一篇文章是"STM32F10x_模拟I2C读写EEPROM",讲述使用IO口模拟I2C总线通信,对EEPROM(AT24Xxx)进行读写操作的过程. 上一篇文章主要 ...

  2. STM-32:I2C外设总线—硬件I2C读写MPU6050

    目录 一.I2C外设简介 二.I2C框图 三.I2C基本结构 四.主机发送 五.主机接收 六.I2C的中断请求 七.软件/硬件波形对比 八.应用实例:硬件I2C读写MPU6050 8.1接线图 8.2 ...

  3. 关于STM32使用硬件i2c读写AT24C256实验遇到的问题

    硬件环境:XNUCLEO开发板(STM32F411RCT6芯片).MiniSTM32 V3.41开发板(STM32F103RCT6芯片) 软件环境:IAR for ARM 8.30.1.Keil5 现 ...

  4. STM32HAL库学习笔记--硬件I2C读写AT24C512

    摘要:由于需要实现掉电存储功能,在无线传输模块上增加了一块EEPROM芯片,因为工程使用CubeMx配置并生成,为了方便不再使用IO口模拟I2C,而是使用f1自带的硬件I2C来实现.配置和调试过程和遇 ...

  5. STM32CubeMX学习教程之十:硬件I2C读写AT24C02

    完整源码下载: https://github.com/simonliu009/STM32CubeMX-hardware-I2C-AT24C02 网上有流传已久一种说法,就是STM的I2C有bug,不好 ...

  6. bme280 环境传感器开发板_STM32Cube14 | 使用硬件I2C读写环境光强度传感器

    更多精彩~点击上面蓝字关注我们呀!   寻求更好的阅读体验,请点击阅读原文移步:Mculover666的个人博客. 本篇详细的记录了如何使用STM32CubeMX配置STM32L431RCT6的硬件I ...

  7. STM32基于HAL工程硬件I2C读写AT24C02/04/08数据

    STM32基于HAL工程硬件I2C读取AT24C02数据 ✨申明:本文章仅发表在CSDN网站,任何其他网站,未注明来源,见此内容均为盗链和爬取,请多多尊重和支持原创!

  8. STM32的硬件I2C与AT24C16

    刚学STM32的时候就听闻STM32的硬件I2C存在重大bug,会导致运行卡死在等待ACK的过程中,所以一直以来对其避而远之,转而以模拟I2C取代之.最近这段时间一直在用STM32 CubeMX,图形 ...

  9. stm32hal库应用笔记之 硬件I2C读写ZD24C64

    话不多说 直接上资料 这是ZD24C64 数据手册里面的读写操作时序. 数据手册网上有很多相信大家也能随便就找到. 如下图所示: 这是使用iic按字节写操作 器件地址:我的是0xA0 来不及解释了赶快 ...

  10. 【STM32Cube_15】使用硬件I2C读取温湿度传感器数据(SHT30)

    上一篇:[STM32Cube_14]使用硬件I2C读写环境光强度传感器(BH1750) 寻求更好的阅读体验,请移步:Mculover666的个人博客. 本篇详细的记录了如何使用STM32CubeMX配 ...

最新文章

  1. PyTorch 实现经典模型5:ResNet
  2. DVWA--文件上传漏洞
  3. mysql error 1201_ERROR 1201 (HY000): Could not initialize master info structure; .....
  4. 信息学奥赛一本通(1186:出现次数超过一半的数)
  5. java数组包含某个值_如何检查Java数组是否包含值?
  6. ajax 同步和异步的区别
  7. 数据结构之简单排序算法
  8. 上传excel,并保存excel内容
  9. Java 算法刷题指南
  10. origin matlab调用,origin与matlab使用教程
  11. java两个字符串的重复率检查
  12. c#仿qq好友列表控件
  13. 360与腾讯之争,作为程序员,是愿意自己的项目进入市场得到些成功就被腾讯抄袭,还是软件刚一发布出去,就被360查杀?
  14. 电影记忆之20(恐怖游轮)
  15. phpcms 会员头像h5上传_phpcms v9前台会员中心上传头像可getshell及修复
  16. 搜索引擎蜘蛛 ajax,SEO中的搜索引擎蜘蛛技术探析
  17. 855 AIMA学习笔记(by菜菜子)
  18. 你有新的推送消息,请注意查收
  19. C++中 pair 和 make_pair 的用法
  20. MRD 和PRD的区别

热门文章

  1. Vmware、Hyper-V、Virtual PC虚拟机运用usb server使用USB加密狗设备
  2. 大数据集群治理与数据治理(PPT)
  3. selenium 网址
  4. 密码学术语中英文对照(持续更新中)
  5. 学习笔记(12):Google开发专家带你学 AI:入门到实战(Keras/Tensorflow)(附源码)-深度学习“四件套”:数据、模型、损失函数与优化器
  6. 足球机器人比赛3V3
  7. 工程实践,淘宝直播高画质低延时技术探索
  8. Odoo12有那些功能?『江苏odoo云整理』
  9. 5分钟了解什么是自然语言处理技术
  10. Xilinx FPGA PTP IEEE1588使用