野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 20846|回复: 10

真心求助啊------>关于I2C_EEPOM--都崩溃了

[复制链接]
发表于 2013-11-9 19:34:18 | 显示全部楼层 |阅读模式
下面是我的main.c文件中的程序,基本是套用火哥你的格式;其他引用文件我就不加进来了,一样的。
我的目的是,每次开机将eeprom中的第一页前三个字节读出来,然后用此点亮3个LED灯,最后将读出的数组中的每个元素加1写再进eeprom。按理说,应该每次开机3个LED就翻转一次,遗憾的是每次开机3个LED都没什么变化,今天星期六,本来想出去
玩的,结果搞了一下午,连午饭都没吃,现在没办法,来求助啦,今天一定要得到答案啊!!

#include "stm32f10x.h"
#include "led.h"
#include "eeprom.h"


#define  EEP_Firstpage   0x00

u8 I2c_Buf_Write[3];
u8 I2c_Buf_Read[3];


/*
    *函数名:main
        *描述:主函数
        *输入:无
        *输出:无
*/

int main(void)
{
        LED_GPIO_Config();       
        I2C_EE_Init();

        I2C_EE_BufferRead(I2c_Buf_Read, EEP_Firstpage, 3);
        I2c_Buf_Write[0]=I2c_Buf_Read[0]+1;
        I2c_Buf_Write[1]=I2c_Buf_Read[1]+1;
        I2c_Buf_Write[2]=I2c_Buf_Read[2]+1;

        I2C_EE_BufferWrite(I2c_Buf_Write, EEP_Firstpage, 3);
        LED1(I2c_Buf_Read[0]);
        LED2(I2c_Buf_Read[1]);
        LED3(I2c_Buf_Read[2]);
        while(1);
}

回复

使用道具 举报

发表于 2013-11-9 19:55:42 | 显示全部楼层
先测试一下嘛
  1. int main(void)
  2. {
  3.         LED_GPIO_Config();        
  4.         I2C_EE_Init();
  5.         I2c_Buf_Read[0] =I2c_Buf_Read[1]=I2c_Buf_Read[2]=0;
  6. //这样正常的话LED是会亮的
  7.         LED1(I2c_Buf_Read[0]);
  8.         LED2(I2c_Buf_Read[1]);
  9.         LED3(I2c_Buf_Read[2]);

  10.         I2C_EE_BufferRead(I2c_Buf_Read, EEP_Firstpage, 3);
  11. //再看看读出来的数据是什么数据,给LED看看是不是会亮
  12.         LED1(I2c_Buf_Read[0]);
  13.         LED2(I2c_Buf_Read[1]);
  14.         LED3(I2c_Buf_Read[2]);

  15. //修改数据,写入eeprom
  16.         I2c_Buf_Write[0]=I2c_Buf_Read[0]+1;
  17.         I2c_Buf_Write[1]=I2c_Buf_Read[1]+1;
  18.         I2c_Buf_Write[2]=I2c_Buf_Read[2]+1;

  19.         I2C_EE_BufferWrite(I2c_Buf_Write, EEP_Firstpage, 3);

  20.         while(1);
  21. }
复制代码
你也可以添加串口,使用串口调试助手把eeprom读出的数据打印到pc上,这样就方便调试了。
回复 支持 反对

使用道具 举报

发表于 2013-11-10 11:55:38 | 显示全部楼层
在I2C读写之后都加个延时试试。
回复 支持 反对

使用道具 举报

发表于 2013-11-10 12:16:00 | 显示全部楼层
帮你顶下哈!!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-11-13 19:43:30 | 显示全部楼层
随风 发表于 2013-11-9 19:55
先测试一下嘛你也可以添加串口,使用串口调试助手把eeprom读出的数据打印到pc上,这样就方便调试了。

哥,我将你的程序COPY上去试了下,结果只是LED1亮着,LED2,LED3没反应,好奇怪!你试试看!!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-11-13 20:13:11 | 显示全部楼层
汪永洪 发表于 2013-11-13 19:43
哥,我将你的程序COPY上去试了下,结果只是LED1亮着,LED2,LED3没反应,好奇怪!你试试看!!

#include "stm32f10x.h"
#include "led.h"
#include "eeprom.h"


#define  EEP_Firstpage   0x00

u8 I2c_Buf_Write[3];
u8 I2c_Buf_Read[3];


void Delay(__IO u32 nCount);         //简单的延时函数

/*
    *函数名:main
        *描述:主函数
        *输入:无
        *输出:无
*/

int main(void)
{
        LED_GPIO_Config();        
        I2C_EE_Init();
        I2c_Buf_Read[0] =I2c_Buf_Read[1]=I2c_Buf_Read[2]=0;
//这样正常的话LED是会亮的
        LED1(I2c_Buf_Read[0]);
        LED2(I2c_Buf_Read[1]);
        LED3(I2c_Buf_Read[2]);

        I2C_EE_BufferRead(I2c_Buf_Read, EEP_Firstpage, 3);
//再看看读出来的数据是什么数据,给LED看看是不是会亮
        LED1(I2c_Buf_Read[0]);
                Delay(0x0FFFFF);
        LED2(I2c_Buf_Read[1]);
                Delay(0x0FFFFF);
        LED3(I2c_Buf_Read[2]);
                Delay(0x0FFFFF);
//修改数据,写入eeprom
        I2c_Buf_Write[0]=~I2c_Buf_Read[0];
        I2c_Buf_Write[1]=~I2c_Buf_Read[1];
        I2c_Buf_Write[2]=~I2c_Buf_Read[2];

        I2C_EE_BufferWrite(I2c_Buf_Write, EEP_Firstpage, 3);
                Delay(0x0FFFFF);
        while(1);
}

void Delay(__IO u32 nCount)         //简单的延时函数
{
        for(; nCount != 0; nCount--);
}
我又改了下程序,还是没有达到预期目的,每次开机LED都没有翻转!!是不是数据没有写进EEPROM啊
回复 支持 反对

使用道具 举报

发表于 2013-11-13 20:43:29 | 显示全部楼层
用jtag仿真一下,或者用串口打印数据出来,这样才直观呀
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-11-13 21:39:28 | 显示全部楼层
随风 发表于 2013-11-9 19:55
先测试一下嘛你也可以添加串口,使用串口调试助手把eeprom读出的数据打印到pc上,这样就方便调试了。

哈哈,经过一次在线仿真调试,我果真找到答案了。问题不在程序,在于我的LED点亮函数,因为每个LED的点亮是一位数据的翻转,而我们这里从EEPROM读出来的数据是一个字节(8位)的所以,如果写1进去,读出来再取反的,或者+1,这个数都不是0。所以LED没有反应。OK,看来这个JLinK模块还是挺好的哦!!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-11-13 21:39:58 | 显示全部楼层
随风 发表于 2013-11-9 19:55
先测试一下嘛你也可以添加串口,使用串口调试助手把eeprom读出的数据打印到pc上,这样就方便调试了。

哈哈,经过一次在线仿真调试,我果真找到答案了。问题不在程序,在于我的LED点亮函数,因为每个LED的点亮是一位数据的翻转,而我们这里从EEPROM读出来的数据是一个字节(8位)的所以,如果写1进去,读出来再取反的,或者+1,这个数都不是0。所以LED没有反应。OK,看来这个JLinK模块还是挺好的哦!!
回复 支持 反对

使用道具 举报

发表于 2013-11-13 21:42:13 | 显示全部楼层
汪永洪 发表于 2013-11-13 21:39
哈哈,经过一次在线仿真调试,我果真找到答案了。问题不在程序,在于我的LED点亮函数,因为每个LED的点亮 ...

必须 要学会在线仿真的
回复 支持 反对

使用道具 举报

发表于 2013-11-13 22:04:31 | 显示全部楼层
我不会告诉你,火哥I2C例程是有问题的,不信你把那个串口打印读出内容那两段都执行两次试试!~
回复 支持 反对

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-11-23 15:01 , Processed in 0.041432 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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