Initial import of STM32 IoT sensor node

This commit is contained in:
yzfh
2026-10-19 15:47:18 +08:00
commit a51794b022
100 changed files with 46274 additions and 0 deletions
+116
View File
@@ -0,0 +1,116 @@
#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();
}