5015|5

64

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

stm32f103ze的I2C不行 [复制链接]

程序代码如下:
初始化后寄存器如下:起始地址是0x40005800
00000001     00000024  00004000 00000000
00000000    00000000   00000000 00000708
00000035

我不喜欢用提供的函数,比较耗时间,自己写的简洁。
初始化后,寄存器内容正常。但是第一次运行到下面的函数就会死在这里。
void I2C_WRITE(INT16U ADDR,INT16U DATA)
{
  INT16U i ;
// I2C_EE_WaitEepromStandbyState();//,网络获得的函数,开放出来,仍然会死在这里。
  
  if((I2C2->SR2 & 0x0002) !=  0x0002) //总线不忙
    {
     // I2C2->CR1 |=  0x0100 ;//自己写的函数,此步完成后监视寄存器内BUSY和START置1,
     I2C_GenerateSTART(I2C2,ENABLE); //打开I2C,开始发送过程
      
//      while((I2C2->SR1 & 0x0001) !=  0x0001) //等待SB置位,会死在这里,
//      {;
//      }
      while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_MODE_SELECT));  //设置主机模式,也是死在这里,不知为何。
//以下的部分不能运行到。
      I2C2->DR =  0x00A0 ;                //写要发送的从设备地址;
      
      while((I2C2->SR1 & 0x0002) !=  0x0002) //等待ADDR置位
      {;
      }
      i = I2C2->SR2   ;//清除ADDR位
      
      I2C2->DR = (ADDR >>  0x08);                //写要发送的地址H;
      while((I2C2->SR1 & 0x0004) !=  0x0004) //等待BTF置位
      {;
      }
      I2C2->DR = (ADDR &  0xFF);                //写要发送的地址L;
      while((I2C2->SR1 & 0x0004) !=  0x0004) //等待BTF置位
      {;
      }
      I2C2->DR = (DATA>> 0x08) ;                //写要发送的数据H;
      while((I2C2->SR1 & 0x0004) !=  0x0004) //等待BTF置位
      {;
      }
      I2C2->DR = (DATA &  0xFF);                //写要发送的数据L;
      while((I2C2->SR1 & 0x0004) !=  0x0004) //等待BTF置位
      {;
      }
      I2C2->CR1 |=  0x0200 ;                  //STOP位
      for(i=0;i<4000;i++);
    }
     
     
}
我觉得无论是那种I2C芯片,应该都没有问题,所有请教高手指点。
此帖出自stm32/stm8论坛

最新回复

                                 用起来偶而出问题,太可怕了,我的产品是用来航空上的,不敢用硬件的 手册中是有解决办法,但不好使 想想吧,用DMA方式?IIC简单一个字节的控制指令也用DMA啊,我觉得不太合适 再者用中断方式且把中断设为最高,影响我程序的实时性和稳定性,我的执行程序总是被IIC打断,最要的高实时性程序得不到及时响应,中断稍微多一点,那IIC程序的ISR都会在中断嵌套了,嵌入式系统中中断嵌套是尽量要避免的。 也可能是我用的IIC程序都不是最重要的,但一直在用,所以觉得不合适 有些人需要IIC传大量数据的,可以用DMA方式,但把IIC的中断优级先级设为最高,个人不推荐。 请版主理解,我挺喜欢STM32的,公司的STM32平台是我一手做起来的,STM32的优点我都用了,提出缺点是基于负责任的态度。 再说了ST改一个IIC还是易如反掌,相信下一版本的设计及流片肯定能解决这个问题。  详情 回复 发表于 2010-1-1 20:22
点赞 关注
 

回复
举报

81

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
可以不用库,如果要自己写,有问题可以参考库中的处理,也可以参考这个帖子的实现:STM32 I2C 封装库(查询方式+29楼中断方式+32楼DMA方式)


不愿意使用前人的成果,一定要自己从头做,这是一种学习的方法,但前人积累下来的经验还是需要借鉴的嘛,
此帖出自stm32/stm8论坛
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
附件是从ST网站上下载的堪误表,里已经明确说明IIC有问题,请大家不要再用硬件IIC了。

14732.pdf (231.94 KB)

此帖出自stm32/stm8论坛
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

4
 
附件是从ST网站上下载的堪误表,里已经明确说明IIC有问题,请大家不要再用硬件IIC了。
你看清楚是什么问题了吗?手册中不是有解决办法吗?

你让大家不要再用硬件IIC了,这不是以偏概全吗?

误读可以,但误导就说不过去了。
此帖出自stm32/stm8论坛
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

5
 
以前曾经用过I2C的库
当时也是调不过去,但是后来加了延时就解决了

库还是能用
此帖出自stm32/stm8论坛
 
 
 

回复

62

帖子

0

TA的资源

禁止发言

6
 
用起来偶而出问题,太可怕了,我的产品是用来航空上的,不敢用硬件的
手册中是有解决办法,但不好使
想想吧,用DMA方式?IIC简单一个字节的控制指令也用DMA啊,我觉得不太合适
再者用中断方式且把中断设为最高,影响我程序的实时性和稳定性,我的执行程序总是被IIC打断,最要的高实时性程序得不到及时响应,中断稍微多一点,那IIC程序的ISR都会在中断嵌套了,嵌入式系统中中断嵌套是尽量要避免的。
也可能是我用的IIC程序都不是最重要的,但一直在用,所以觉得不合适
有些人需要IIC传大量数据的,可以用DMA方式,但把IIC的中断优级先级设为最高,个人不推荐。
请版主理解,我挺喜欢STM32的,公司的STM32平台是我一手做起来的,STM32的优点我都用了,提出缺点是基于负责任的态度。
再说了ST改一个IIC还是易如反掌,相信下一版本的设计及流片肯定能解决这个问题。
此帖出自stm32/stm8论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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

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

北京市海淀区中关村大街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
快速回复 返回顶部 返回列表