社区导航

 

搜索
查看: 142|回复: 0

[资料分享] AT24C1024全容量读写NXPLPC11XX源程序

[复制链接]

5695

TA的帖子

19

TA的资源

一粒金砂(高级)

Rank: 3Rank: 3

发表于 2019-10-9 08:52 | 显示全部楼层 |阅读模式
AT24C1024全容量读写程序,只要读写起始地址和读写长度,程序自动跨页,绝对原创、绝对好用,含测试程序。

单片机源程序如下:
  1. #include "nxplpc11xx.h"
  2. #include "i2c.h"
  3. #include "AT24C1024.h"
  4.  
  5. /************************************************************/
  6. /* 函数功能:从AT24C1024中读数据                            */
  7. /* 入口参数StartAddr:起始地址,经测试跨页时地址会自动加1。*/
  8. /*           *pData:读入的数据放到这个数组中                */
  9. /*           nBytes:要写的数据字节个数                     */
  10. /************************************************************/
  11. void AT24C1024_Read(uint32 StartAddr, uint16 nBytes, uint8 *pData)
  12. {                                
  13.     uint8 StartAddr_L, StartAddr_H, P0;
  14.     StartAddr_L = StartAddr & 0x0000ff;
  15.           StartAddr_H = (StartAddr >> 8) & 0x0ff;
  16.           P0 = (StartAddr / 0x10000) << 1;
  17.           I2C_Send_Ctrl(AT24C1024_Addr | P0); 
  18.           I2C_Send_Byte(StartAddr_H);        
  19.           I2C_Send_Byte(StartAddr_L);        
  20.           I2C_Stop();        
  21.     I2C_Send_Ctrl((AT24C1024_Addr | P0) + 1); 
  22.            while(nBytes != 1)
  23.           {
  24.     *pData++=I2C_Recieve_Byte(1);                     // 应答位为ACK,不释放总线,继续读
  25.                 nBytes--;
  26.           }
  27.                 *pData++=I2C_Recieve_Byte(0);              // 应答位为NACK,停止读,释放总线
  28.                 I2C_Stop();                                // 产生一个停止条件  
  29.                 delay_us(10);                              // 这个延时是任意地址读两段数据时最小时间间隔,保证停止位后正常产生下一个开始位。
  30. }  
  31. /*******************************************************************/
  32. /* 函数功能:给AT24C1024写数据                                     */
  33. /* 入口参数StartAddr:起始地址,跨页写时,需要重新写入地址数据。  */
  34. /*           *pData:把这个数组中的数据写入                         */
  35. /*           nBytes:要写的数据字节个数                            */
  36. /*******************************************************************/
  37. void AT24C1024_Write(uint32 StartAddr, uint16 nBytes, uint8 *pData)
  38. {
  39.     uint8 StartAddr_L, StartAddr_H, P0;
  40.           while(nBytes != 0)                      // 所有数据发送完毕,退出循环
  41.           {
  42.           StartAddr_L = StartAddr & 0x0000ff;     // 计算低位地址
  43.           StartAddr_H = (StartAddr >> 8) & 0x0ff; // 计算高位地址
  44.           P0 = (StartAddr / 0x10000) << 1;        // 计算第17位,即P0
  45.     I2C_Send_Ctrl(AT24C1024_Addr | P0);     // 带P0发送器件地址
  46.           I2C_Send_Byte(StartAddr_H);                    // 发送高位地址
  47.           I2C_Send_Byte(StartAddr_L);                    // 发送低位地址
  48.           while(nBytes != 0)                      // 数据未发送完,循环
  49.           {
  50.           I2C_Send_Byte(*pData);         
  51.                 pData++;
  52.     nBytes--;                
  53.                 StartAddr++;
  54.                 if((StartAddr & 0x00ff) == 0)           // 跨页,终止当前页循环,重新写入新地址
  55.                 break;
  56.           }                
  57.           I2C_Stop();                             // 产生一个停止条件 
  58.                 delay_ms(3);                            // 这个延时为两次读写最小间隔时间,不要删除,连续大量写数据时有用。
  59.   } 
  60. }
  61.  
复制代码
  1. /************************************************/
  2. /* AT24C1024全容量读写程序                      */
  3. /* CPU型号:LPC1114FBD/302                      */
  4. /************************************************/
  5. #include "nxplpc11xx.h"
  6. #include "i2c.h"
  7. #include "AT24C1024.h"
  8. int main()
  9. {
  10. union Initial_Value{uint8 Val_Hex[400];float Val_Float[100];}Init;    //定义一个浮点数组,用于写入和读出,一个浮点数用4个字节
  11.       uint16 i;      
  12.       float j;
  13.         SysCLK_config();         // 时钟配置
  14.   I2C_Init(0);             // 初始化I2C 快速模式
  15.   delay_ms(10);
  16.   for(i=0; i<100; i++)     // 初始化浮点数组分别为0——99。
  17.   {
  18.   j = i;
  19.   Init.Val_Float[i] = j;
  20.         }
  21.         AT24C1024_Write(0xff80, 400, Init.Val_Hex);   // 写入
  22.         delay_ms (3);
  23.         AT24C1024_Read(0xff80, 400, Init.Val_Hex);        
  24.   while(1)
  25.         {};
  26. }


回复

使用道具 举报

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

关闭

站长推荐上一条 /5 下一条

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

Archiver|手机版|小黑屋|电子工程世界 ( 京ICP证 060456 )

GMT+8, 2019-11-19 05:22 , Processed in 0.080004 second(s), 18 queries , Gzip On, MemCache On.

快速回复 返回顶部 返回列表