当前位置: 首页 > news >正文

AT24C1024的模拟IIC驱动

AT24C1024是基于IIC的EEPROM,容量为1024/8=128k bytes。它的引脚如下:

其中A1,A2为硬件地址引脚

WP为写保护引脚,一般我们需要读写,需要接低电平GND,接高的话则仅允许读

SDA和SCL则为IIC通信引脚

芯片通信采用IIC,有关IIC的通信原理可参考:

https://blog.csdn.net/u011436603/article/details/136007075文章浏览阅读293次,点赞5次,收藏8次。这样看起来,区分起止信号与数据电平是不是就更加容易些了,但是嘛由于只有一根数据线了,缺点就是无法同时收发了,因此它是半双工通信的。一般的IIC器件,比如EEPROM,此时会发送要写入或读取的地址,如往0x0000地址写入数字1,那么会先发送0x0000,等到回码后再发送0x01,之后在收到应答后结束通信。前面在讲UART时提到过通信传输所需要的几个必要条件,首先得知道什么时候通信开始,什么时候通信结束,然后就是如何去解析数据了,根据这几点,我们来谈谈IIC是如何实现通信的。从图上可以看到,IIC规定的。https://blog.csdn.net/u011436603/article/details/136007075接下来说下具体的操作流程

读数据:

  1. 启动总线
  2. 发送设备地址+写...等待应答
  3. 发送数据存储地址...等待应答
  4. 发送数据
  5. 结束总线

写数据:

  1. 启动总线
  2. 发送设备地址+写...等待应答
  3. 发送数据存储地址...等待应答
  4. 发送设备地址+读...等待应答
  5. 读数据
  6. 结束总线

本次采用模拟IIC的方式,便于移植,具体的代码如下

void eeprom_start(void)
{IIC_SDA_ON;IIC_SCL_OFF;DELAY_US (10);IIC_SCL_ON;DELAY_US(1);IIC_SDA_OFF;DELAY_US(1);IIC_SCL_OFF;DELAY_US(2);IIC_SCL_OFF;IIC_SDA_ON;DELAY_US(10);
}void eeprom_stop(void)
{IIC_SDA_OFF;IIC_SCL_OFF;DELAY_US(1);IIC_SCL_ON;DELAY_US(1);IIC_SDA_ON;DELAY_US(2);IIC_SCL_OFF;DELAY_US(2);IIC_SCL_OFF;IIC_SDA_ON;DELAY_US(10);
}void eeprom_ack(void)
{IIC_SDA_ON;IIC_SCL_OFF;DELAY_US (10);IIC_SDA_OFF;DELAY_US(1);IIC_SCL_ON;DELAY_US(1);IIC_SCL_OFF;DELAY_US(2);IIC_SCL_OFF;IIC_SDA_ON;DELAY_US(10);
}void eeprom_noack(void)
{IIC_SDA_ON;IIC_SCL_OFF;DELAY_US (10);IIC_SCL_ON;DELAY_US(1);IIC_SCL_OFF;DELAY_US(2);IIC_SCL_OFF;IIC_SDA_ON;DELAY_US(10);
}void eeprom_checkack(void)
{IIC_SCL_ON;DELAY_US(10);IIC_SCL_OFF;
}void eeprom_write_byte(unsigned char ucChar)
{unsigned char i;IIC_SDA_ON;IIC_SCL_OFF;DELAY_US (10);for(i=0; i<8; i++){if(!(ucChar & BIT(7-i)) == 0)  IIC_SDA_ON;else                           IIC_SDA_OFF;DELAY_US (1);IIC_SCL_ON;DELAY_US(1);IIC_SCL_OFF;DELAY_US(2);}IIC_SCL_OFF;IIC_SDA_ON;DELAY_US(10);
}unsigned char eeprom_read_byte(void)
{unsigned char i;unsigned char ucChar = 0;for(i=0; i<8; i++){if(IIC_SDA_VALUE == 1){ucChar |= BIT(7 - i);}else{ucChar &= ~BIT(7 - i);}IIC_SCL_ON;DELAY_US(1);IIC_SCL_OFF;DELAY_US(2);}IIC_SCL_OFF;IIC_SDA_ON;DELAY_US(10);return ucChar;
}
void eeprom_write_char(unsigned int nAddress,unsigned char ucChar)
{eeprom_start();if(nAddress>=0x10000)    eeprom_write_byte(0xa2);else                     eeprom_write_byte(0xa0);eeprom_checkack();eeprom_write_byte(nAddress/256);                               eeprom_checkack();eeprom_write_byte(nAddress%256);                          eeprom_checkack();eeprom_write_byte(ucChar);eeprom_checkack();eeprom_stop();                                if(nAddress%256 == 0) DELAY_MS(100);else DELAY_MS(8);
}unsigned char eeprom_read_char(unsigned int nAddress)
{unsigned char ucChar;eeprom_start();                                      if(nAddress>=0x10000)    eeprom_write_byte(0xa2);else                     eeprom_write_byte(0xa0);eeprom_checkack();eeprom_write_byte(nAddress/256);                        eeprom_checkack();eeprom_write_byte(nAddress%256);                eeprom_checkack();eeprom_start();                                             if(nAddress>=0x10000)    eeprom_write_byte(0xa3);else                     eeprom_write_byte(0xa1);eeprom_checkack();ucChar = eeprom_read_byte();eeprom_noack();eeprom_stop();DELAY_US(10);return  ucChar;
}

其中IIC_SCL_ON和IIC_SCL_OFF表示SCL引脚电平拉高或拉低,

IIC_SDA_ON和IIC_SDA_OFF表示SDA引脚电平拉高或拉低,IIC_SDA_VALUE表示读取SDA引脚电平。需要注意的是,模拟IIC时引脚需要设置为开漏输出且需要上拉电阻。

有两个需要注意的点,一个是器件地址指令,当写存储地址处于前一半时,发送A0指令,当写存储地址处于后一半时,发送A2指令。另一个则是跨页写,每256字节为一页,当出现跨页写时,需要增大延时,否则有可能出错。

http://www.lryc.cn/news/309410.html

相关文章:

  • Stable Diffusion生成式扩散模型代码实现原理
  • 解决Keepalived “脑裂”(双VIP)问题
  • cAdvisor+Prometheus+Grafana 搞定Docker容器监控平台
  • java基础知识面试题
  • 科技云报道:黑马Groq单挑英伟达,AI芯片要变天?
  • 解决i18n国际化可读性问题,傻瓜式webpack中文支持国际化插件开发
  • 【Django】执行查询—F()表达式
  • 202112CSPT4磁盘文件操作
  • 5GC SBA架构
  • 《求生之路2》服务器如何选择合适的内存和CPU核心数,以避免丢包和延迟高?
  • 精读服务器默认rsyslog的配置文件
  • Vue2:用node+express部署Vue项目
  • 前端开发人员如何做好SEO
  • 推荐收藏!分享 PyTorch 中一些高级的索引和选择操作技巧
  • Apache Calcite 快速入门指南
  • 基于MUSIC算法的六阵元圆阵DOA估计matlab仿真
  • Mysql索引学习
  • 【MySQL】:高效利用MySQL函数实用指南
  • vue3+electron开发桌面应用,静态资源处理方式及路径问题总结
  • 2024全国水科技大会暨高氨氮废水厌氧氨氧化处理技术论坛(四)
  • 基于springboot+vue的美食推荐商城
  • AI推介-多模态视觉语言模型VLMs论文速览(arXiv方向):2024.02.05-2024.02.10
  • 华为笔记本自带windows11如何改为win10
  • Axios 面试题
  • 速盾:cdn服务器怎么做
  • 基础小白快速入门c语言--
  • CI/CD:安装配置Gitlab Runner
  • 【Spring连载】使用Spring Data访问 MongoDB----对象映射之JSON Schema
  • 用于游戏开发的顶级 PYTHON 框架
  • 【MongoDB】docker安装mongodb 7.0