打印
[STM8]

STM8S207C6 I2C主模式busy位一上电就置1

[复制链接]
4368|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
oyljxilige|  楼主 | 2012-11-1 18:59 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
I2C主模式busy位一上电就置1,哪位仁兄遇到过,怎么解决 啊!!
初始化程序
void I2C_MasterInit(void)
{
#if 1
  PB_ODR |= 0X30;                //define SDA, SCL outputs, HiZ, Open drain, Fast
  PB_DDR |= 0X30;
  PB_CR2 |= 0X30;
CLK_PCKENR1 = 0Xaf;   //使能fMASTER时钟与对应外设的连接(仅I2C和TIM2,and TIM1)还有UART1,uart2,spi
#endif
//PC_ODR |= 0X02;               //S-CE

   I2C_FREQR  = 8;                  //输入外设时钟频率为
   I2C_CR1    = 0x00;               //禁止I2C外设
  
   I2C_CCRL   = 0x28;               //100K速度 详细分析见PDF文档
   I2C_CCRH   = 0x00;
  I2C_TRISER = 0x09;
  
   I2C_CR1   |= 0x01;                  //开启I2C外设
   I2C_CR2   |= 0x0c;                  //当前接收字节返回应答
   I2C_OARL   = MASTER_ADDRESS;        //自身地址
   I2C_OARH   = 0x40;
}
发送起始位是这样写的
BOOL I2C_Start(void)
{
//while((I2C_SR3 & I2C_SR3_BUSY) &&  timeout());              // 等待总线空闲
  while((I2C_SR3 & I2C_SR3_BUSY))            // Wait while the bus is busy
  {
    I2C_CR2 |= I2C_CR2_STOP;                           // STOP=1, generate stop
    while((I2C_CR2 & I2C_CR2_STOP));              // wait until stop is performed
  }
    I2C_CR2 |= I2C_CR2_START;                   //产生起始位
    while(!(I2C_SR1 & I2C_SR1_SB));            //等待START发送完
   
    return TURE;
}
在线调试时程序会一直死在while(I2C_CR2 & I2C_CR2_STOP);              // wait until stop is performed
   I2C_SR2 的STOP位一直是1不会自动清零,I2C_SR3 的busy位从一上电就为1
我若屏蔽掉    I2C_CR2 |= I2C_CR2_STOP;                           // STOP=1, generate stop
    while((I2C_CR2 & I2C_CR2_STOP));              // wait until stop is performed
这两句话,程序就会一直停在while((I2C_SR3 & I2C_SR3_BUSY))  等待busy位空闲
用示波器观察SDA和SCL引脚(外接3.3V2.2K的上拉电阻)不管我给它发start还是stop信号,两个引脚一直是高电平
我看别人的列子遇到这种情况时在发stop信号之前要把ACK关掉,因此我在初始化时吧I2C_CR2   |= 0x08; 或I2C_CR2   |= 0x04;
甚至I2C_CR2   |= 0x00;程序都会死在原来的地方
原来I2C连接了两个外设,我现在都去掉了,还是一样的
今天一下午就被这个问题搞过去了,路过的各位仁兄,大哥,大牛,给点思路啊


}
沙发
oyljxilige|  楼主 | 2012-11-2 16:01 | 只看该作者
为了这个事情又忙了一上午,为了防止硬件干扰I2C引脚,我吧这两个引脚翘了起来,问题依旧,要是芯片受到外部干扰有问题的话,我用这款芯片实现UART,ADC等功能都没问题,唯独就卡在I2C这,而且我吧上面同样的程序拷贝到stm8s103上,主模式是能发出起始信号和地址的,不会出现一上电busy置一这种情况,说实话我不得不怀疑ST207这款IC的I2C硬件是否经得起考验,虽然我知道百分之九十九是我想多了,望ST的技术支持能帮帮忙

使用特权

评论回复
板凳
求知青年| | 2014-5-24 09:14 | 只看该作者
大哥,我和你一样的问题啊,困扰我一个周了,你最后咋解决的?????

使用特权

评论回复
地板
wwfeng| | 2014-8-6 21:48 | 只看该作者
我这段时间也在调,不过是从模式, 你这样改下试试
//PB_ODR &= ~0X30;                //define SDA, SCL outputs, HiZ, Open drain, Fast
  PB_DDR &= ~0X30;
  PB_CR2 &= ~0X30;

使用特权

评论回复
5
maosuyun2009| | 2015-7-7 17:26 | 只看该作者
使用stm8s的库,同样遇到的这个问题。。。。各种上电重启,i2c还是busy,上电后,sda始终为低电平、scl为高电平;把sda和scl短接,sda就变成了高电平,能正常工作,但是程序运行完后,重启上电,还是会busy。

使用特权

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

本版积分规则

0

主题

19

帖子

1

粉丝