Files
2026-10-19 15:47:18 +08:00

117 lines
2.5 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#include "eeprom.h"
#include "gpio_iic.h"
#include "stdio.h"
#include "systick.h"
static u8 dev_addr = (0x50 << 1);
// EEPROM 初始化
void eeprom_init(void)
{
iic_init(); // 调用iic初始化
}
// 在addr地址写入一个字节data
void eeprom_write_one_byte(u8 addr, u8 data)
{
int ack_ret;
iic_start();
iic_send_byte(dev_addr);
ack_ret = iic_wait_ack();
if (ack_ret)
{
printf("device:%02x,return NACK\r\n", addr);
iic_stop();
return;
}
iic_send_byte(addr);
iic_wait_ack();
iic_send_byte(data);
iic_wait_ack();
iic_stop();
delay_ms(5);
}
// 从向设备的addr地址写入size个字节
void eeprom_write_bytes(u8 addr, const u8 *buf, u8 size)
{
int i;
iic_start();
// 发送设备地址(写)
iic_send_byte(dev_addr);
iic_send_ack();
// 发送写入数据的地址
iic_send_byte(addr);
iic_send_ack();
// 发送 size 个字节的数据
for (i = 0; i < size; i++)
{
iic_send_byte(buf[i]);
iic_wait_ack();
}
// 发送完数据,发送停止信号
iic_stop();
}
// 在当前位置读取一个字节,然后地址后移一个字节
u8 eeprom_read_cur_byte(void)
{
u8 value = 0;
iic_start();
// 读方式(等同于 dev_addr | 0x01)
iic_send_byte(dev_addr + 1);
iic_wait_ack();
// 接收数据并回复非应答
value = iic_recv_byte(0);
iic_stop();
return value;
}
// 从addr地址随机读取一个字节
u8 eeprom_read_one_byte(u8 addr)
{
u8 data = 1;
iic_start();
iic_send_byte(dev_addr);
iic_wait_ack();
iic_send_byte(addr);
iic_wait_ack();
iic_start();
iic_send_byte(dev_addr | 0x01);
iic_wait_ack();
data = iic_recv_byte(0);
iic_stop();
return data;
}
// 从addr地址开始读取size分字节放入buf
void eeprom_read_bytes(u8 addr, u8 *buf, u8 size)
{
u8 data = 0;
int i;
iic_start();
iic_send_byte(dev_addr);
iic_wait_ack();
iic_send_byte(addr);
iic_wait_ack();
iic_start();
iic_send_byte(dev_addr | 0x01);
iic_wait_ack();
for ( i = 0; i < size; i++)
{
// 最后一个数据给非应答
if (i + 1 == size)
{
// 读取数据并返回非应答
data = iic_recv_byte(0);
} else {
data = iic_recv_byte(1);
}
// 放入缓冲区
buf[i] = data;
}
data = iic_recv_byte(0);
iic_stop();
}