DSP28335通过I2C外扩M24M02存储多数据代码
时间: 2023-11-12 12:59:31 浏览: 91
以下是DSP28335通过I2C外扩M24M02存储多数据的代码示例:
```c
#include "F2837xS_device.h"
#include "F2837xS_Examples.h"
#include "M24M02.h"
#define I2C_SLAVE_ADDR 0x50
Uint16 data[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
void main(void)
{
InitSysCtrl();
InitI2CGpio();
InitI2C(I2C_SLAVE_ADDR);
InitM24M02();
// 写入数据
for (int i = 0; i < 10; i++)
{
WriteM24M02(i * 2, data[i]);
}
// 读取数据
for (int i = 0; i < 10; i++)
{
data[i] = ReadM24M02(i * 2);
}
while(1);
}
```
其中,`InitI2CGpio()`和`InitI2C()`用于初始化I2C接口;`InitM24M02()`用于初始化M24M02存储器;`WriteM24M02()`用于写入数据;`ReadM24M02()`用于读取数据。在上述代码中,先使用`WriteM24M02()`将数据写入存储器,再使用`ReadM24M02()`将数据读取出来。
相关问题
DSP28335通过I2C外扩M24M02存储大量数据的代码
以下是DSP28335通过I2C外扩M24M02存储大量数据的代码,包括初始化、写入和读取操作。
初始化:
```c
#include "DSP2833x_Device.h"
#include "DSP2833x_Examples.h"
#include "DSP2833x_I2C.h"
#define M24M02_I2C_ADDR 0x50 // M24M02 I2C地址
void InitI2C(void)
{
// 初始化I2C总线
I2caRegs.I2CSAR = M24M02_I2C_ADDR; // 设置I2C从设备地址
I2caRegs.I2CPSC.all = 6; // 设置I2C时钟分频,SYSCLKOUT/(I2CPSC+1) = 150MHz/(6+1) = 21.43MHz
I2caRegs.I2CCLKL = 10; // 设置I2C时钟低电平时间,21.43MHz/(10+1) = 1.87MHz
I2caRegs.I2CCLKH = 5; // 设置I2C时钟高电平时间,21.43MHz/(5+1) = 3.57MHz
I2caRegs.I2CIER.all = 0x24; // 使能I2C中断,接收数据中断和总线错误中断
I2caRegs.I2CMDR.all = 0x0020; // 使能I2C模块,无主模式
}
```
写入数据:
```c
void WriteToM24M02(unsigned int address, unsigned char *data, unsigned int length)
{
unsigned int i;
I2caRegs.I2CCNT = length; // 设置数据长度
I2caRegs.I2CDXR = address >> 8; // 发送数据地址高字节
I2caRegs.I2CDXR = address & 0xFF; // 发送数据地址低字节
for (i = 0; i < length; i++)
{
I2caRegs.I2CDXR = data[i]; // 发送数据
while (I2caRegs.I2CSTR.bit.ARDY == 0); // 等待发送完成
}
}
```
读取数据:
```c
void ReadFromM24M02(unsigned int address, unsigned char *data, unsigned int length)
{
unsigned int i;
I2caRegs.I2CCNT = 2; // 先发送数据地址
I2caRegs.I2CDXR = address >> 8; // 发送数据地址高字节
I2caRegs.I2CDXR = address & 0xFF; // 发送数据地址低字节
I2caRegs.I2CCNT = length; // 再接收数据
I2caRegs.I2CDXR = (M24M02_I2C_ADDR << 1) | 1; // 发送读命令
for (i = 0; i < length; i++)
{
while (I2caRegs.I2CSTR.bit.RRDY == 0); // 等待接收完成
data[i] = I2caRegs.I2CDRR; // 读取数据
}
}
```
DSP28335通过I2外扩M24M02存大量数据代码
以下是一份DSP28335通过I2C外扩M24M02存储大量数据的代码示例:
```c
#include "DSP2833x_Device.h"
#include "DSP2833x_Examples.h"
#include "DSP2833x_I2C_defines.h"
#include "DSP2833x_I2C.h"
#define M24M02_I2C_ADDR 0x50 // M24M02 I2C地址
void M24M02_WriteByte(Uint16 addr, Uint16 data);
Uint16 M24M02_ReadByte(Uint16 addr);
void main(void)
{
InitSysCtrl(); // 系统时钟初始化
I2C_init(); // I2C初始化
// 写入数据
M24M02_WriteByte(0x0000, 0x01);
M24M02_WriteByte(0x0001, 0x02);
M24M02_WriteByte(0x0002, 0x03);
// 读取数据
Uint16 data1 = M24M02_ReadByte(0x0000);
Uint16 data2 = M24M02_ReadByte(0x0001);
Uint16 data3 = M24M02_ReadByte(0x0002);
while(1);
}
// 写入一个字节的数据
void M24M02_WriteByte(Uint16 addr, Uint16 data)
{
// 发送起始信号
I2C_start(I2caRegs.I2CSAR = M24M02_I2C_ADDR, I2C_WRITE);
// 发送地址
I2C_write(addr >> 8);
I2C_write(addr & 0xFF);
// 发送数据
I2C_write(data);
// 发送停止信号
I2C_stop();
}
// 读取一个字节的数据
Uint16 M24M02_ReadByte(Uint16 addr)
{
Uint16 data;
// 发送起始信号
I2C_start(I2caRegs.I2CSAR = M24M02_I2C_ADDR, I2C_WRITE);
// 发送地址
I2C_write(addr >> 8);
I2C_write(addr & 0xFF);
// 发送重复起始信号
I2C_start(I2caRegs.I2CSAR = M24M02_I2C_ADDR, I2C_READ);
// 读取数据
data = I2C_read(0);
// 发送停止信号
I2C_stop();
return data;
}
```
在上面的代码中,我们定义了M24M02的I2C地址为0x50,并实现了M24M02_WriteByte和M24M02_ReadByte两个函数,用于写入和读取一个字节的数据。在main函数中,我们分别写入了0x01、0x02和0x03三个数据,并读取了这三个数据,然后进入了一个无限循环。在实际应用中,我们可以根据需要修改数据的地址和数据值,以及添加其他功能。
阅读全文