AT24C1024全容量读写NXPLPC11XX源程序
[复制链接]
AT24C1024全容量读写程序,只要读写起始地址和读写长度,程序自动跨页,绝对原创、绝对好用,含测试程序。
单片机源程序如下:
#include "nxplpc11xx.h"
#include "i2c.h"
#include "AT24C1024.h"
/************************************************************/
/* 函数功能:从AT24C1024中读数据 */
/* 入口参数StartAddr:起始地址,经测试跨页时地址会自动加1。*/
/* *pData:读入的数据放到这个数组中 */
/* nBytes:要写的数据字节个数 */
/************************************************************/
void AT24C1024_Read(uint32 StartAddr, uint16 nBytes, uint8 *pData)
{
uint8 StartAddr_L, StartAddr_H, P0;
StartAddr_L = StartAddr & 0x0000ff;
StartAddr_H = (StartAddr >> 8) & 0x0ff;
P0 = (StartAddr / 0x10000) << 1;
I2C_Send_Ctrl(AT24C1024_Addr | P0);
I2C_Send_Byte(StartAddr_H);
I2C_Send_Byte(StartAddr_L);
I2C_Stop();
I2C_Send_Ctrl((AT24C1024_Addr | P0) + 1);
while(nBytes != 1)
{
*pData++=I2C_Recieve_Byte(1); // 应答位为ACK,不释放总线,继续读
nBytes--;
}
*pData++=I2C_Recieve_Byte(0); // 应答位为NACK,停止读,释放总线
I2C_Stop(); // 产生一个停止条件
delay_us(10); // 这个延时是任意地址读两段数据时最小时间间隔,保证停止位后正常产生下一个开始位。
}
/*******************************************************************/
/* 函数功能:给AT24C1024写数据 */
/* 入口参数StartAddr:起始地址,跨页写时,需要重新写入地址数据。 */
/* *pData:把这个数组中的数据写入 */
/* nBytes:要写的数据字节个数 */
/*******************************************************************/
void AT24C1024_Write(uint32 StartAddr, uint16 nBytes, uint8 *pData)
{
uint8 StartAddr_L, StartAddr_H, P0;
while(nBytes != 0) // 所有数据发送完毕,退出循环
{
StartAddr_L = StartAddr & 0x0000ff; // 计算低位地址
StartAddr_H = (StartAddr >> 8) & 0x0ff; // 计算高位地址
P0 = (StartAddr / 0x10000) << 1; // 计算第17位,即P0
I2C_Send_Ctrl(AT24C1024_Addr | P0); // 带P0发送器件地址
I2C_Send_Byte(StartAddr_H); // 发送高位地址
I2C_Send_Byte(StartAddr_L); // 发送低位地址
while(nBytes != 0) // 数据未发送完,循环
{
I2C_Send_Byte(*pData);
pData++;
nBytes--;
StartAddr++;
if((StartAddr & 0x00ff) == 0) // 跨页,终止当前页循环,重新写入新地址
break;
}
I2C_Stop(); // 产生一个停止条件
delay_ms(3); // 这个延时为两次读写最小间隔时间,不要删除,连续大量写数据时有用。
}
}
复制代码
/************************************************/
/* AT24C1024全容量读写程序 */
/* CPU型号:LPC1114FBD/302 */
/************************************************/
#include "nxplpc11xx.h"
#include "i2c.h"
#include "AT24C1024.h"
int main()
{
union Initial_Value{uint8 Val_Hex[400];float Val_Float[100];}Init; //定义一个浮点数组,用于写入和读出,一个浮点数用4个字节
uint16 i;
float j;
SysCLK_config(); // 时钟配置
I2C_Init(0); // 初始化I2C 快速模式
delay_ms(10);
for(i=0; i<100; i++) // 初始化浮点数组分别为0——99。
{
j = i;
Init.Val_Float[i] = j;
}
AT24C1024_Write(0xff80, 400, Init.Val_Hex); // 写入
delay_ms (3);
AT24C1024_Read(0xff80, 400, Init.Val_Hex);
while(1)
{};
}
|