本次使用的eeprom芯片是AT24CO2,stm32芯片是103zet6。

图1.1与图1.2为电路原理图,采用PB6作为SCL,PB7作为SDL;

图1.1 电路原理图

图1.2 电路原理图

图1.3是读写指令及地址图,A2,A1,A0是从机地址,详情请看图1.1中的A2,A1,A0,本次全接地,即全为0;写指令为0xA0;写数据为0xA1。

图1.3 读写指令及地址图

图1.4为写一位数据图。

​​​​​​​图1.4 写一位数据图

图1.5为读一位数据图。

图1.5 读一位数据图

图1.6为IIC开始与停止信号图

图1.6 IIC开始与停止信号图

图1.7是IIC传输数据的有效性图,即SCL由低变高再变低,完成一位数据读写。

图1.7  IIC传输数据的有效性图

师傅领进门,修仙靠个人,我就不多讲解了,接下来直接放代码,代码完整。

#ifndef __ME_H
#define __ME_H
#include "stm32f10x.h"#define uchar unsigned char
#define uint unsigned int#define SCL_outL     GPIO_ResetBits(GPIOB,GPIO_Pin_6)
#define SCL_outH     GPIO_SetBits(GPIOB,GPIO_Pin_6)
#define SDA_outL     GPIO_ResetBits(GPIOB,GPIO_Pin_7)
#define SDA_outH     GPIO_SetBits(GPIOB,GPIO_Pin_7)
#define SDA_in       GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_7)
#define IIC_SDA_IN  {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=0x80000000;}
#define IIC_SDA_OUT {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=0x30000000;}    void oIIC_init(void);
void oIIC_start(void);
void oIIC_stop(void);
void oIIC_ACK(void);
void oIIC_Send_Byte(uchar shuju);
uchar oIIC_Read_Byte(void);#endif

IIC.c

#include "iic.h"void oIIC_init(void)
{GPIO_InitTypeDef GPIO_InitIIIC;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);GPIO_InitIIIC.GPIO_Mode=GPIO_Mode_Out_PP;GPIO_InitIIIC.GPIO_Pin=GPIO_Pin_6;GPIO_InitIIIC.GPIO_Speed=GPIO_Speed_50MHz;    GPIO_Init(GPIOB,&GPIO_InitIIIC);GPIO_InitIIIC.GPIO_Mode=GPIO_Mode_Out_PP;GPIO_InitIIIC.GPIO_Pin=GPIO_Pin_7;GPIO_InitIIIC.GPIO_Speed=GPIO_Speed_50MHz;    GPIO_Init(GPIOB,&GPIO_InitIIIC);GPIO_SetBits(GPIOB,GPIO_Pin_6|GPIO_Pin_7);  //PB6,PB7 输出高
}void oIIC_start(void)
{IIC_SDA_OUT;SDA_outH;SCL_outH;SDA_outL;SCL_outL;
}void oIIC_stop(void)
{IIC_SDA_OUT;   SCL_outL;SDA_outL;SCL_outH;SDA_outH;
}void oIIC_ACK(void)
{SCL_outH;SCL_outL;
}void oIIC_Send_Byte(uchar shuju)
{uchar q,w;IIC_SDA_OUT;for(q=0;q<8;q++){SCL_outL;SDA_outL;w=shuju>>7;shuju=shuju<<1;if(w==1){SDA_outH;}else{SDA_outL;}SCL_outH;SCL_outL;          }
}uchar oIIC_Read_Byte(void)
{uchar q,e=0;IIC_SDA_IN;for(q=0;q<8;q++){SCL_outL;       SCL_outH;if(SDA_in){e=e|1;if(q<7)e=e<<1;}else{e=e|0;if(q<7)e=e<<1;}SCL_outL;  }return e;
}

eeprom.h

#ifndef __EEPROM_H
#define __EEPROM_H
#include "stm32f10x.h"#define uchar unsigned char
#define uint unsigned intvoid EEPROM_weite_Byte(uchar a,uchar shuju);
uchar EEPROM_read_Byte(uchar a);void EEPROM_Write_AAL(uchar a,uchar b,uchar q[]);
void EEPROM_read_ALL(uchar a,uchar b,uchar q[]);#endif

eeprom.c

#include "stm32f10x.h"
#include "eeprom.h"
#include "iic.h"
#include "delay.h"void eeprom_init()
{oIIC_init();
}void EEPROM_weite_Byte(uchar a,uchar shuju)
{oIIC_start();oIIC_Send_Byte(0xA0);//写从机地址oIIC_ACK();     //从机响应oIIC_Send_Byte(a);//写存数据的地址oIIC_ACK();       //响应oIIC_Send_Byte(shuju);oIIC_ACK();       //响应oIIC_stop();delay_ms(10);
}void EEPROM_Write_AAL(uchar a,uchar b,uchar q[])
{while(b--){EEPROM_weite_Byte(a,q[a]);a++;}
}uchar EEPROM_read_Byte(uchar a)
{uchar gg=0;oIIC_start();oIIC_Send_Byte(0xA0);oIIC_ACK();                          //响应oIIC_Send_Byte(a);oIIC_ACK();                           //响应oIIC_start();oIIC_Send_Byte(0xA1);oIIC_ACK();                           //响应gg=oIIC_Read_Byte();   oIIC_ACK();                             //响应oIIC_stop();return gg;
}void EEPROM_read_ALL(uchar a,uchar b,uchar q[])
{while(b--){q[a]=EEPROM_read_Byte(a);a++;}
}

main.c

#include "me.h"
#include "lcd.h"
#include "usart.h"#include "eeprom.h"
#include "iic.h"uchar const shuju[]={"1234468464651"};    //  抄
#define SIZE sizeof(shuju) //取数组长度    抄int main(void){  u8 p;uchar datatemp[SIZE];    //存接收到数据的数组     抄NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);   //设置NVIC中断分组2:2位抢占优先级,2位响应优先级delay_init();                                       //延时函数初始化                                            uart_init(115200);                               //串口初始化为115200LCD_Init();     //厂家提供led_init();KEY_Init();keystroke_init();eeprom_init();//IIC初始化  抄LCD_ShowString(30,30,200,16,16,"123456789");         //(横坐标,纵坐标,字符显示长度1不等于1位,未知,显示字符方框大小)  while(1) {        p=KEY_Scan(0);     if(p==1)//KEY_UP按下,写入24C02{LCD_Fill(0,170,239,319,WHITE);//清除半EEPROM_Write_AAL(0,SIZE,(u8*)shuju);  //(从eeprom 哪个地址开始写,写多少位,字符串数组内容)    抄LCD_ShowString(30,170,200,16,16,"24C02 Write Finished!");//提示传送完成}if(p==2)//KEY1按下,读取字符串并显示{ EEPROM_read_ALL(0,SIZE,(u8*)datatemp);//(从eeprom中哪一位开始读,读多少位,存到哪个数组)  抄LCD_Fill(0,170,239,319,WHITE);//清除半屏LCD_ShowString(30,200,200,16,16,datatemp);//显示读到的字符串}delay_ms(1);    //一毫秒写一次数据}
}

注:main.c中代码注释没有 “抄”字的代码与本次EEPROM读写无关,那是LCD显示代码。


STM32用IIC实现EEPROM的读写相关推荐

  1. 关于STM32的IIC跟EEPROM通信为什么卡死在while(I2C_CheckEvent)的EV6事件还有为什么检测的是标志位及其怎样写等待写入操作完成函数问题跟解决方法

    我们在写IIC跟EEPROM 通信的时候,会遇到读不出来的一个问题 实际上这是EEPROM这时候还在写入数据,然后我们的STM32的执行速度过快,然后就会卡死在while中 为什么会卡死在这个地方呢, ...

  2. STM32的IIC(模拟)读写AT24c02

    1.GPIO的工作模式有八种.IIC的SCL可设置为输出,但是SDA需要收发信号,所以要设置为输入和输出两种形式. #define SDA_IN() {GPIOB->CRL&=0X0FF ...

  3. stm32 i2c/IIC读写HP303S气压传感器

    该款芯片的详细信息可以看其数据手册 ,这里不多做介绍. 读写HP303S的操作是基于IIC通讯的.本实验采用的是硬件IIC通讯,所以器件地址是0x77,值得注意的是,在stm32的硬件IIC 读写操作 ...

  4. Chapter007-FPGA学习之IIC总线EEPROM读取

    IIC总线是嵌入式领域较为重要的器件间通信总线,同样,FPGA也能通过模块的形式实现IIC的功能,其原理和STM32的模拟IIC总线一致,就是控制每个时间点的SCL.SDA总线电平. IIC总线需要对 ...

  5. 15 玩转STM32之IIC通信(芯片硬件篇)

    15.1 IIC控制器说明(硬件部分) 在14 玩转STM32之IIC通信(软件模拟篇)我们讲了软件模拟的方式,本章讲解芯片自带的硬件部分(并非所有的芯片都含有IIC,像51系列的是没有的,但是绝大多 ...

  6. STM32基于IIC协议的OLED模块的使用

    前言 一.项目涉及的内容 项目简介 二.模块实操 1. IIC模块 1.1 IIC协议格式 1.2 开始信号与停止信号 1.3 写数据 1.3.1 硬件IIC代码编写 1.3.2 软件模拟IIC代码编 ...

  7. linux除了eeprom其他的保存方法,linux的EEPROM的读写控制.doc

    毕业设计[论文]题目:基于linux的EEPROM的读写控制毕业论文(设计)原创性声明 本人所呈交的毕业论文(设计)是我在导师的指导下进行的研究工作及取得的研究成果.据我所知,除文中已经注明引用的内容 ...

  8. STM32使用IIC总线通讯协议在OLED屏幕上显示字符串、汉字、图像(硬件IIC)

    参考:基于STM32-Oled(IIC)的使用 作者:奋斗的小殷 发布时间: 2021-05-07 13:09:26 网址:https://blog.csdn.net/boybs/article/de ...

  9. 【STM32】IIC的基本原理(实例:普通IO口模拟IIC时序读取24C02)(转载)

    版权声明:本文为博主原创文章,允许转载,但希望标注转载来源. https://blog.csdn.net/qq_38410730/article/details/80312357 IIC的基本介绍 I ...

最新文章

  1. 《 百度大脑AI技术成果白皮书》,介绍百度大脑5.0,附48页PDF下载
  2. SXOI2019游记
  3. Python 技术篇-操作oracle数据库执行SQL语句报错,提示ORA-00911: 无效字符解决方法
  4. Codeforces 1015F Bracket Substring AC自动机 + dp
  5. 正则表达式提取字符串内所有的img标签下的src路径
  6. Android Studio删除无用的资源
  7. 一日一学:返回排序好的列表的索引顺序
  8. SQL SERVER 内存分配及常见内存问题(1)——简介
  9. Java的Stack类
  10. linux常用基本指令汇总备忘
  11. ajax调用后台Datatable
  12. 网工界的TFBOYS——netmikotextfsmntc-templates快速入门
  13. mysql时间总结_MYSQL日期时间总结
  14. 各种音视频编解码学习详解(7)--微软Windows Media系列
  15. 【办公常用软件】万彩办公大师教程丨PDF转HTML工具帮助文档
  16. 北京信息科技大学计算机学院研究生怎么样,北京信息科技大学考研难吗?一般要什么水平才可以进入?...
  17. 9个开源的 Vue3 组件库
  18. 水库大坝安全检测平台实例分析+辽阳市水库大坝安全检测平台+志豪未来科技有限公司+陈志豪
  19. 02 创建一个简单的Python Web程序应用
  20. 效率最高的Excel数据导入---(c#调用SSIS Package将数据库数据导入到Excel文件中【附源代码下载】) 转...

热门文章

  1. mysql 备份锁表_mysqldump 备份数据说明+ 避免锁表
  2. 美国电脑出货量的现实和思考
  3. iOS开发之沙盒机制(SandBox)
  4. 数理思维——数学运算
  5. 《Domain Agnostic Learning with Disentangled Representations》代码
  6. 基础——MCU的电源,复位和时钟系统(STM32为例)
  7. 以太网无法连接到internet的解决方法
  8. PESD5V0F1BSF特性好处
  9. 作为商家的你必须要在淘宝和拼多多之间二选一?
  10. 怎样找到ant压缩这个软件_如何在手机上把照片压缩成512Kb以下的体积?可用snapseed这样做...