7043|7

92

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

关于i2c完全没用,很不可靠 [复制链接]

                                 我用i2c读写24c512,好不容易可以读写了,但是不能长期可靠运行.发现一个致命问题,只要外部sda线为0,STM32的I2C就不要想工作了,不管芯片复位,i2c都没法工作,只有一个办法,关掉电源,等一段时间启动.stm32的i2c只要判断SDA为0,busy就始终为1.i2c就不会工作了.
此帖出自stm32/stm8论坛

最新回复

                                 SDA为什么会为0,为0的原因你找到啦吗,STM32为什么会退出,不解,你可以禁止到STM32 IIC再打开试试   详情 回复 发表于 2008-8-19 14:08
点赞 关注
 

回复
举报

86

帖子

0

TA的资源

一粒金砂(初级)

沙发
 

不会吧,我用得还可以

我后期板子转SPI Flash了,大容量EEPROM比较贵。
但是STM32读写24芯片没有什么问题,我用的也是24C412。

另外现在24芯片很多山寨片,采购的时候注意些。
此帖出自stm32/stm8论坛
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

板凳
 

楼主见过哪一款单片机在I2C总线被外部设备拉低后还能正常

                                 你最好仔细地看看I2C的协议。
此帖出自stm32/stm8论坛
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

4
 

楼主应该是程序问题

                                 楼主太偏激了.应该是程序问题,当然也可能是STM32问题(没用过).I2C协议经过了那么多厂家和芯片的考验,不会有问题的.
此帖出自stm32/stm8论坛
 
 
 

回复

57

帖子

0

TA的资源

一粒金砂(初级)

5
 

I2C总线只要任何一条线非高,总线肯定处于忙状态。

                                 任何一个主设备都不允许(也不可能)发起START条件。
此帖出自stm32/stm8论坛
 
 
 

回复

60

帖子

0

TA的资源

一粒金砂(初级)

6
 

我用的24c512通过软件已经可以可靠运行了.

没有采用stm32的i2c,有两个可能性,所以最好不要用stm32的i2c读取24c之类的芯片.第一个就是24c系列在读取过程中,例如SDA输出0时,stm32由于多种原因中断退出,致使SDA始终为0而且24c不会释放SDA,这样stm32复位再启动BUSY一直有效,接下来stm32的i2c就不会工作了.第二个就是stm32的i2c例程和库都只是示例,不能实用.例如示例是去比较EV5,EV8之类的信号,我看了stm32的库文件就是简单的把SR1,SR2读出然后和定义的EV条件比较,只要不等就死.而SR1,SR2表示的状态很全面,例如在EV5时BTF标志有效,那就要死机.所以有以上两种问题我就干脆放弃了,软件构成读写24c很可靠,毕竟是做产品还是可靠为第一.
此帖出自stm32/stm8论坛
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

7
 

附上i2c读写24c的程序参考,基本上按照开发板上示例搬来的.

附上i2c读写24c的程序参考,基本上按照开发板上示例搬来的.

ErrorStatus I2C_24c16_Status(void)
{
  u32 I2C_TimeOut = 0x3FFFF;

  /* Clear the I2C1 AF flag */
  I2C_ClearFlag(I2C1, I2C_FLAG_AF);

  /* Enable I2C1 acknowledgement if it is already disabled by other function */
  I2C_AcknowledgeConfig(I2C1, ENABLE);

  /*----- Transmission Phase -----*/
  
  /* Send I2C1 START condition */
  I2C_GenerateSTART(I2C1, ENABLE);
  
  /* Test on I2C1 EV5 and clear it */
  while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT))  /* EV5 */
  {
  }
  //I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT);
  /* Send STLM75 slave address for write */
  I2C_Send7bitAddress(I2C1, AT24C512_Addr, I2C_Direction_Transmitter);
  
  while((!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)) && I2C_TimeOut)/* EV6 */
  {
    I2C_TimeOut--;
  }

  if(I2C_GetFlagStatus(I2C1, I2C_FLAG_AF) != 0x0)
  {
    return ERROR;
  }
  else
  {
    return SUCCESS;
  }
}



/*******************************************************************************
* Function Name  : Read24c16
* Description    : Displays the temperature in Celsius and fahrenheit degree.
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void Read24c16(u8 *RamAddress,u16 RomAddress,u8 bytes)
{
    

    
    if(I2C_24c16_Status() == SUCCESS)
  {
      I2C_SendData(I2C1, (u8)(RomAddress >> 8));
  
  /* Test on I2C1 EV8 and clear it */
  while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED)) /* EV8 */
  {
  }
  I2C_SendData(I2C1, (u8)(RomAddress &0xff));
  
  /* Test on I2C1 EV8 and clear it */
  while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED)) /* EV8 */
  {
  }
  /*----- Reception Phase -----*/
  /* Send Re-STRAT condition */
  I2C_GenerateSTART(I2C1, ENABLE);
  
  /* Test on EV5 and clear it */
  while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT))  /* EV5 */
  {
  }
  
  /* Send STLM75 slave address for read */
  I2C_Send7bitAddress(I2C1, AT24C512_Addr, I2C_Direction_Receiver);
  
  /* Test on EV6 and clear it */
  while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED))  /* EV6 */
  {
  }

  /* Test on EV7 and clear it */
  while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED))  /* EV7 */
  {
  }
  
  /* Store I2C1 received data */
  while(bytes!=1) {
    *RamAddress=I2C_ReceiveData(I2C1);
    while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED))  /* EV7 */
  {
  }
    RamAddress++;
    bytes--;
    }
  
  /* Disable I2C1 acknowledgement */
  I2C_AcknowledgeConfig(I2C1, DISABLE);
  
  /* Send I2C1 STOP Condition */
  I2C_GenerateSTOP(I2C1, ENABLE);
  
  /* Test on EV7 and clear it */
  while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED))  /* EV7 */
  {
  }
  
  /* Store I2C1 received data */
   
   *RamAddress=I2C_ReceiveData(I2C1);
  /* Return Temperature value */
  
   }
   
  }
void Write24c16(u8 *Wdata,u16 RomAddress,u8 bytes)
{
    
    if(I2C_24c16_Status() == SUCCESS)
  {
      I2C_SendData(I2C1, (u8)(RomAddress >> 8));
  
  /* Test on I2C1 EV8 and clear it */
  while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED)) /* EV8 */
  {
  }
  I2C_SendData(I2C1, (u8)(RomAddress &0xff));
  
  /* Test on I2C1 EV8 and clear it */
  while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED)) /* EV8 */
  {
  }
  for(;bytes!=0;bytes--) {
//        Write8Bit(*Wdata);
     I2C_SendData(I2C1, *Wdata++);
  
  /* Test on I2C1 EV8 and clear it */
  while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED)) /* EV8 */
  {
  }
        
        
    }
    
    
  
  /* Send I2C1 STOP Condition */
  I2C_GenerateSTOP(I2C1, ENABLE);
  Delay(10);
       }
  }
此帖出自stm32/stm8论坛
 
 
 

回复

61

帖子

0

TA的资源

一粒金砂(初级)

8
 

关于i2c完全没用,很不可靠

                                 SDA为什么会为0,为0的原因你找到啦吗,STM32为什么会退出,不解,你可以禁止到STM32 IIC再打开试试
此帖出自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
快速回复 返回顶部 返回列表