M24M02的存储器读写
时间: 2024-06-01 13:10:22 浏览: 219
M24M02是一种串行EEPROM存储器,其读写操作可以通过SPI接口进行。以下是M24M02的读写流程:
1. 写入操作:
a. 发送写使能命令(0x06)。
b. 发送起始地址(16位)。
c. 发送待写入的数据。
d. 等待写操作完成。
2. 读取操作:
a. 发送读使能命令(0x03)。
b. 发送起始地址(16位)。
c. 读取数据。
d. 继续读取下一个数据或结束读取操作。
在进行读写操作前,需要先进行初始化操作。具体方法如下:
1. 发送写使能命令(0x06)。
2. 发送写保护解锁命令(0x98、0x25、0x00)。
3. 发送写保护解锁命令(0x98、0x25、0x00)。
4. 发送写保护解锁命令(0x98、0x25、0x00)。
5. 发送写使能命令(0x06)。
6. 发送写状态寄存器命令(0x01)。
7. 发送0x00。
8. 发送写状态寄存器命令(0x01)。
9. 发送0x00。
完成初始化后,即可进行读写操作。需要注意的是,M24M02的地址长度为16位,即可寻址2^16个字节,每次读写的数据长度为8位。
相关问题
M24M02的存储器读写程序
以下是M24M02存储器的读写程序示例:
#include <Wire.h>
#define DEVICE_ADDRESS 0x50 //M24M02存储器的I2C地址
#define PAGE_SIZE 64 //一页的大小
#define MEMORY_SIZE 256 //存储器的大小
void setup() {
Wire.begin();
Serial.begin(9600);
}
void loop() {
byte data[PAGE_SIZE]; //存储读取的数据
int address = 0; //存储器的地址
//写入数据
for(int i=0; i<PAGE_SIZE; i++) {
data[i] = i; //写入0-63的数字
}
int pageNumber = address / PAGE_SIZE; //计算页码
int pageOffset = address % PAGE_SIZE; //计算页内偏移量
Wire.beginTransmission(DEVICE_ADDRESS);
Wire.write(pageNumber >> 8); //写入页码的高字节
Wire.write(pageNumber & 0xFF); //写入页码的低字节
Wire.write(pageOffset); //写入页内偏移量
Wire.write(data, PAGE_SIZE); //写入数据
Wire.endTransmission();
delay(10); //等待写入完成
//读取数据
pageNumber = address / PAGE_SIZE; //计算页码
pageOffset = address % PAGE_SIZE; //计算页内偏移量
Wire.beginTransmission(DEVICE_ADDRESS);
Wire.write(pageNumber >> 8); //写入页码的高字节
Wire.write(pageNumber & 0xFF); //写入页码的低字节
Wire.write(pageOffset); //写入页内偏移量
Wire.endTransmission();
Wire.requestFrom(DEVICE_ADDRESS, PAGE_SIZE); //请求读取数据
while(Wire.available()) {
byte value = Wire.read(); //读取数据
Serial.print(value); //输出数据
Serial.print(" ");
}
Serial.println();
address += PAGE_SIZE; //移动到下一页
if(address >= MEMORY_SIZE) { //如果已经读取到最后一页
address = 0; //回到第一页
}
delay(1000); //等待一秒钟
}
dsp28335 M24M02 EPROMM 读写程序
由于DSP28335没有内置的EEPROM,因此需要通过外部设备来进行数据的读写。本文介绍如何通过DSP28335与M24M02 EEPROM进行通信。
首先需要了解M24M02 EEPROM的基本特性:
- M24M02是2M位的串行EEPROM
- M24M02支持标准的I2C总线通信协议
- M24M02具有128个页,每页16字节,总共2048个字节
接下来是DSP28335与M24M02的接口电路图:
![image](https://user-images.githubusercontent.com/87290368/136768738-8a8c6d4a-62d7-4c4f-b4a6-3d3e3b6c3e6f.png)
其中,SCL和SDA分别连接到I2C总线的时钟线和数据线。WP和VCC分别连接到M24M02的写保护引脚和电源引脚,CS连接到M24M02的片选引脚。
接下来是DSP28335与M24M02的读写程序:
```c
#include "DSP2833x_Device.h"
#include "DSP2833x_Examples.h"
#define M24M02_SLAVE_ADDR 0x50
void Init_I2C(void)
{
I2caRegs.I2CSAR = 0x0000; // Slave address
I2caRegs.I2CPSC.all = 6; // Prescaler - need 7-12 Mhz on module clk
I2caRegs.I2CCLKL = 10; // NOTE: must be non zero
I2caRegs.I2CCLKH = 5; // NOTE: must be non zero
I2caRegs.I2CIER.all = 0x24; // Enable SCD & ARDY interrupts
I2caRegs.I2CMDR.all = 0x0020; // Take I2C out of reset
}
void I2C_WriteByte(Uint16 slaveAddr, Uint16 memAddr, Uint16 data)
{
while (I2caRegs.I2CSTR.bit.BB); // Wait until I2C bus is free
I2caRegs.I2CSAR = slaveAddr; // Set slave address
I2caRegs.I2CCNT = 3; // Set data count
I2caRegs.I2CDXR = (memAddr >> 8); // Set memory address MSB
I2caRegs.I2CDXR = (memAddr & 0xFF); // Set memory address LSB
I2caRegs.I2CDXR = data; // Set data
I2caRegs.I2CMDR.all = 0x6E20; // Send data
while (!I2caRegs.I2CSTR.bit.ARDY); // Wait for data to be sent
while (I2caRegs.I2CSTR.bit.BB); // Wait until I2C bus is free
}
Uint16 I2C_ReadByte(Uint16 slaveAddr, Uint16 memAddr)
{
Uint16 data;
while (I2caRegs.I2CSTR.bit.BB); // Wait until I2C bus is free
I2caRegs.I2CSAR = slaveAddr; // Set slave address
I2caRegs.I2CCNT = 2; // Set data count
I2caRegs.I2CDXR = (memAddr >> 8); // Set memory address MSB
I2caRegs.I2CDXR = (memAddr & 0xFF); // Set memory address LSB
I2caRegs.I2CMDR.all = 0x2620; // Send memory address
while (!I2caRegs.I2CSTR.bit.ARDY); // Wait for memory address to be sent
I2caRegs.I2CSAR = slaveAddr; // Set slave address
I2caRegs.I2CCNT = 1; // Set data count
I2caRegs.I2CMDR.all = 0x2C20; // Send read command
while (!I2caRegs.I2CSTR.bit.ARDY); // Wait for read command to be sent
while (I2caRegs.I2CSTR.bit.RRDY); // Wait for data to be received
data = I2caRegs.I2CDRR; // Get data
while (I2caRegs.I2CSTR.bit.BB); // Wait until I2C bus is free
return data;
}
void main()
{
Init_I2C(); // 初始化I2C总线
I2C_WriteByte(M24M02_SLAVE_ADDR, 0x0000, 0x55); // 向M24M02写入数据
Uint16 data = I2C_ReadByte(M24M02_SLAVE_ADDR, 0x0000); // 从M24M02读取数据
while(1);
}
```
上述程序中,Init_I2C()函数用于初始化I2C总线,I2C_WriteByte()函数用于向M24M02写入一个字节的数据,I2C_ReadByte()函数用于从M24M02读取一个字节的数据。
在main函数中,首先初始化I2C总线,然后向M24M02写入一个字节的数据0x55,并将读取到的数据存储在变量data中,最后进入死循环等待。
阅读全文