• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >嵌入式开发 > PIC24FJ64GA306读写24LC512其他时地址0x00-0x03的数据被修改

PIC24FJ64GA306读写24LC512其他时地址0x00-0x03的数据被修改

作者:佚名 字体:[增加 减小] 来源:互联网 时间:2017-06-05

佚名通过本文主要向大家介绍了pic24fj64ga306,时租卡读写器,时分秒的读写,读写人,rfid读写器等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
问题:PIC24FJ64GA306读写24LC512其他时地址0x00-0x03的数据被修改
描述:

单片机 I2CEEPROM;

新手初次使用单片机烧写数据到EEPROM,在给EEPROM其他地址时写入数据时,地址0x00-0x03的数据被改变,请问是怎么回事呢?
现象如下:
        写完一个完整的数组到EEPROM后,增加相应的地址,又重新写入数据到新地址,一直循环,在第一次烧写的时候地址0x00-0x03的数据不会被修改,在第三次烧写数据的时候0x00-0x03的数据被就该,其值是数组中的四个数据,麻烦大家帮忙看看,卡这几天了。
代码如下:
unsigned char cC02Addr=0xA0;
unsigned char humidity_value_from_server[4];//数组用于存放读取EEPROM0x00-0x03的四个字节数据
unsigned char EEPROM_humidity_h_addr=0x00;//读取四个字节数据的高字节地址
unsigned char EEPROM_humidity_l_addr=0x00;//读取四个字节数据的低字节地址
 unsigned char       cMEM_h_w_addr=0x00;//不断写入数据的初始地址高字节
 unsigned char       cMEM_l_w_addr=0x0a;//不断写入数据的初始地址低字节
unsigned char return_data[71]={0x1,0x2,0x3,0x4,0x5,0x6,0x7,0x8,0x9,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x47,0x49,0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x70,0x71};
while(1)//循环写数据,并且写完后读取地址0x00的四个字节数据
    {
        xRead(cC02Addr,EEPROM_humidity_h_addr, EEPROM_humidity_l_addr,&humidity_value_from_server,sizeof(humidity_value_from_server));
        
        _RB15=0;
        Delay_N1ms(5); 
        xWrite(cC02Addr,cMEM_h_w_addr, cMEM_l_w_addr,&return_data,sizeof(return_data));//将该次测量数据存入EEROM 
        Delay_N1ms(5);               //延时5ms
        for(i=0;i<0x47;i++)
        {
            return_data[i]=0;
        }
        xRead(cC02Addr,cMEM_h_w_addr, cMEM_l_w_addr,&return_data,sizeof(return_data));
        Delay_N1ms(5);               //延时5ms      
        _RB15=1;
        write_low_addr=cMEM_l_w_addr+0x47;
        if(write_low_addr>255)
        {
            cMEM_l_w_addr=write_low_addr%256;
            cMEM_h_w_addr=cMEM_h_w_addr+1;
        }
        else
        cMEM_l_w_addr=write_low_addr;           
    }
函数代码:
void EEPROM_I2C_init()
{
    _TRISB15=0;//EEPROM使能脚,输出0,使能EEPROM写使能,输出1禁止写入数据到EEPROM
    _RB15=0;
    I2C2BRG=0x27;//定义I2C的波特率,Fcy=Fosc/2,8M时钟频率,I2C时钟频率400K
    I2C2CON=0x8000;//使能I2C1模块    
    EEPROM_return_flag=xWrite(cC02Addr,cMEM_h_w_addr, cMEM_l_w_addr,&cTXdata,sizeof(cTXdata));
    Delay_N1ms(5);               //延时5ms  
    EEPROM_return_flag = xRead(cC02Addr,cMEM_h_r_addr, cMEM_l_r_addr,&I2C_RXdata,sizeof(I2C_RXdata));
    Delay_N1ms(5);               //延时5ms
}
//写 24C02:ICaddr-IC地址, MEM_h_addr-单元高地址, MEM_l_addr-单元高地址,DataPtr-单元首址, Nbyte-字节数。
char xWrite( unsigned char  ICaddr, unsigned char  MEM_h_addr, unsigned char  MEM_l_addr, unsigned char  *DataPtr, unsigned char  Nbyte)
{ 
    char Flag; unsigned char  xAddr;
    I2C2CONbits.SEN = 1; 
    Delay_N1us(2);   //起动总线
    while(I2C2CONbits.SEN);            //等待启动结束
    xAddr=ICaddr; //xAddr等于EEPROM芯片地址
    Flag=WriteI2C1( &xAddr,1 );//发送EEPROM地址
    if( Flag !=0 )  
        return  Flag;             //出错返回
    xAddr=MEM_h_addr ; //xAddr等于EEPROM写入数据的首地址的高字节
    Flag=WriteI2C1(&xAddr ,1 );//发送待写入数据在EEPROM的首地址
    if( Flag !=0 )  
        return  Flag;
    xAddr=MEM_l_addr ; //xAddr等于EEPROM写入数据的首地址的低字节
    Flag=WriteI2C1(&xAddr ,1 );//发送待写入数据在EEPROM的首地址
    if( Flag !=0 )  
        return  Flag;
    Flag=WriteI2C1( DataPtr,Nbyte );//往EEPROM写入数据
    I2C2CONbits.PEN = 1;               //产生停止信号
    while(I2C2CONbits.PEN);            //等待停止信号结束
    return 0;
}
//写24C02:   指针data-待写数据的首地址,Nbyte-待写字节数.
//返回: 0-OK,       -1-有总线冲突,              -2-从器件无应答
char WriteI2C1(unsigned char  *data, unsigned char  NByte )
{
    while(NByte!=0)
    { 
        I2C2TRN = *data;
        if(I2C2STATbits.IWCOL) 
            return -1;     //有写冲突返回            &nbs
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 分数不多了,大家帮帮忙!PIC24FJ64GA306利用每次更换下次唤醒时间实现各个时间的闹钟,但是每次到凌晨第二天的时候,唤醒时间会出现6万多秒才能继续唤醒
  • PIC24FJ64GA306读写24LC512其他时地址0x00-0x03的数据被修改

相关文章

  • 2017-06-05 perl与汇编?????
  • 2017-06-05 PIC电平变化中断问题
  • 2017-06-05 请各位专家来帮助我下谢谢
  • 2017-06-05 三一重工中联重科如何计算重定位中的运行时存储地址
  • 2017-06-05 PCI配置端口操作是否存在多线程同步问题
  • 2017-06-05 请问6针的1394端口转9针的RS232串口需要转换芯片吗?
  • 2017-06-05 写过基于I2crtc驱动的请进
  • 2017-06-05 Windriver1020版本USB驱动发布问题(100分)(线上帮助解决愿意支付200元,北京现场帮助解决愿意支付人民币400元)
  • 2017-06-05 NDIS60lwf驱动,过滤修改数据后应用层无法收到数据
  • 2017-06-05 直流无刷电机PWM是调频吗?

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 学习PowerPC的起步。
    • 嵌入式开发,启动问题?
    • 联想y450无线网卡驱动mini2440无线网卡驱动问题(8192cu)
    • 使用UpdateDriverForPlugAndPlayDevices出错
    • 常用按键开关的构造和操作
    • 已经获得USB设备的句柄,如何向此设备发送命令?
    • 利用keil5SWD模式调试出现以下问题
    • 为啥Yosemite下我ping的地址和nslookup出来的地址不一样
    • 移植rtl8188cuUSBwifi应用界面打开wifi时,按键亮,但是检测不到信息
    • 4412开发板上的开发环境

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有