DSP28335通过I2C和M24M02通讯储存多页面程序代码示例
时间: 2024-05-07 10:15:13 浏览: 157
以下是DSP28335通过I2C和M24M02通讯储存多页面程序代码示例:
首先,需要定义I2C的相关变量和M24M02的地址:
```c
#define I2C_SLAVE_ADDR 0x50 // M24M02的I2C地址
Uint16 I2C_EEPROM_ADDR = 0x0000; // M24M02的内部地址
Uint16 NumOfPages = 2; // 需要储存的页面数
Uint16 PageSize = 256; // 每一页的大小
```
然后,需要初始化I2C和M24M02:
```c
void InitI2C(void)
{
I2caRegs.I2CMDR.bit.IRS = 0; // 复位I2C
I2caRegs.I2CMDR.bit.FREE = 1; // 允许I2C自由模式
I2caRegs.I2CSAR = I2C_SLAVE_ADDR; // 设置I2C从机地址
I2caRegs.I2CPSC.all = 7; // 时钟分频器设置为8
I2caRegs.I2CCLKL = 10; // 时钟低电平宽度为10个I2C时钟周期
I2caRegs.I2CCLKH = 5; // 时钟高电平宽度为5个I2C时钟周期
I2caRegs.I2CMDR.all = 0x0020; // 启用I2C、中断、NACK模式
}
void InitM24M02(void)
{
Uint16 i;
for (i = 0; i < NumOfPages; i++)
{
M24M02_WritePage(i, 0, PageSize, 0); // 清空每一页
}
}
```
接下来,可以定义读写M24M02的函数:
```c
void M24M02_WritePage(Uint16 Page, Uint16 Offset, Uint16 Length, Uint16* Data)
{
Uint16 i;
Uint16 address = Page * PageSize + Offset;
I2caRegs.I2CCNT = Length + 2; // 数据长度加上内部地址2个字节
I2caRegs.I2CDXR = address >> 8; // 发送高位地址
I2caRegs.I2CDXR = address & 0xFF; // 发送低位地址
for (i = 0; i < Length; i++)
{
I2caRegs.I2CDXR = Data[i]; // 发送数据
}
I2caRegs.I2CMDR.bit.STP = 1; // 发送停止位
while (I2caRegs.I2CSTR.bit.BB == 1); // 等待总线空闲
}
void M24M02_ReadPage(Uint16 Page, Uint16 Offset, Uint16 Length, Uint16* Data)
{
Uint16 i;
Uint16 address = Page * PageSize + Offset;
I2caRegs.I2CCNT = 2; // 发送内部地址2个字节
I2caRegs.I2CDXR = address >> 8; // 发送高位地址
I2caRegs.I2CDXR = address & 0xFF; // 发送低位地址
I2caRegs.I2CMDR.bit.STP = 0; // 发送重复开始位
I2caRegs.I2CCNT = Length; // 读取数据长度
I2caRegs.I2CSAR = I2C_SLAVE_ADDR | 0x01; // 设置I2C从机读取模式
for (i = 0; i < Length; i++)
{
while (I2caRegs.I2CSTR.bit.RRDY == 0); // 等待数据接收
Data[i] = I2caRegs.I2CDRR; // 读取数据
}
I2caRegs.I2CSAR = I2C_SLAVE_ADDR; // 设置I2C从机写入模式
}
```
最后,可以使用这些函数来储存和读取多个页面的数据:
```c
Uint16 page, offset;
Uint16 data[PageSize];
// 储存数据
for (page = 0; page < NumOfPages; page++)
{
for (offset = 0; offset < PageSize; offset += 2)
{
data[offset] = page;
data[offset + 1] = offset / 2;
}
M24M02_WritePage(page, 0, PageSize, data);
}
// 读取数据
for (page = 0; page < NumOfPages; page++)
{
M24M02_ReadPage(page, 0, PageSize, data);
for (offset = 0; offset < PageSize; offset += 2)
{
if (data[offset] != page || data[offset + 1] != offset / 2)
{
// 数据错误
}
}
}
```
这样,DSP28335就可以使用I2C和M24M02储存和读取多个页面的数据了。
阅读全文