#include "AT24Cxx.h"
void AT24CxxInit(const IIC_PIN *PIN)
{
IIC_Init(PIN);
}
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)
IIC_WriteByte(PIN, (uint8_t)((addr >> 8) & 0xFF));
status |= IIC_Wait_ACK(PIN);
#endif
IIC_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);
}
}
IIC_STATUS AT24CxxWriteStr(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);
#endif
IIC_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);
osDelay(10);
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);
#endif
IIC_WriteByte(PIN, (uint8_t)((addr + i) & 0xFF));
status |= IIC_Wait_ACK(PIN);
}
IIC_WriteByte(PIN, *str++);
status |= IIC_Wait_ACK(PIN);
}
IIC_Stop(PIN);
osDelay(10);
if(status)
{
return (IIC_WRITE_ERR);
}
else
{
return (IIC_OK);
}
}
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);
#endif
IIC_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);
}
}
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);
#endif
IIC_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"
#define PAGE_LENGTH 64
#define ADDR_LENGTH 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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App