
25L64存储器数据怎么编程
硬件连接
1、电源连接:将25L64的VCC引脚连接到Arduino的5V引脚,为25L64提供电源。
2、接地连接:将25L64的GND引脚连接到Arduino的GND引脚,确保共地。
3、SPI连接:将25L64的SCK引脚连接到Arduino的D13引脚,用于时钟信号;将SI引脚连接到Arduino的D11引脚,作为数据输入;将SO引脚连接到Arduino的D12引脚,用于数据输出;如果使用片选引脚NSS,将其连接到Arduino的D10引脚。
软件编程
1、安装库文件:在使用Arduino编程之前,需要安装适用于25L64的库文件,可以在Arduino的库管理器中搜索并安装相关的库,SPI”库等。
2、初始化SPI:在setup()
函数中初始化SPI通信。
3、读写操作:编写函数来实现对25L64的读、写和擦除操作,以下是一些基本的函数示例:
函数名称 | 功能 | 示例代码 |
begin() | 初始化SPI并设置芯片选择引脚 | ``cpp void begin(uint8_t csPin) { SPI.begin(); pinMode(csPin, OUTPUT); digitalWrite(csPin, HIGH); } `` |
end() | 结束SPI通信 | ``cpp void end() { SPI.end(); } `` |
writeEnable() | 发送写使能指令 | ``cpp void writeEnable() { digitalWrite(csPin, LOW); SPI.transfer(WREN_INSTRUCTION); digitalWrite(csPin, HIGH); } `` |
waitForReady() | 等待设备准备好 | ``cpp void waitForReady() { uint8_t status; do { digitalWrite(csPin, LOW); status = SPI.transfer(RDSR_INSTRUCTION) & 0x01; digitalWrite(csPin, HIGH); delay(1); } while (status == 1); } `` |
readStatusRegister() | 读取状态寄存器 | ``cpp uint8_t readStatusRegister() { uint8_t status; digitalWrite(csPin, LOW); status = SPI.transfer(RDSR_INSTRUCTION); digitalWrite(csPin, HIGH); return status; } `` |
writeData(address, data) | 在指定地址写入数据 | ``cpp void writeData(uint32_t address, uint8_t* data, size_t size) { writeEnable(); digitalWrite(csPin, LOW); SPI.transfer(PAGE_PROGRAM_INSTRUCTION); SPI.transfer((address >> 16) & 0xFF); SPI.transfer((address >> 8) & 0xFF); SPI.transfer(address & 0xFF); for (size_t i = 0; i< size; i++) { SPI.transfer(data[i]); } digitalWrite(csPin, HIGH); waitForReady(); } `` |
readData(address, buffer, size) | 从指定地址读取数据 | ``cpp void readData(uint32_t address, uint8_t* buffer, size_t size) { digitalWrite(csPin, LOW); SPI.transfer(READ_INSTRUCTION); SPI.transfer((address >> 16) & 0xFF); SPI.transfer((address >> 8) & 0xFF); SPI.transfer(address & 0xFF); for (size_t i = 0; i< size; i++) { buffer[i] = SPI.transfer(0xFF); } digitalWrite(csPin, HIGH); } `` |
eraseBlock(address) | 擦除指定块 | ``cpp void eraseBlock(uint32_t address) { writeEnable(); digitalWrite(csPin, LOW); SPI.transfer(SECTOR_ERASE_INSTRUCTION); SPI.transfer((address >> 16) & 0xFF); SPI.transfer((address >> 8) & 0xFF); SPI.transfer(address & 0xFF); digitalWrite(csPin, HIGH); waitForReady(); } `` |
示例程序
以下是一个简单的示例程序,展示了如何使用上述函数对25L64进行读写操作:
#include <SPI.h> // 定义芯片选择引脚 const int csPin = 10; // 定义25L64的指令常量 const byte WREN_INSTRUCTION = 0x06; // 写使能指令 const byte RDSR_INSTRUCTION = 0x05; // 读状态寄存器指令 const byte READ_INSTRUCTION = 0x03; // 读数据指令 const byte WRITE_INSTRUCTION = 0x02; // 写数据指令 const byte SECTOR_ERASE_INSTRUCTION = 0x20; // 扇区擦除指令 const byte PAGE_PROGRAM_INSTRUCTION = 0x02; // 页编程指令 // 创建25L64对象 Memory25L64 memory(csPin); void setup() { // 初始化串口通信 Serial.begin(9600); // 初始化25L64 memory.begin(); } void loop() { // 写入数据到25L64 const uint32_t writeAddress = 0x000000; // 写入地址 const uint8_t writeData[] = {0x01, 0x02, 0x03, 0x04}; // 要写入的数据 memory.writeData(writeAddress, writeData, sizeof(writeData)); Serial.println("Data written to 25L64"); // 从25L64读取数据 const uint32_t readAddress = 0x000000; // 读取地址 uint8_t readBuffer[4]; // 存储读取数据的缓冲区 memory.readData(readAddress, readBuffer, sizeof(readBuffer)); Serial.print("Data read from 25L64: "); for (int i = 0; i < sizeof(readBuffer); i++) { Serial.print(readBuffer[i], HEX); Serial.print(" "); } Serial.println(); // 延迟一段时间 delay(1000); }
在这个示例程序中,首先定义了与25L64通信所需的指令常量和芯片选择引脚,然后在setup()
函数中初始化了串口通信和25L64存储器,在loop()
函数中,先向25L64的指定地址写入一组数据,然后从该地址读取数据,并将读取到的数据通过串口打印出来,最后延迟一段时间,以便观察输出结果。
注意事项
1、检查连接:确保硬件连接正确无误,特别是SPI引脚的连接,否则可能导致无法正常通信。
2、遵循规格书:不同的25L64器件可能有不同的特性和限制,如最大写入次数、擦除时间等,编程时需参考具体的数据手册。
3、错误处理:在实际应用中,应添加错误处理机制,以应对可能出现的通信错误或操作失败等情况。
使用Arduino对25L64存储器进行编程涉及到硬件连接和软件编程两个方面,通过正确的硬件连接和合理的软件编程,可以实现对25L64存储器的读写操作,满足各种数据存储需求。
作者:豆面本文地址:https://www.jerry.net.cn/articals/34086.html发布于 2025-02-22 08:40:21
文章转载或复制请以超链接形式并注明出处杰瑞科技发展有限公司