Initial import of STM32 IoT sensor node
This commit is contained in:
+116
@@ -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();
|
||||
}
|
||||
Reference in New Issue
Block a user