打印

stm32f103ze 的I2C不行

[复制链接]
4186|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
dragonbch|  楼主 | 2009-12-29 12:59 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
程序代码如下:
初始化后寄存器如下:起始地址是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芯片,应该都没有问题,所有请教高手指点。
沙发
香水城| | 2009-12-29 13:38 | 只看该作者
可以不用库,如果要自己写,有问题可以参考库中的处理,也可以参考这个帖子的实现:STM32 I2C 封装库(查询方式+29楼中断方式+32楼DMA方式)


不愿意使用前人的成果,一定要自己从头做,这是一种学习的方法,但前人积累下来的经验还是需要借鉴的嘛,:D

使用特权

评论回复
板凳
xzq1019| | 2009-12-30 22:04 | 只看该作者
附件是从ST网站上下载的堪误表,里已经明确说明IIC有问题,请大家不要再用硬件IIC了。

14732.pdf

231.94 KB

使用特权

评论回复
地板
香水城| | 2009-12-30 22:31 | 只看该作者
附件是从ST网站上下载的堪误表,里已经明确说明IIC有问题,请大家不要再用硬件IIC了。
xzq1019 发表于 2009-12-30 22:04


你看清楚是什么问题了吗?手册中不是有解决办法吗?

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

误读可以,但误导就说不过去了。

使用特权

评论回复
5
wu0232| | 2009-12-31 11:41 | 只看该作者
以前曾经用过I2C的库
当时也是调不过去,但是后来加了延时就解决了

库还是能用

使用特权

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

使用特权

评论回复
7
supereally| | 2013-9-6 21:58 | 只看该作者
xzq1019 发表于 2010-1-1 20:22
用起来偶而出问题,太可怕了,我的产品是用来航空上的,不敢用硬件的
手册中是有解决办法,但不好使
想想吧 ...

STM32F4上 I2C还没决解 依然卡在EV5

使用特权

评论回复
8
xzq1019| | 2013-9-7 03:12 | 只看该作者
supereally 发表于 2013-9-6 21:58
STM32F4上 I2C还没决解 依然卡在EV5

看堪误表

使用特权

评论回复
9
hawksabre| | 2013-9-7 09:59 | 只看该作者
查看技术手册    应该是可以解决这个问题的   楼主

使用特权

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

本版积分规则

1

主题

4

帖子

1

粉丝