11850|13

72

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

STM8硬件I2C没反应 [复制链接]

在做完模拟的I2C后,现在改用硬件的I2C,一点反应都没有,在仿真的情况下用示波器检测,就连Start信号也看不到,仿真软件中看到寄存器的值又是正确的,同志们帮忙分析下原因,下面是代码,用的是ST的DEMO和库函数

#define I2C_Speed              35000

void I2cInit(void)
{
/* Optional: put here as example only */
I2C_DeInit();
/* I2C Peripheral Enable */
I2C_Cmd(ENABLE);
/* Apply I2C configuration after enabling it */
I2C_Init(I2C_Speed, 0x88, I2C_DUTYCYCLE_2, I2C_ACK_CURR, I2C_ADDMODE_7BIT, 8);
}

void I2C_EE_BufferRead(u8* pBuffer, u16 ReadAddr, u8 NumByteToRead)
{  
    /* While the bus is busy */
  while(I2C_GetFlagStatus(I2C_FLAG_BUSBUSY));
  
  /* Generate start & wait event detection */
    I2C_GenerateSTART(ENABLE);
  /* Test on EV5 and clear it */
  while (!I2C_CheckEvent(I2C_EVENT_MASTER_START_SENT));
  
  /* Send slave Address in write direction & wait detection event */
    I2C_Send7bitAddress(CP_Add, I2C_DIRECTION_TX);
   /* Test on EV6 and clear it */
    while (!I2C_CheckEvent(I2C_EVENT_MASTER_ADDRESS_ACKED));
    I2C_ClearFlag(I2C_FLAG_ADDRESSSENTMATCHED);
   
   /* Send Address of first byte to be read & wait event detection */
    //I2C_SendData((u8)(ReadAddr >> 8)); /* MSB */
    /* Test on EV8 and clear it */
    //while (!I2C_CheckEvent(I2C_EVENT_MASTER_BYTE_TRANSMITTED));
    I2C_SendData((u8)(ReadAddr)); /* LSB */
  /* Test on EV8 and clear it */
    while (!I2C_CheckEvent(I2C_EVENT_MASTER_BYTE_TRANSMITTED));
  
  /* Send STRAT condition a second time */  
  I2C_GenerateSTART(ENABLE);
    /* Test on EV5 and clear it */
   while (!I2C_CheckEvent(I2C_EVENT_MASTER_START_SENT));
  
  /* Send slave Address in read direction & wait event */
    I2C_Send7bitAddress(CP_Add, I2C_DIRECTION_RX);
   /* Test on EV6 and clear it */
    while (!I2C_CheckEvent(I2C_EVENT_MASTER_ADDRESS_ACKED));
    I2C_ClearFlag(I2C_FLAG_ADDRESSSENTMATCHED);
  
  /* While there is data to be read */
  while(NumByteToRead)  
  {
    if(NumByteToRead == 1)
    {
      /* Disable Acknowledgement */
      I2C_AcknowledgeConfig(I2C_ACK_NONE);
      
      /* Send STOP Condition */
      I2C_GenerateSTOP(ENABLE);
    }
    /* Test on EV7 and clear it */
    if(I2C_CheckEvent(I2C_EVENT_MASTER_BYTE_RECEIVED))  
    {      
      /* Read a byte from the EEPROM */
      *pBuffer = I2C_ReceiveData();
      /* Point to the next location where the byte read will be saved */
      pBuffer++;
      
      /* Decrement the read bytes counter */
      NumByteToRead--;        
    }   
  }
  /* Enable Acknowledgement to be ready for another reception */
  I2C_AcknowledgeConfig(I2C_ACK_CURR);
}

设置I2C频率是35K,非标准的,输入给I2C的频率设为8M,我用的时钟是内部8M的时钟,用I2C这两个口做模拟I2C是可以用的,实在想不明白了
此帖出自stm32/stm8论坛

最新回复

                                 我也用iic,我也用库,做从iic还可以,做主iic就从来没有看见波形出来过,最后还得用模拟,实在想不明白!!  详情 回复 发表于 2010-11-22 17:16
点赞 关注(1)
 

回复
举报

78

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
                                 应该是硬件的问题,ST的I2C好像不能用。
此帖出自stm32/stm8论坛
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
                                 我问ST公司的工程师,他说这个例子在他们的DEMO板上读写EEPROM是可以的,我就纳闷勒,太奇怪了
此帖出自stm32/stm8论坛
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

4
 
                                 ST的I2C不能用??
此帖出自stm32/stm8论坛
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

5
 
                                 应该不会吧,只是比较不好调
此帖出自stm32/stm8论坛
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

6
 
                                 有人做过吗?给点意见啊,我都弄好几天了,郁闷得很啦
此帖出自stm32/stm8论坛
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

7
 
                                 我没用过ST的Demo,但是我用使用内部I2C没有问题,最好你自己看规格书看看相关的寄存器是不是按照程序配置成功。
此帖出自stm32/stm8论坛
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

8
 
                                 7楼的兄弟,是否可以参考下你的初始化程序呀?
此帖出自stm32/stm8论坛
 
 
 

回复

49

帖子

0

TA的资源

一粒金砂(初级)

9
 
                                 是不是你使用了第二复用功能的I2C接口但忘了改选项字节?
此帖出自stm32/stm8论坛
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

10
 
                                 什么选项字节,没看到啊?
此帖出自stm32/stm8论坛
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

11
 

我今天终于找出问题了,ST的库没有问题,例程的一个函数有问题

void I2C_EE_ByteWrite(u8 WriteData, u16 WriteAddr)
在写完器件地址后就会死机,在

  while(!I2C_CheckEvent(I2C_EVENT_MASTER_ADDRESS_ACKED));
后面加上这个就好了
  I2C_ClearFlag(I2C_FLAG_ADDRESSSENTMATCHED);
此帖出自stm32/stm8论坛
 
 
 

回复

19

帖子

0

TA的资源

一粒金砂(初级)

12
 
                                 原来是例程的函数有问题
此帖出自stm32/stm8论坛
 
 
 

回复

56

帖子

0

TA的资源

一粒金砂(初级)

13
 
学习学习
咱正要弄这个
此帖出自stm32/stm8论坛
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

14
 
                                 我也用iic,我也用库,做从iic还可以,做主iic就从来没有看见波形出来过,最后还得用模拟,实在想不明白!!
此帖出自stm32/stm8论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条
【干货上新】电源解决方案和技术第二趴 | DigiKey 应用探索站
当月好物、电源技术资源、特色活动、DigiKey在线实用工具,干货多多~

查看 »

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网 7

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表