#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(); }