37556|36

65

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

终于搞定了STM32读写EEPROM [复制链接]

ST网站上的例程是读写24c08的,他的读函数有问题,原来我在51下一直模拟I2C操作的,用起来心里很有数,按照模拟I2C的步骤重写了读写函数,连续读写,自动处理跨页问题,很容易修改成24C08/32/128/512的读写函数,把我的代码公布如下:
void I2C_AcknowledgePolling(void){
    do{
        I2C_GenerateSTART(I2C1,ENABLE);
        I2C_ReadRegister(I2C1,I2C_Register_SR1);//清除ADDR位

        I2C_Send7bitAddress(I2C1,0xa0,I2C_Direction_Transmitter);
    }while(!(I2C_ReadRegister(I2C1,I2C_Register_SR1)&0x0002));
  
    I2C_ClearFlag(I2C1,I2C_FLAG_AF);
}
void I2C_SequentialRead_AT24C01_02(u8 sla,u8 suba,u8 *pHead,u8 len){
    u8 i;

    I2C_AcknowledgePolling();
    
    I2C_GenerateSTART(I2C1,ENABLE);
    while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT));  
               
    I2C_SendData(I2C1,sla);
    while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));

    I2C_SendData(I2C1,suba);
    while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED));
               
    I2C_GenerateSTART(I2C1,ENABLE);
    while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT));  

    I2C_SendData(I2C1,sla+1);
    while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));    

    if(len>1){
        for(i=0;i<len-1;i++){
            while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_RECEIVED));
            *pHead=I2C_ReceiveData(I2C1);
            I2C_AcknowledgeConfig(I2C1,ENABLE);
            pHead++;
        }
    }
    while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_RECEIVED));
    *pHead=I2C_ReceiveData(I2C1);

    I2C_AcknowledgeConfig(I2C1,DISABLE);
    I2C_GenerateSTOP(I2C1,ENABLE);
}
void I2C_PageWrite_AT24C01_02(u8 sla,u8 suba,u8 *pHead,u8 len){
    u8 wLen,addr;
    
    wLen=len;
    addr=suba;
    ScrollPage:I2C_AcknowledgePolling();
    
               I2C_GenerateSTART(I2C1,ENABLE);
               while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT));  
  
               I2C_SendData(I2C1,sla);
               while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));

               I2C_SendData(I2C1,addr);
               while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED));
                              
               I2C_SendData(I2C1,*pHead++);
               while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED));
               
               addr++;
               wLen--;
        
    while(wLen){
        if((addr%8)!=0){
            I2C_SendData(I2C1,*pHead++);
            while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED));
            
            addr++;
            wLen--;
        }
        else{
            I2C_GenerateSTOP(I2C1,ENABLE);
            goto ScrollPage;
        }
    }
    I2C_GenerateSTOP(I2C1, ENABLE);
}
此帖出自stm32/stm8论坛

最新回复

                                 读和写本身就需要时间,不需要延时太长时间  详情 回复 发表于 2010-1-19 18:45
点赞 关注
 

回复
举报

74

帖子

0

TA的资源

一粒金砂(初级)

沙发
 

hotpower能不能抽出点儿宝贵的时间给大家客串下老师呀

                                  
此帖出自stm32/stm8论坛
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

板凳
 

帮你顶下

刚写了就读,刚读了就写,
总该给它点反应时间。
此帖出自stm32/stm8论坛
 
 

回复

77

帖子

0

TA的资源

一粒金砂(中级)

4
 

3楼说得对,每次操作之前都需要检测上次操作是否完成

                                 提供的例程只是演示了如何操作I2C接口,并不能当作完整的函数操作演示的设备,需要经过完善才能实用。
此帖出自stm32/stm8论坛
 
 
 

回复

88

帖子

0

TA的资源

一粒金砂(初级)

5
 

正常都有AcknowledgePolling的

这个我是考虑过的,就算是没有,连续执行两个I2C_EE_BufferRead()也死,这怎么解释?
我晕,ST提供的例程全是演示用的?
此帖出自stm32/stm8论坛
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

6
 

我的意思是要检测外设内部的状态,确认它内部的操作已经

                                 AcknowledgePolling只是检测I2C总线的状态,并不反映所要操作的设备状态。
此帖出自stm32/stm8论坛
 
 
 

回复

83

帖子

0

TA的资源

一粒金砂(初级)

7
 

我晕

                                 主程序初始化后只执行两个I2C_EE_BufferRead(),我复位后等n分钟后再全速运行也是死在第2个I2C_EE_BufferRead()里面,难道读动作也要等到24C02不忙?
此帖出自stm32/stm8论坛
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

8
 

你的I2C速度是多少?一次读多少字节?

                                  
此帖出自stm32/stm8论坛
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

9
 

100k,3个字节

                                  
此帖出自stm32/stm8论坛
 
 
 

回复

83

帖子

0

TA的资源

一粒金砂(初级)

10
 

发现了一点儿规律

                                 每次读写不超过4个字节就不会死,明天继续研究。。。
此帖出自stm32/stm8论坛
 
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

11
 

又发现了规律

                                 连续写的话每次写多少个字节都行,但是每次连续读不能多于4个字节
此帖出自stm32/stm8论坛
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

12
 

24C02 24C08不同

                                 万利的例程里修改了page_size=4,st例程里是page_size=16,
此帖出自stm32/stm8论坛
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

13
 

24c02的page_size为8

                                  
此帖出自stm32/stm8论坛
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

14
 

经多次试验完整无误

                                  
此帖出自stm32/stm8论坛
 
 
 

回复

61

帖子

0

TA的资源

一粒金砂(初级)

15
 

ok

                                  
此帖出自stm32/stm8论坛
 
 
 

回复

86

帖子

0

TA的资源

一粒金砂(初级)

16
 

关注

                                  
此帖出自stm32/stm8论坛
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

17
 

正在调试 mark 一下

   尽量用st原带的库 如果有bug 修改一下能用也行
最后再自己写
   翻遍了所有I2c的贴  貌似没找到 解决问题的根本原因
  版主也一直在硬件上搞文章, 既然硬件是万利的demo板如果调试通过的话
硬件就不是主要问题
  期待高手能解决根本问题
此帖出自stm32/stm8论坛
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

18
 

我读和写都没有问题啊

                                  
此帖出自stm32/stm8论坛
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

19
 

我是放弃了

                                 现在我的I2C全部是软件模拟来做,ST的库的确是让人又爱又恨啊...
此帖出自stm32/stm8论坛
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

20
 

认为是 主/从 模式切换的问题。

具体地说 就是 有时该发 ACK 信号, 有时不该发ACK信号,或者 发NOACK。

读和写时的 寄存器操作要注意是否改变了ACK与NOACK控制位的操作。
此帖出自stm32/stm8论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
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
快速回复 返回顶部 返回列表