打印

在问I2C读24C02

[复制链接]
3784|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ESTM32|  楼主 | 2008-7-13 12:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
I2c, TE, ev, MIT, ck
在万利板子上
用I2C例程5(经万利修改),单步不可以运行,到 
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
这一步就等待,
连续运行时,有时候好,有时候坏,坏的时候也是到这个地方等待
 翻遍了以前所以的帖子,n天前也碰到过,没解决。现在从新碰到这个问题
以前帖子里也有人碰到类似的问题,但是都没有好的解决方法

沙发
ESTM32|  楼主 | 2008-7-13 13:05 | 只看该作者

补充

修改 系统时钟,72M改为64M,连续运行时就正常了,但单步运行还是不行。
低速APB为RCC_HCLK_Div2;

使用特权

评论回复
板凳
ESTM32|  楼主 | 2008-7-13 15:55 | 只看该作者

?没人回答

没有人遇到过吗

使用特权

评论回复
地板
id001| | 2008-7-13 19:39 | 只看该作者

我运到的情况和你不一样

我的是读操作调用后,在发:
I2C_GenerateSTART(I2C1, ENABLE);

while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));
就出不来了

使用特权

评论回复
5
hotpower| | 2008-7-13 19:43 | 只看该作者

可惜没时间陪大家玩STM32的I2C~~~说实话俺是TWI"砖家"

使用特权

评论回复
6
id001| | 2008-7-13 20:05 | 只看该作者

HotPower大叔

我的情况是:(程序用得查询方式,不是你推荐的状态机中断)

写----读----:运行正常

写----读---写/读:死机。

我自己觉得是没有能正确的结束I2C时序。

在我另外一个帖子中有说明,你看看。

谢谢

相关链接:https://bbs.21ic.com/club/bbs/bbsView.asp?boardid=49

使用特权

评论回复
7
ESTM32|  楼主 | 2008-7-13 20:17 | 只看该作者

回id001

你说的情况我遇到过,那是n天,我也发过贴问过,不过没说详细,没人回答,当时刚开始,不熟悉编程环境及固件库,我就放下那个问题,调试了其他外设,现在回过头来弄i2c,怎么都不正常,而且程序很神经病。每次出现的错误都不太一样。用示波器看,发现SDA,SCL都是低电平。

使用特权

评论回复
8
id001| | 2008-7-13 20:25 | 只看该作者

ESTM32:


我自己觉得是没有能正确的结束I2C时序。

第一次读的数据结果正确,可能是在读取最后一个字节时候,STM32没有能发送正确的NAK信号,使24C02那边没有释放SDA、SCL。

我调整
        I2C_AcknowledgeConfig(I2C1, DISABLE);
的位置,搞来搞去,结果一样。


你觉得呢?

使用特权

评论回复
9
ESTM32|  楼主 | 2008-7-13 20:33 | 只看该作者

郁闷中******

我用的是例程里的程序,没有做任何修改,也看来手册里的时序,和程序的顺序也能对得上,就是不能单步运行,而且系统时钟需要降低才行。
我感觉也是24C02没有释放总线,用示波器看都是低电平。但是问题怎么解决呢!例程都通不过,不要说自己编程了,郁闷中***********

使用特权

评论回复
10
id001| | 2008-7-13 20:37 | 只看该作者

我两个不要再这瞎折腾了~~


把楼盖高了,太多了大侠都难的看~~~~~~~~

(*^__^*) 嘻嘻……

使用特权

评论回复
11
ESTM32|  楼主 | 2008-7-13 20:44 | 只看该作者

自己思考

从此就此问题不再发问!

使用特权

评论回复
12
hotpower| | 2008-7-13 22:18 | 只看该作者

肯定是I2C时序不对~~~

使用特权

评论回复
13
running_li| | 2008-7-13 22:52 | 只看该作者

我的i2c也遇到问题

我的i2c也很长时间没调出来。我的读没什么问题,但写遇到的问题很奇怪。只能写一段时间,之后就不能写了。我用示波器抓过波形,结合程序看了,发现问题是出在 程序产生一个开始,但实际上在pin脚上没能生成一个开始。我查看了此时的寄存器,显示的是busy位为1,其它都为0。不知有没有人遇到过这种情况。

另外,例程中的发stop条件的位置好象不对,跟datasheet上说的有出入。

使用特权

评论回复
14
McuPlayer| | 2008-7-14 23:15 | 只看该作者

我的I2C调试也经过几番周折,说几点教训

1、地址千万别错
2、写入要Delay
3、低速调通了再提高速度
4、实在还不通,PM给我索要sample

使用特权

评论回复
15
winloop| | 2008-7-15 10:36 | 只看该作者

楼上给个sample吧

基于万利EK-STM32F的,读写24C02,用的库文件版本是2.0.1的么?还是老库?

使用特权

评论回复
16
linjing| | 2008-8-16 21:10 | 只看该作者

做个记号

没法子,我已经改成GPIO模拟I2C了,也是死在这一句
while(!I2C_CheckEvent(I2C1, I2C_EVENT_*_*_* ))

使用特权

评论回复
17
winloop| | 2008-8-18 10:10 | 只看该作者

放心用吧

#include "stm32f10x_lib.h"

void I2C_AcknowledgePolling(u8 sla);
void I2C_SequentialRead_AT24C01_02(u8 sla,u8 suba,u8 *pHead,u8 len);
void I2C_PageWrite_AT24C01_02(u8 sla,u8 suba,u8 *pHead,u8 len);

void I2C_AcknowledgePolling(u8 sla){
    I2C_ClearFlag(I2C1,I2C_FLAG_ADDR);
    do{
        I2C1->CR1 |= CR1_START_Set;
        I2C1->DR   = sla;
    }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(sla);
    
    I2C1->CR1 |= CR1_START_Set;
    while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT));  
   
    I2C1->DR = sla;
    while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));

    I2C1->DR = suba;
    while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED));
               
    I2C1->CR1 |= CR1_START_Set;
    while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT));  

    I2C1->DR = sla+1;
    while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));    
    I2C1->CR1 |= CR1_ACK_Set;

    if(len>1){
        for(i=0;i<len-1;i++){
            while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_RECEIVED));
            *pHead ++= I2C1->DR;
            
            I2C1->CR1 |= CR1_ACK_Set;
        }
    }
    while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_RECEIVED));
    *pHead = I2C1->DR;
    I2C1->CR1 &= CR1_ACK_Reset;
    
    I2C1->CR1 |= CR1_STOP_Set;
}
void I2C_PageWrite_AT24C01_02(u8 sla,u8 suba,u8 *pHead,u8 len){
    u8 wLen,addr;
    
    wLen=len;
    addr=suba;
    ScrollPage:I2C_AcknowledgePolling(sla);
    
               I2C1->CR1 |= CR1_START_Set;
               while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT));  
  
               I2C1->DR = sla;
               while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));

               I2C1->DR = addr;
               while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED));
                              
               I2C1->DR = *pHead++;
               while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED));
               
               addr++;
               wLen--;
        
    while(wLen){
        if((addr%8)!=0){
            I2C1->DR = *pHead++;
            while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED));
            
            addr++;
            wLen--;
        }
        else{
            I2C1->CR1 |= CR1_STOP_Set;
            goto ScrollPage;
        }
    }
    I2C1->CR1 |= CR1_STOP_Set;
}

使用特权

评论回复
18
dfftt133| | 2008-8-19 14:00 | 只看该作者

在问I2C读24C02

降低IIC的速度,在每一步执行完后加足够的延时程序,先调通,我只是在调试的时候加啦足够的延时,是在读写24完后,连续读写是可以的,单步没试。一定可以的,试试看

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

14

主题

69

帖子

0

粉丝