DSP28335和 EPROMM M24M02通讯存储多数据
时间: 2023-10-05 20:05:00 浏览: 95
DSP28335和M24M02通讯存储多数据的步骤如下:
1. 初始化DSP28335的SPI模块,设置SPI时钟、数据位数、极性和相位等参数。
2. 初始化M24M02的控制寄存器,包括写保护、寄存器保护、写入和读取使能等控制参数。
3. 使用DSP28335的SPI模块向M24M02发送写入命令和地址,将数据写入到M24M02的指定存储单元中。
4. 重复步骤3,将多个数据按地址顺序写入到M24M02中。
5. 使用DSP28335的SPI模块向M24M02发送读取命令和地址,读取指定存储单元中的数据。
6. 重复步骤5,按地址顺序读取多个数据。
7. 关闭SPI模块和M24M02的控制寄存器,完成通讯存储多数据的操作。
需要注意的是,M24M02的存储容量有限,如果需要存储大量数据,可以考虑使用外部存储器或者使用多个M24M02进行存储。同时,在通讯过程中需要确保数据的正确性和完整性,可以使用校验码等方式进行验证。
相关问题
DSP28335和M24M02 通讯存储多数据代码
以下是DSP28335和M24M02通讯存储多数据的代码示例:
#include "DSP2833x_Device.h"
#include "DSP2833x_Examples.h"
#include "M24M02.h"
Uint16 data[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; // 要存储的数据
void main(void)
{
InitSysCtrl(); // 初始化系统时钟
InitSPI(); // 初始化SPI接口
InitM24M02(); // 初始化M24M02芯片
// 存储数据
for(Uint16 i=0; i<10; i++)
{
WriteM24M02(i*2, data[i]); // 写入数据
}
// 读取数据
for(Uint16 i=0; i<10; i++)
{
Uint16 readData = ReadM24M02(i*2); // 读取数据
if(readData != data[i]) // 判断读取的数据是否正确
{
// 数据错误处理
}
}
while(1);
}
其中,InitSPI()和InitSysCtrl()函数是初始化SPI接口和系统时钟的函数,具体实现可以参考DSP2833x的相关手册。InitM24M02()函数是初始化M24M02芯片的函数,具体实现如下:
void InitM24M02(void)
{
// 设置SPI时钟频率为200kHz
SpiaRegs.SPICCR.bit.CLKPOLARITY = 0; // 时钟极性为低电平
SpiaRegs.SPICCR.bit.SPICHAR = 15; // 字长为16位
SpiaRegs.SPIBRR = 299; // 时钟分频系数为300,SPI时钟频率为200kHz
// 初始化M24M02芯片
WriteM24M02(0, 0x06); // 写入写使能命令
WriteM24M02(0, 0x01); // 写入写保护寄存器地址
WriteM24M02(0, 0x00); // 写入写保护寄存器值,禁止写保护
}
WriteM24M02函数用于向M24M02芯片写入数据,具体实现如下:
void WriteM24M02(Uint16 addr, Uint16 data)
{
// 发送写使能命令
SpiaRegs.SPITXBUF = 0x06;
while(SpiaRegs.SPISTS.bit.INT_FLAG == 0);
// 发送写命令和地址
SpiaRegs.SPITXBUF = 0x02;
while(SpiaRegs.SPISTS.bit.INT_FLAG == 0);
SpiaRegs.SPITXBUF = (addr>>8) & 0xFF;
while(SpiaRegs.SPISTS.bit.INT_FLAG == 0);
SpiaRegs.SPITXBUF = addr & 0xFF;
while(SpiaRegs.SPISTS.bit.INT_FLAG == 0);
// 发送数据
SpiaRegs.SPITXBUF = (data>>8) & 0xFF;
while(SpiaRegs.SPISTS.bit.INT_FLAG == 0);
SpiaRegs.SPITXBUF = data & 0xFF;
while(SpiaRegs.SPISTS.bit.INT_FLAG == 0);
}
ReadM24M02函数用于从M24M02芯片读取数据,具体实现如下:
Uint16 ReadM24M02(Uint16 addr)
{
Uint16 readData;
// 发送读命令和地址
SpiaRegs.SPITXBUF = 0x03;
while(SpiaRegs.SPISTS.bit.INT_FLAG == 0);
SpiaRegs.SPITXBUF = (addr>>8) & 0xFF;
while(SpiaRegs.SPISTS.bit.INT_FLAG == 0);
SpiaRegs.SPITXBUF = addr & 0xFF;
while(SpiaRegs.SPISTS.bit.INT_FLAG == 0);
// 读取数据
SpiaRegs.SPITXBUF = 0x00;
while(SpiaRegs.SPISTS.bit.INT_FLAG == 0);
readData = (SpiaRegs.SPIRXBUF<<8) & 0xFF00;
SpiaRegs.SPITXBUF = 0x00;
while(SpiaRegs.SPISTS.bit.INT_FLAG == 0);
readData |= (SpiaRegs.SPIRXBUF & 0xFF);
return readData;
}
DSP28335 IIC读写M24M02的多个数据
以下是DSP28335使用IIC读写M24M02的多个数据的代码示例:
首先需要初始化IIC,如下所示:
```c
void InitI2C(void)
{
// 设置I2C引脚
EALLOW;
GpioCtrlRegs.GPBPUD.bit.GPIO32 = 0;
GpioCtrlRegs.GPBMUX1.bit.GPIO32 = 1;
GpioCtrlRegs.GPBMUX1.bit.GPIO33 = 1;
EDIS;
// 初始化I2C
I2caRegs.I2CMDR.bit.IRS = 0; // I2C复位
I2caRegs.I2CPSC.all = 6; // 分频器值为6,时钟频率为150kHz
I2caRegs.I2CSAR = M24M02_ADDR; // 设置从设备地址
I2caRegs.I2CMDR.bit.IRS = 1; // 退出I2C复位
}
```
然后可以定义一个函数来写入多个数据:
```c
void WriteMultipleBytes(uint16_t addr, uint16_t num, uint8_t *data)
{
uint16_t i;
// 发送起始信号
I2caRegs.I2CMDR.bit.STP = 1;
I2caRegs.I2CMDR.bit.MST = 1;
I2caRegs.I2CDXR = (M24M02_ADDR << 1) & 0xFE;
I2caRegs.I2CMDR.bit.TRX = 1;
I2caRegs.I2CMDR.bit.STT = 1;
while (I2caRegs.I2CSTR.bit.ARDY == 0);
// 发送地址
I2caRegs.I2CDXR = (addr >> 8) & 0xFF;
while (I2caRegs.I2CSTR.bit.ARDY == 0);
I2caRegs.I2CDXR = addr & 0xFF;
while (I2caRegs.I2CSTR.bit.ARDY == 0);
// 发送数据
for (i = 0; i < num; i++)
{
I2caRegs.I2CDXR = data[i];
while (I2caRegs.I2CSTR.bit.ARDY == 0);
}
// 发送停止信号
I2caRegs.I2CMDR.bit.STP = 1;
while (I2caRegs.I2CSTR.bit.ARDY == 0);
}
```
然后可以定义一个函数来读取多个数据:
```c
void ReadMultipleBytes(uint16_t addr, uint16_t num, uint8_t *data)
{
uint16_t i;
// 发送起始信号
I2caRegs.I2CMDR.bit.STP = 1;
I2caRegs.I2CMDR.bit.MST = 1;
I2caRegs.I2CDXR = (M24M02_ADDR << 1) & 0xFE;
I2caRegs.I2CMDR.bit.TRX = 1;
I2caRegs.I2CMDR.bit.STT = 1;
while (I2caRegs.I2CSTR.bit.ARDY == 0);
// 发送地址
I2caRegs.I2CDXR = (addr >> 8) & 0xFF;
while (I2caRegs.I2CSTR.bit.ARDY == 0);
I2caRegs.I2CDXR = addr & 0xFF;
while (I2caRegs.I2CSTR.bit.ARDY == 0);
// 发送重复起始信号
I2caRegs.I2CMDR.bit.STP = 1;
I2caRegs.I2CMDR.bit.MST = 1;
I2caRegs.I2CDXR = (M24M02_ADDR << 1) | 0x01;
I2caRegs.I2CMDR.bit.TRX = 0;
I2caRegs.I2CMDR.bit.STT = 1;
while (I2caRegs.I2CSTR.bit.ARDY == 0);
// 读取数据
for (i = 0; i < num; i++)
{
while (I2caRegs.I2CSTR.bit.RRDY == 0);
data[i] = I2caRegs.I2CDRR;
}
// 发送停止信号
I2caRegs.I2CMDR.bit.STP = 1;
while (I2caRegs.I2CSTR.bit.ARDY == 0);
}
```
使用上述函数可以实现对M24M02的多个数据的读写操作。
阅读全文