void EEPROM_Read(uint16_t Addr,uint8_t *Buffer,uint16_t Length) 以这样的写一个93c66芯片的epprom读写函数
时间: 2023-12-01 16:16:12 浏览: 156
这是一个读取93c66芯片的eeprom函数,函数名为EEPROM_Read,有三个参数:Addr、Buffer、Length。其中,Addr表示eeprom的起始地址,Buffer表示读取出来的数据存放的地址,Length表示读取数据的长度。具体实现代码如下:
void EEPROM_Read(uint16_t Addr, uint8_t *Buffer, uint16_t Length) {
uint16_t i;
for (i = 0; i < Length; i++) {
// 通过SPI总线读取数据
Buffer[i] = SPI_Read(Addr + i);
}
}
其中SPI_Read函数是一个SPI总线读取数据的函数,该函数通过SPI总线向芯片发送读取命令,并将读取到的数据返回给EEPROM_Read函数。
相关问题
给我一个demo 我需要用spiflash模拟eeprom flash每个扇区4KB 我要用前4个扇区模拟16KB的eeprom 提供的函数如下 void spi_flash_buffer_read(uint8_t* pbuffer, uint32_t read_addr, uint16_t num_byte_to_read)flash读取函数 u8 eraseFlashOneSector(u32 sectorNum)扇区擦除函数 void spi_flash_buffer_write(uint8_t* pbuffer, uint32_t write_addr, uint16_t num_byte_to_write)flash写函数。需要实现的函数u8 EEPROM_Write_NBytes(u16 Addr,u8 *Write_Buff,u16 len) 从eeprom写入n个字节 要求考虑到flash的扇区翻页
这是一个简单的示例代码,演示如何使用 spi_flash_buffer_read、eraseFlashOneSector 和 spi_flash_buffer_write 函数来模拟 EEPROM 的读写操作,并考虑到 Flash 的扇区翻页。请注意,以下代码仅用于演示目的,实际应用可能需要进行适当的修改和优化。
```c
#include <stdint.h>
#define SECTOR_SIZE 4096
#define EEPROM_SIZE 16384
// 读取数据
void spi_flash_buffer_read(uint8_t* pbuffer, uint32_t read_addr, uint16_t num_byte_to_read) {
// 实现 flash 读取逻辑
}
// 擦除扇区
uint8_t eraseFlashOneSector(uint32_t sectorNum) {
// 实现扇区擦除逻辑
}
// 写入数据
void spi_flash_buffer_write(uint8_t* pbuffer, uint32_t write_addr, uint16_t num_byte_to_write) {
// 实现 flash 写入逻辑
}
// EEPROM 写入 n 个字节
uint8_t EEPROM_Write_NBytes(uint16_t Addr, uint8_t *Write_Buff, uint16_t len) {
uint8_t sectorNum = Addr / SECTOR_SIZE; // 计算扇区号
uint16_t offset = Addr % SECTOR_SIZE; // 计算偏移量
// 判断写入数据是否跨越多个扇区
if (offset + len > SECTOR_SIZE) {
// 需要跨越多个扇区,进行扇区翻页操作
uint16_t remainingBytes = len; // 剩余待写入字节数
uint8_t* dataPtr = Write_Buff; // 待写入数据的指针
while (remainingBytes > 0) {
// 擦除当前扇区
if (eraseFlashOneSector(sectorNum) != 0) {
return 0; // 擦除失败
}
// 计算本次写入的字节数
uint16_t writeBytes = SECTOR_SIZE - offset;
if (writeBytes > remainingBytes) {
writeBytes = remainingBytes;
}
// 写入数据
spi_flash_buffer_write(dataPtr, sectorNum * SECTOR_SIZE + offset, writeBytes);
dataPtr += writeBytes; // 更新数据指针
remainingBytes -= writeBytes; // 更新剩余字节数
sectorNum++; // 更新扇区号
offset = 0; // 设置偏移量为 0,因为已经跳到下一个扇区的起始位置
}
}
else {
// 数据不跨越扇区,直接写入即可
spi_flash_buffer_write(Write_Buff, Addr, len);
}
return 1; // 写入成功
}
int main() {
// 示例用法
uint8_t eepromData[EEPROM_SIZE]; // 模拟 EEPROM 数据
// 写入数据到 EEPROM
uint8_t writeData[] = {0x01, 0x02, 0x03};
EEPROM_Write_NBytes(0, writeData, sizeof(writeData));
// 从 EEPROM 读取数据
uint8_t readData[3];
spi_flash_buffer_read(readData, 0, sizeof(readData));
return 0;
}
```
请根据实际情况修改函数的参数和返回值类型,并根据所使用的 Flash 设备的具体规格来实现对应的读写和擦除操作。这只是一个简单的示例,可能需要根据你的具体需求进行修改和优化。
用C语言写出int16_t i2c_read_reg(uint8_t dev_addr, uint8_t reg_addr, uint8_t *data, uint16_t size)
以下是用C语言编写的函数int16_t i2c_read_reg(uint8_t dev_addr, uint8_t reg_addr, uint8_t *data, uint16_t size)的示例代码:
```c
int16_t i2c_read_reg(uint8_t dev_addr, uint8_t reg_addr, uint8_t *data, uint16_t size) {
// 打开I2C总线并设置设备地址
i2c_open(dev_addr);
// 发送寄存器地址
i2c_send_byte(reg_addr);
// 读取数据
for (uint16_t i = 0; i < size; i++) {
i2c_receive_byte(&data[i]);
}
// 关闭I2C总线
i2c_close();
return size;
}
```
该函数用于从I2C设备中读取指定寄存器的数据。函数的参数包括设备地址(dev_addr)、寄存器地址(reg_addr)、存储数据的缓冲区(data)以及要读取的数据大小(size)。函数首先打开I2C总线并设置设备地址,然后发送寄存器地址,接着通过循环读取指定大小的数据,并将其存储到缓冲区中。最后,函数关闭I2C总线并返回读取的数据大小。
阅读全文