1973|0

1140

帖子

0

TA的资源

纯净的硅(初级)

楼主
 

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)
        {};
}

 
点赞 关注

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表