基于STM32的I2C通信 2(读写AT24C02)
本文采用STM32的模拟I2C对 EEPROM(AT24C02)进行读写操作。
1.EEPROM(24C02):I2C接口
1.1-24C02器件介绍:
AT24C02的总容量是256个字节,也就是2K。
VCC和VSS是芯片的电源和地,电压的工作范围为:+1.8V~+6.0V;
A0、A1、A2是IC的地址选择脚;
SCL是I2C通讯时钟引脚;
SDA是I2C通讯数据引脚;
WP是写保护使能脚;当WP引脚接高电平的时,24C02只能进行读取操作,不能进行写操作;只有当WP引脚悬空或接低电平时,24C02才能进行写操作。
1.2-24C02的读写
AT24C02的设备地址为如下:
前四位固定为1010,A2~A0由管脚电平决定,最后一位表示读/写操作。
因此:
AT24C02的读地址为0xA1;
AT24C02的写地址为0xA0;
AT24C02芯片片内地址寻址可对内部256个字节中的任一个进行读/写操作,其寻址范围为00~FF,共256个。
1.2.1-24C02字节写时序
1.2.2-24C02字节读时序
1.2.3-程序代码
at24cxx.h,硬件以AT24C02为例;
#ifndef __AT24CXX_H__
#define __AT24CXX_H__#include "stm32f10x.h"#define EEPROM_TYPE AT24C02#define AT24C01 127
#define AT24C02 255
#define AT24C04 511
#define AT24C08 1023
#define AT24C16 2047
#define AT24C32 4096#define AT24C02_WRITEADDRESS 0XA0
#define AT24C02_READADDRESS 0XA1void AT24CXX_WriteOneByte(u8 writeaddr,u8 writedat);
u8 AT24CXX_ReadOneByte(u16 readaddr);u8 AT24CXX_Check(void);//检测器件是否正常void AT24CXX_WriteLenByte(u16 writeaddr,u32 writedat,u8 Len);
u32 AT24CXX_ReadLenByte(u16 readaddr,u8 Len);void AT24CXX_Read(u16 readaddr,u8 *p,u16 num);
void AT24CXX_Write(u16 writeaddr,u8 *p,u16 num);#endif
at24cxx.c
#include "at24cxx.h"
#include "iic.h"
#include "delay.h"void AT24CXX_WriteOneByte(u8 writeaddr,u8 writedat)
{IIC_Start(); if(EEPROM_TYPE>AT24C16){IIC_WriteByte(AT24C02_WRITEADDRESS);//发送写命令IIC_Wait_Ack();IIC_WriteByte(writeaddr>>8);//发送高地址 }else{IIC_WriteByte(AT24C02_WRITEADDRESS+((writeaddr/256)<<1)); //发送器件地址,写} IIC_Wait_Ack(); IIC_WriteByte(writeaddr%256);//发送低地址IIC_Wait_Ack(); IIC_WriteByte(writedat);//发送要写入的数据 IIC_Wait_Ack(); IIC_Stop(); //产生一个停止条件 delay_ms(10);
}
u8 AT24CXX_ReadOneByte(u16 readaddr)
{ u8 temp=0; IIC_Start(); if(EEPROM_TYPE>AT24C16){IIC_WriteByte(AT24C02_WRITEADDRESS);//发送写命令IIC_Wait_Ack();IIC_WriteByte(readaddr>>8);//发送高地址 }else {IIC_WriteByte(AT24C02_WRITEADDRESS+((readaddr/256)<<1)); //发送器件地址,写} IIC_Wait_Ack(); IIC_WriteByte(readaddr%256);//发送低地址IIC_Wait_Ack(); IIC_Start(); IIC_WriteByte(AT24C02_READADDRESS); //进入接收模式 IIC_Wait_Ack(); temp=IIC_ReadByte();//接收数据 IIC_Stop();//产生一个停止条件 return temp;
}
//检查AT24CXX是否正常
//这里用了24CXX的最后一个地址(255)来存储标志字.
//如果用其他24C系列,这个地址要修改
//返回1:检测失败
//返回0:检测成功
u8 AT24CXX_Check(void)
{u8 temp;temp=AT24CXX_ReadOneByte(255);//避免每次开机都写AT24CXX if(temp==0X55){return 0;} else//排除第一次初始化的情况{AT24CXX_WriteOneByte(255,0X55);temp=AT24CXX_ReadOneByte(255); if(temp==0X55)return 0;}return 1;
}//在AT24CXX里面的指定地址开始写入长度为Len的数据
//该函数用于写入16bit或者32bit的数据.
//writeaddr :开始写入的地址
//writedat :数据数组首地址
//Len :要写入数据的长度2,4
void AT24CXX_WriteLenByte(u16 writeaddr,u32 writedat,u8 Len)
{ u8 t;for(t=0;t<Len;t++){AT24CXX_WriteOneByte(writeaddr+t,(writedat>>(8*t))&0xff);}
}//在AT24CXX里面的指定地址开始读出长度为Len的数据
//该函数用于读出16bit或者32bit的数据.
//readaddr :开始读出的地址
//返回值 :数据
//Len :要读出数据的长度2,4
u32 AT24CXX_ReadLenByte(u16 readaddr,u8 Len)
{ u8 t;u32 temp=0;for(t=0;t<Len;t++){temp<<=8;temp+=AT24CXX_ReadOneByte(readaddr+Len-t-1); }return temp;
}
//在AT24CXX里面的指定地址开始读出指定个数的数据
//readaddr :开始读出的地址 对24c02为0~255
//p :数据数组首地址
//num :要写入数据的个数
void AT24CXX_Read(u16 readaddr,u8 *p,u16 num)
{while(num){*p++=AT24CXX_ReadOneByte(readaddr++); num--;}
}
//在AT24CXX里面的指定地址开始写入指定个数的数据
//writeaddr :开始写入的地址 对24c02为0~255
//p :数据数组首地址
//num :要写入数据的个数
void AT24CXX_Write(u16 writeaddr,u8 *p,u16 num)
{while(num--){AT24CXX_WriteOneByte(writeaddr,*p);writeaddr++;p++;}
}
2.工程结构
此工程硬件基于野火指南者开发板,板载EEPROM芯片24C02,采用I2C接口读写,LED灯指示工作状态,KEY按键进行读写操作,USART串口显示信息,工程包含文件如下图所示:
给出主程序main.c
#include "stm32f10x.h"#include "led.h"
#include "key.h"
#include "delay.h"
#include "usartx.h"
#include "iic.h"
#include "at24cxx.h"//要写入到24c02的字符串数组
const u8 TEXT_Buffer[]={" STM32F103VET6 IIC-24C02 TEST OK! "};
#define SIZE sizeof(TEXT_Buffer) int main(void)
{u8 i=0;u8 datatemp[SIZE];delay_init();LED_GPIO_Config();KEY_GPIO_Config();IIC_GPIO_Config();Usart_Config(115200);printf("IIC-AT24C02 TEST \r\n");while(AT24CXX_Check())//检测不到AT24c02{printf("AT24C02 Check Failed! \r\n");delay_ms(500);printf("Please Check! \r\n");delay_ms(500);LEDR_TOGGLE; }while(1){if(KEY_Scan(KEY1_GPIO_PORT,KEY1_GPIO_PIN) == KEY_DOWN){LED_BLUE;AT24CXX_Write(0,(u8*)TEXT_Buffer,SIZE);USART_SendString(USARTx,"Start Write 24C02.... \r\n");USART_SendString(USARTx,"24C02 Write Finished! \r\n");}if(KEY_Scan(KEY2_GPIO_PORT,KEY2_GPIO_PIN) == KEY_DOWN){LED_GREEN;USART_SendString(USARTx,"Start Read 24C02.... \r\n");AT24CXX_Read(0,datatemp,SIZE);USART_SendString(USARTx,"24C02 Read Finished! \r\n");USART_SendString(USARTx,"The Data Readed Is: ");USART_SendString(USARTx,datatemp);USART_SendString(USARTx,"\r\n");}i++;delay_ms(10);if(i==10){LEDG_TOGGLE;//提示系统正在运行//printf("AT24C02 Run OK! \r\n"); i=0;} }
}
3.功能测试
4.资料分享
STM32+I2C+AT24C02
基于STM32的I2C通信 2(读写AT24C02)相关推荐
- 基于距离传感器的I2C通信(一)
基于距离传感器的I2C通信(一) 一.软硬件准备 (一)硬件 (二)软件 ST-Link驱动的下载安装 二.keil软件的配置 (一)初始配置 (二)程序下载及调试 三.器件的初步了解 四.接线方法 ...
- STM32 I2C通信(读写eeprom)
I2C通信 双线制:串行时钟线SCL,串行数据线SDA. 通常采用软件模拟i2c通信.
- 基于STM32实现I2C从机的数字数学计算器:用于执行加法、减法和乘法操作的深度解析及应用
一.引言 在许多现代电子设备中,微控制器都是至关重要的组成部分,其作用是控制和处理系统内部的各种操作.我们经常遇到一种情况,即需要微控制器与其他设备进行通信以接收或传递信息.在这种情况下,I2C(In ...
- STM32的I2C通信
STM32的两个GPIO引脚,分别用于SCL和SDA,按照I2C规约的时序,像控制LED灯那样控制引脚输出,若是接收数据时则读取SDA线上的电平,那就可以实现I2C通信了,这也是我们在51单片机上 ...
- 单片机与PC机的交流———基于STM32的串口通信
STM32之串口通信程序 前言: 一.串口通信要求 二.串口通信准备 1.硬件准备 2.软件准备 三.下载程序进入STM32 1.下载之前相关配置 2.下载 四.最终效果展示 总结: 前言: 本文主要 ...
- 基于STM32实现串口通信输出hello windows!
文章目录 前言 一.介绍 1.串口协议和RS-232.485标准 2.RS232.485电平与TTL电平的区别 3.USB/TTL转232模块的工作原理 二.安装 1.安装STM32CubeMX 2. ...
- arduino i2c 如何写16位寄存器_基于STM32使用I2C读取传感器数据
撑腰会儿:I2C通信协议介绍zhuanlan.zhihu.com 上文介绍了I2C协议的基本结构,今天,使用STM32和LM75A温度传感器来实现I2C读取信息. 首先,为了使用I2C读取传感器测量 ...
- 基于STM32的ModbusRtu通信--终极Demo设计(二)
[--------------点击下面,进入总目录索引--------------] STM32系列精品Demo集 - 总目录 图示:MosbusRtu通信效果演示 一.方案设计 1.1.Uart接 ...
- linux i2c 多字节读写,基于51单片机i2c多字节的读写
描述 使用Keil的编译环境下载,确实能够下载,但是入口的地址是如下黄色的那行显示所示,如果单步执行(F11)或全速运行(F5),程序始终在原位置不动(0x1FFF4252),如果强制的将PC指针的值 ...
最新文章
- xcode svn commit is not under version control 和 git常用指令
- Socket之UDP服务器【Python】
- mysql 时间chuo格式化_Mysql时间戳与时间格式转换问题汇总
- 【javascript】DOM操作方法(3)——document节点属性
- React开发(247):react项目理解 学会debugger
- 树:二叉树的非递归遍历算法
- 复变函数:傅里叶级数
- Kali linux 渗透测试(五)——渗透WPS攻击
- Android 关于arm64-v8a、armeabi-v7a、armeabi、x86下的so文件兼容问题
- Silverlight 2.5D RPG游戏技巧与特效处理:(二)纸娃娃系统
- ROS基础篇(四)-- 调试时,常用的命令有哪些
- 时间去哪儿了?--读《时间简史》有感
- Swift 读标准库源码笔记 -- Integers(基本数据类型篇)
- 鸿图之下服务器维护10月25,更新公告丨《鸿图之下》11月25日维护更新预告
- 【测试用例练习】微信发红包(含思路)
- WordPress插件开发教程1:开发第一个WordPress插件
- 小老虎CSDN博客流量分析
- Deeply Learned Attributes for Crowded Scene Understanding
- SQL Server中的约束(六种约束)
- 禁用和恢复用户账户Linux,linux用户和组管理.ppt
热门文章
- 显示答案c语言代码编程,c语言编程例题及答案
- 智能手机PDR和VDR思考
- 特殊格式的时间读取并排序
- 视频编解码之常见GOP结构
- pyvisa.errors.VisaIOError: VI_ERROR_TMO (-1073807339): Timeout expired before operation completed
- P2-前端基础-网页中的实体(转义字符)
- 金融企业邮箱发推荐信,金融行业如何保障邮件安全?
- java,判断一个整数是质数还是合数.
- 市场调研-船用离合器市场现状及未来发展趋势
- 维吉尼亚算法python编程实现