STM32-I2C通信在AT24C02的应用

这篇具有很好参考价值的文章主要介绍了STM32-I2C通信在AT24C02的应用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

AT24C02是一种失去电源供给后依旧能保持数据的储存器,常用来储存一些配置信息,在系统重新上电之后也可以加载。它的容量是2k bit的EEPROM存储器,采用I2C通信方式。

AT24C02支持两种写操作:字节写操作和页写操作。本实验中我们采用的是字节写操作,就是一个地址一个数据这样进行数据写入。页写模式就是连续写入数据,只需写入一个地址,连续写入数据的时候,地址会自动后移,但有页限制,超出一页的时候,超出数据会覆盖原先写入的数据。

AT24C02支持三种读操作:当前地址读操作,随机地址读操作和顺序读操作模式。

当前地址读模式是基于上一次读/写操作的最后位置继续读出数据。随机地址读模式是指定地址读出数据。顺序读操作模式就是连续读出数据,会自动翻页。

注意到我们采用的STM32F1系列里,SCL时钟线为PB6,SDA数据线为PB7。本次实验中,时钟线我们就正常的设置为推挽输入,数据线则设置为开漏模式(因为我们引入了外部上拉电阻,提供稳定的空闲高电平,而且我们的数据线既要作为输出,又要作为输入,用开漏输出模式,能很好地实现输入输出共用,避免频繁IO模式切换带来的麻烦)。编写代码时,注意完成发送的时候,主机要释放SDA。

在开漏模式下,MCU读取IDR状态寄存器,来获取引脚高低电平。

STM32-I2C通信在AT24C02的应用

接下来编写我们的实验代码:

首先编写我们的函数头文件iic.c:

#include "./BSP/IIC/iic.h"
#include "./SYSTEM/delay/delay.h"

void iic_init(void){

    GPIO_InitTypeDef gpio_init_struct = {0};

    IIC_SCL_GPIO_CLK_ENABLE();
    IIC_SDA_GPIO_CLK_ENABLE();

    //SCL设置
    gpio_init_strcut.Pin = IIC_SCL_GPIO_PIN;
    gpio_init_strcut.Mode = GPIO_MODE_OUTPUT_PP;
    gpio_init_strcut.Pull = GPIO_PULLUP;
    gpio_init_strcut.Speed = GPIO_SPEED_FREQ_HIGH;
    HAL_GPIO_Init(IIC_GPIO_PORT, &gpio_init_strcut); //IIC_GPIO_PORT就是GPIOB

    //SCL设置
    gpio_init_strcut.Pin = IIC_SDA_GPIO_PIN;
    gpio_init_strcut.Mode = GPIO_MODE_OUTPUT_OD;
    HAL_GPIO_Init(IIC_GPIO_PORT, &gpio_init_strcut);
}

static void iic_delay(void){
    delay_ms(2);
}

void iic_start(void){
    //SCL为高电平时,SDA从高电平向低电平跳变,制造起始信号
    IIC_SDA(1);
    IIC_SCL(1);
    delay_ms();
    IIC_SDA(0);
    delay_ms();
    IIC_SCL(0);
    delay_ms();//钳住总线,准备发送或者接受数据
}
 
void iic_stop(void){
    //SCL为高电平的适合,SDA从低电平向高电平跳变,制造停止信号
    IIC_SDA(0);
    delay_ms();
    IIC_SCL(1);
    delay_ms();
    IIC_SDA(1);
    delay_ms();
}

uint8_t iic_wait_ack(void){ //主机检测应答信号
 
    IIC_SDA(1); //主机释放SDA线
    delay_ms();
    IIC_SCL(1); //从机返回ACK
    delay_ms();
 
    if(IIC_READ_SDA){ //SDA高电平表示读取到高电平,从机未作出应答,由于上拉电阻有高电平阻塞效果,表示读取到非应答信号
        iic_stop();
        return 1;
    }
 
    IIC_SCL(0);
    delay_ms();
    return 0;
}
 
void iic_ack(void){ //从机发送低电平应答信号,将主机发送的高电平信号导入至此,使主机的数据线检测函数得到的是低电平,继续要求数据
 
    IIC_SCL(0);
    delay_ms();
    IIC_SDA(0);
    delay_ms();
    IIC_SCL(1);
    delay_ms();
}
 
void iic_nack(void){ //从机发送非应答信号,不再要求数据
 
    IIC_SCL(0);
    delay_ms();
    IIC_SDA(1);
    delay_ms();
    IIC_SCL(1);
    delay_ms();
}

void iic_send_byte(uint8_t data){
    for(uint8_t t = 0; t < 8; t++){
        //高位先发
        IIC_SDA((data & 0x80) >> 7);
        IIC_SCL(1);
        delay_ms();
        IIC_SCL(0);
        data <<= 1; //左移一位,进行下一次发送
    }
    IIC_SDA(1); //完成后,释放数据线,进行应答检测
}
 
uint8_t iic_read_byte(uint8_t ack){
    uint8_t receive = 0;
 
    for(uint8_t i = 0; t < 8; t++){
        //高位先被输入,左移以腾空右边的位置给下一低位数据
        receive <<= 1;
        IIC_SCL(1);
        delay_ms();
        if(IIC_READ_SDA) receive++;
        IIC_SCL(0);
        delay_ms();
    }

    if(!ack) iic_nack();
    else iic_ack();
    return receive;
}

接下来编写函数头文件iic.h:

#ifndef __IIC_H
#define __IIC_H

void iic_init(void);
static void iic_delay(void);
void iic_start(void);
void iic_stop(void);
uint8_t iic_wait_ack(void);
void iic_ack(void);
void iic_nack(void);
void iic_send_byte(uint8_t data);
uint8_t iic_read_byte(uint8_t ack);

#endif

接下来再编写存储器的函数文件24cxx.c:

#include "./BSP/IIC/iic.h"
#include "./BSP/24CXX/24cxx.h"
#include "./SYSTEM/delay/delay.h"

void at24c02_init(void){
    iic_init();
}

void at24c02_write_byte(uint8_t addr, uint8_t data){
    iic_start();
    iic_send_byte(0xA0); //发送通讯地址(写地址操作)
    iic_wait_ack();
    iic_send_byte(addr);
    iic_wait_ack();
    iic_send_byte(data);
    iic_wait_ack();
    iic_stop();

    delay_ms(10);
}

uint8_t at24c02_read_byte(uint8_t addr){
    uint8_t rec = 0;

    iic_start();
    iic_send_byte(0xA0); //发送通讯地址(写地址操作)
    iic_wait_ack();
    iic_send_byte(addr);
    iic_wait_ack();
    iic_start();
    iic_send_byte(0xA1); //发送通讯地址(写地址操作)
    iic_wait_ack();
    iic_send_byte(addr);
    iic_wait_ack();
    rec = iic_read_byte(0);
    iic_stop();

    return rec;
}

接下来编写存储器函数文件的头文件:24cxx.h:

#ifndef __24CXX_H
#define __24CXX_H

void at24c02_init(void);
void at24c02_write_byte(uint8_t addr, uint8_t data);
uint8_t at24c02_read_byte(uint8_t addr);

#endif

到这里我们的示例代码便编写完成了。文章来源地址https://www.toymoban.com/news/detail-484343.html

到了这里,关于STM32-I2C通信在AT24C02的应用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【STM32】AT24C256硬件I2C读写,基于HAL库

    目录 一、简单介绍 二、配置工程 打开CubeMX,配置时钟,调试接口,工程名,目录等 配置iic 配置串口用于显示信息 三、硬件连接 四、代码编写 一、随机写入一个字节 测试代码 波形如下 代码编写 二、连续写入 代码如下 三、随机读取 测试代码 波形如下 代码编写 四、连续

    2024年02月03日
    浏览(52)
  • STM32——AT24C02(EEPROM )

    1、简介 AT24C02是一种2 Kb(256 × 8)串行电子可擦可编程只读存储器(EEPROM)芯片,支持标准I2C总线通信协议。 AT24C02的编程操作是以页为单位完成的,每次最多可编程8个连续字节。具体来说,AT24C02的一页大小为8个字节,每次写入数据时,需要确保写入的数据不跨页。因此,

    2024年04月13日
    浏览(45)
  • STM32基于HAL工程硬件I2C读写AT24C02/04/08数据

    ✨申明:本文章仅发表在CSDN网站,任何其他网站,未注明来源,见此内容均为盗链和爬取,请多多尊重和支持原创! 🍁对于文中所提供的相关资源链接将作不定期更换。 相关篇针对AT24C32及以上容量《STM32基于STM32-HAL工程硬件I2C读取AT24Cxx数据》 🎯本工程使用STM32F103VE+AT24C02实

    2023年04月11日
    浏览(55)
  • STM32速成笔记—EEPROM(AT24C02)

    🎀 文章作者:二土电子 🌸 关注文末公众号获取其他资料和工程文件! 🐸 期待大家一起学习交流! AT24C01/02/04/08/16…是一个1K/2K/4K/8K/16K位电可擦除PROM,内部含有128/256/512/1024/2048个8位字节,AT24C01有一个8字节页写缓冲器,AT24C02/04/08/16有一个16字节页写缓冲器。电压可允许低

    2024年02月11日
    浏览(63)
  • STM32MX配置EEPROM(AT24C02)------保姆级教程

    ———————————————————————————————————— ⏩ 大家好哇!我是小光,嵌入式爱好者,一个想要成为系统架构师的大三学生。 ⏩最近在开发一个STM32H723ZGT6的板子,使用STM32CUBEMX做了很多驱动,包括ADC、UART、RS485、EEPROM(IIC)、FLASH(SPI)等等。

    2024年02月16日
    浏览(54)
  • STM32软件模拟实现IIC写入和读取AT24C02(STM32CubeMx配置)

    IIC:Inter Integrated Circuit,集成电路总线,是一种 同步 串行 半双工 通信总线。 在使用IIC时分为硬件IIC以及软件IIC,下图为两者的区别: 在使用IIC前先来了解一下IIC总线结构图,即下图: 从图中可以看出IIC有两个双向信号线,一根是数据线SDA,一根是时钟线SCL,并且都接上拉

    2024年02月04日
    浏览(62)
  • 6、单片机与AT24C02的通讯(IIC)实验(STM32F407)

    IIC简介 I2C(IIC,Inter-Integrated Circuit),两线式串行总线,由PHILIPS公司开发用于连接微控制器及其外围设备。 它是由数据线SDA和时钟SCL构成的串行总线,可发送和接收数据。在CPU与被控IC之间、IC与IC之间进行双向传送,高速IIC总线一般可达400kbps以上。 IIC是半双工通信方式。 多主机

    2024年02月20日
    浏览(69)
  • 【51单片机】AT24C20数据帧(I2C总线)

    🎊专栏【51单片机】 🍔喜欢的诗句:更喜岷山千里雪 三军过后尽开颜。 🎆音乐分享【Love Story】 🥰大一同学小吉,欢迎并且感谢大家指出我的问题🥰 小吉先向大家道个歉,因为最近在期末突击,所以文章久久没有更新,也请大家多多见谅😥 目录   🎁I2C总线 🏳️‍🌈

    2024年02月08日
    浏览(72)
  • 【STM32L496】使用HAL库实现I2C写入/读取数据(M24C32)

    IIC原理超详细讲解—值得一看 【嵌入式硬件芯片开发笔记】EEPROM芯片M24C32配置流程 STM32硬件I2C与软件模拟I2C超详解 实现通信功能的芯片为M24C32,对此,芯片手册上第一页就有对其概括描述。 Automotive 32-Kbit serial I²C bus EEPROM with 1 MHz clock 启动/停止条件 :当串行时钟(SCL)位于

    2024年02月03日
    浏览(71)
  • STM32存储左右互搏 I2C总线FATS读写EEPROM ZD24C1MA

    在较低容量存储领域,EEPROM是常用的存储介质,可以通过直接或者文件操作方式进行读写。不同容量的EEPROM的地址对应位数不同,在发送字节的格式上有所区别。EEPROM是非快速访问存储,因为EEPROM按页进行组织,在连续操作模式,当跨页时访问地址不是跳到下一页到开始,而

    2024年02月12日
    浏览(68)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包