单片机 STM32 HAL 闪存 AT24C02
#include "AT24Cxx.h"
/**********************************************************************/
// 功能描述: 初始化EEPROM(定义时钟,数据对应的端口及PIN脚,和操作速度)
// 输入参数:无
// 输出参数:无
// 返 回 值:无
// 编写时间:2014.11.26
// 作 者:胡安勤
// 修改记录:
/**********************************************************************/
void AT24CxxInit(const IIC_PIN *PIN)
{IIC_Init(PIN);
// GPIO_PortClock(PIN.WP.port,true);
// GPIO_PinConfigure(PIN.WP.port,PIN.WP.num,GPIO_PIN_OUT_MODE,IIC_IO_SPEED);
// GPIO_PinWrite(PIN.WP.port,PIN.WP.num,AT24Cxx_WRITE_DISABLE); //写保护使能
}
/**********************************************************************/
// 功能描述: EEPROM单字节写操作
// 输入参数:addr:数据存储地址 ch:待写入数据
// 输出参数:无
// 返 回 值:无
// 编写时间:2014.11.26
// 作 者:胡安勤
// 修改记录:
/**********************************************************************/
IIC_STATUS AT24CxxWriteByte(const IIC_PIN *PIN, uint16_t addr, uint8_t ch)
{IIC_STATUS status;IIC_Start(PIN);IIC_WriteByte(PIN, PIN->ADDR);status = IIC_Wait_ACK(PIN);
#if ( ADDR_LENGTH == 2) //地址是否超过8位,越过,加入高位地址写操作IIC_WriteByte(PIN, (uint8_t)((addr >> 8) & 0xFF)); //超过,写高位地址status |= IIC_Wait_ACK(PIN);
#endifIIC_WriteByte(PIN, (uint8_t)(addr & 0xFF)); //低位地址写入status |= IIC_Wait_ACK(PIN);IIC_WriteByte(PIN, ch); //数据写入status |= IIC_Wait_ACK(PIN);IIC_Stop(PIN); //停止if(status){return(IIC_WRITE_ERR);}else{return(IIC_OK);}
}/**********************************************************************/
// 功能描述: EEPROM多字节写操作
// 输入参数:addr:数据存储地址 *str:待写入数据串首指针 len:写入数据长度
// 输出参数:无
// 返 回 值:无
// 编写时间:2014.11.26
// 作 者:胡安勤
// 修改记录:
/**********************************************************************/
IIC_STATUS AT24CxxWriteStr(const IIC_PIN *PIN, uint16_t addr, uint8_t *str,uint16_t len)
{uint16_t i;IIC_STATUS status;//GPIO_PinWrite(PIN.WP.port,PIN.WP.num,AT24Cxx_WRITE_ENABLE);IIC_Start(PIN);IIC_WriteByte(PIN, PIN->ADDR);status = IIC_Wait_ACK(PIN);
#if ( ADDR_LENGTH == 2)IIC_WriteByte(PIN, (uint8_t)((addr >> 8) & 0xFF));status |= IIC_Wait_ACK(PIN);
#endifIIC_WriteByte(PIN, (uint8_t)(addr & 0xFF));status |= IIC_Wait_ACK(PIN);for(i = 0; i < len; i++){if (((addr + i) % PAGE_LENGTH == 0) && (i > 0)){//判断是地址是否到达分页,是则完成页写。启动新页写操作IIC_Stop(PIN);//status |= IIC_Wait_ACK(PIN);osDelay(10); //两个写操作之间,(参见芯片手册,最小值为5ms)IIC_Start(PIN);IIC_WriteByte(PIN, PIN->ADDR);status |= IIC_Wait_ACK(PIN);
#if ( ADDR_LENGTH == 2)IIC_WriteByte(PIN, (uint8_t)(((addr + i) >> 8) & 0xFF));status |= IIC_Wait_ACK(PIN);
#endifIIC_WriteByte(PIN, (uint8_t)((addr + i) & 0xFF));status |= IIC_Wait_ACK(PIN);}IIC_WriteByte(PIN, *str++);status |= IIC_Wait_ACK(PIN);}IIC_Stop(PIN);//GPIO_PinWrite(PIN.WP.port,PIN.WP.num,AT24Cxx_WRITE_DISABLE);osDelay(10);if(status){return (IIC_WRITE_ERR);}else{return (IIC_OK);}
}
/**********************************************************************/
// 功能描述: EEPROM单字节读操作
// 输入参数:addr:数据存储地址
// 输出参数:无
// 返 回 值:读取到的数据
// 编写时间:2014.11.26
// 作 者:胡安勤
// 修改记录:
/**********************************************************************/
IIC_STATUS AT24CxxReadByte(const IIC_PIN *PIN, uint16_t addr, uint8_t *data)
{uint8_t ch;IIC_STATUS status;IIC_Start(PIN);IIC_WriteByte(PIN, PIN->ADDR);status = IIC_Wait_ACK(PIN);
#if ( ADDR_LENGTH == 2)IIC_WriteByte(PIN, (uint8_t)((addr >> 8) & 0xFF));status |= IIC_Wait_ACK(PIN);
#endifIIC_WriteByte(PIN, (uint8_t)(addr & 0xFF));status |= IIC_Wait_ACK(PIN);IIC_Start(PIN);IIC_WriteByte(PIN, PIN->ADDR | 0x01);status |= IIC_Wait_ACK(PIN);IIC_ReadByte(PIN, &ch);IIC_NACK(PIN);IIC_Stop(PIN);*data = ch;if(status){return (IIC_READ_ERR);}else{return (IIC_OK);}
}/**********************************************************************/
// 功能描述: EEPROM多字节读操作
// 输入参数:addr:数据存储地址 len:读取长度
// 输出参数:*str:存储缓冲区首指针
// 返 回 值:读取到的数据
// 编写时间:2014.11.26
// 作 者:胡安勤
// 修改记录:
/**********************************************************************/
IIC_STATUS AT24CxxReadStr(const IIC_PIN *PIN, uint16_t addr, uint8_t *str, uint16_t len)
{uint16_t i;IIC_STATUS status;IIC_Start(PIN);IIC_WriteByte(PIN, PIN->ADDR);status = IIC_Wait_ACK(PIN);
#if ( ADDR_LENGTH == 2)IIC_WriteByte(PIN, (uint8_t)((addr >> 8) & 0xFF));status |= IIC_Wait_ACK(PIN);
#endifIIC_WriteByte(PIN, (uint8_t)(addr & 0xFF));status |= IIC_Wait_ACK(PIN);IIC_Start(PIN);IIC_WriteByte(PIN, PIN->ADDR | 0x01);status |= IIC_Wait_ACK(PIN);for(i = 0; i < len; i++){if(i != 0 ){IIC_ACK(PIN);}IIC_ReadByte(PIN, str++);}IIC_NACK(PIN);IIC_Stop(PIN);if(status){return (IIC_READ_ERR);}else{return (IIC_OK);}
}
#ifndef _AT24CXX_HEAD_
#define _AT24CXX_HEAD_
#include "main.h"
#include "stdio.h"
#include "stdint.h"
#include "hal_iic.h"
#include "cmsis_os.h" //FreeRTOS系统中调用osDelay()#define PAGE_LENGTH 64 //C01,C02为8字节,C04及以上为16字节,C64 32
#define ADDR_LENGTH 2 //地址长度C01,C02为1个字节,C04及以上为2字节
#define AT24Cxx_ADDR 0xA0 //定义器件地址#define AT24Cxx_WRITE_ENABLE 0x00 //使能数据写入
#define AT24Cxx_WRITE_DISABLE 0x01 //禁止数所写入void AT24CxxInit(const IIC_PIN *PIN);
IIC_STATUS AT24CxxWriteByte(const IIC_PIN *PIN, uint16_t addr, uint8_t ch);
IIC_STATUS AT24CxxReadByte(const IIC_PIN *PIN, uint16_t addr, uint8_t *data);
IIC_STATUS AT24CxxWriteStr(const IIC_PIN *PIN, uint16_t addr, uint8_t *str, uint16_t len);
IIC_STATUS AT24CxxReadStr(const IIC_PIN *PIN, uint16_t addr, uint8_t *str, uint16_t len);#endif
24C02中文(商家版).pdf
24c02串行储存器中文官方资料手册.pdf
IIC介绍.docx
单片机 STM32 HAL 闪存 AT24C02相关推荐
- (39)STM32——FLASH闪存
目录 学习目标 成果展示 介绍 组成 主存储器 系统存储器 OTP 区域 选项字节 读取 编程 寄存器 步骤 擦除 扇区擦除 批量擦除 寄存器 代码 总结 学习目标 本节我们要来介绍一下关于FLASH ...
- 温湿度传感器驱动SHT85 单片机STM32 HAL库
功能介绍:读取传感器SHT85数据,转换成温度.湿度 .饱和水蒸气含量. 注意事项: SDA脚设置为开漏输出,外部上拉电阻10k.或者设置成推挽,软件切换SDA输入输出. 调试时可适当加长延时时间. ...
- 单片机 STM32 HAL 网络模块 ENC28J60
文章目录 一. 简介 二.特性 三.示例代码 一. 简介 ENC28J60 是带有行业标准串行外设接口(Serial Peripheral Interface,SPI)的独立以太网控制器.它可作为任何 ...
- 单片机 STM32 HAL IO扩展 PCA9555
描述 这个用于两线双向总线(I 2 C)的16位扩展器设计用于2.3V至5.5VV CC 运行.通过I 2 C接口[串行时钟(SCL),串行数据(SDA)],它为大多数微控制器系列产品提供通用远程I ...
- 单片机 STM32 HAL 射频读卡器 RC522
1.CubeMX 定义任意两个引脚,作为复位脚和片选脚,并对引脚作出如下配置: GPlO output level --High GPIO mode --Output Open Drain GPIO ...
- 单片机 STM32 HAL 步进电机 Motor
/*************笔记**************** 1.CubeMX 定义任意四个引脚,作为ABCD相,并对引脚作出如下配置:GPlO output level --HighGPIO m ...
- 单片机 STM32 HAL PCF8574 例子代码
#include "extgpio.h" #include "pcf8574.h" #include "74hc595.h" /****** ...
- 单片机 STM32 HAL 温湿度 DS18B20
/*************笔记**************** 1.CubeMX 定义任意一个引脚,作为数据脚,并对引脚作出如下配置:GPlO output level --LOWGPIO mode ...
- 单片机 STM32 HAL 液晶屏 LCD16032
笔记: 1.采用串行输出 2.器件 [16 NC(PSB)]引脚需要接地, H:并口通信 L:串口通信 3.LCD_CS_Pin LCD_CS_GPIO_Port //片选控制,0,无效 1有效 LC ...
- 洋桃开发板笔记(六 ) STM32自带的Flash闪存使用,主要配合其他外设
Flash闪存与其他外设的使用 杜洋工作室 www.DoYoung.net 洋桃电子 www.DoYoung.net/YT 在此声明一下所有代码均为 杜洋工作室 的不允许复制,转发等,本人只是在此程序 ...
最新文章
- 怎样实现企业管理系统的操作日志功能
- Mahout学习路线图
- Sea Battle
- 使用UltraEdit来拷贝粘贴二进制
- 服务器自动删文件,服务器定时删除文件工具
- linux服务器定时关机重启,Ubuntu Server 10.10 每天定时开关机linux服务器应用 -电脑资料...
- 1.79亿实景三维项目!与房地一体有何区别?
- 一致性哈希算法及其应用
- python逐行读取txt文件readline_Python File readline() 方法
- 深度解析,AI如何让创新变得更简单
- jodconverter 远程配置_jodconverter支持什么格式转换
- 男生如何找准自己的穿衣风格,提升衣着品味(转载:搜狐男人)
- Node项目实战总结
- http://jingyan.baidu.com/article/f96699bb8b38e0894e3c1bef.html
- css图片颜色设置为黑白
- 怎么申请企业邮箱账号?企业邮箱怎么注册申请?
- DSPE-PEG-LTLRWVGLMS(二硬脂酰基磷脂酰乙醇胺-聚乙二醇-肿瘤靶向蛋白);神经胶质瘤归巢肽
- 新中式穿搭:柯罗芭KLOVA传承极致东方美
- 机械硬盘4k读写速度_极速鲨课堂43:机械硬盘秒变固态靠谱吗?
- 电子工程师入门宝典:最常用十大电子元器件-电子技术方案|电路图讲解