stm8 硬件iic 从机无法接受数据

2019-07-19 21:05发布

stm8 硬件iic 从机无法接受数据,接受到地址,并且已应答,
void  IIC_GPIO_INIT()
{
/*  配置IIC的IO口  为上拉输入*/
  //CLK->PCKENR1 |=0X01;
  GPIOB->DDR &= ~0x30;
  GPIOB->CR1 |= 0x30;
  GPIOB->CR2 &= ~0x30;
  
}
void IIC_INIT(void)
{
  
  I2C->CR1 = 0x00;
  I2C->CR2 =0x04; //使能应答            
  I2C->FREQR = 0x10; // Set I2C Freq value (16MHz)
  
  I2C->OARH |= 0x40;
  I2C->OARL = (SLAVE_ADDRESS );
  I2C->CR1 = 0x01;
  I2C->CR2   = 0X04;
  I2C->CR2  |= 0x02;
  
  I2C->ITR |= 0x07; //开启中断

  


}

/**
  * @brief I2C Interrupt routine.
  * @param  None
  * @retval None
  */
INTERRUPT_HANDLER(I2C_IRQHandler, 19)
{
  uint8_t temp1=0;
  uint8_t temp2=0;
  temp1=I2C->SR1;
  temp2=I2C->SR3;
  uint8_t data;
    if((I2C->SR1 & 0X02)==0x02) // 判读地址是否匹配
    {
     
      I2C->CR2 |= 0X04;
      I2C->SR1&=~(0x04);
    }
    if((I2C->SR1&0x10)==0x10)    //检测到停止位
    {
      temp1 = I2C->SR1;
      I2C->CR2|=0x04;  
     
    }
    if((I2C->SR1&0x40) == 0x40)    //接收数据
    {
       data= I2C->DR;
      if(IIC_RX_Finish==0)
      {
        IIC_RecBuffer[IIC_RX_NUM]=data;
        IIC_RX_NUM++;
        if(IIC_RX_NUM>=1){IIC_RX_Finish=1;IIC_RX_NUM=0; I2C->ITR = 0x00;}
        I2C->CR2 |= 0X04;//应答
      }
   }
}

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
11条回答
正点原子
1楼-- · 2019-07-20 02:39
 精彩回答 2  元偷偷看……
losin
2楼-- · 2019-07-20 07:17
没注意,选错了。马上改
who_who
3楼-- · 2019-07-20 08:14
你好,还在研究st8做IIC从机吗?最近我也在研究,求指教啊。
losin
4楼-- · 2019-07-20 10:18
 精彩回答 2  元偷偷看……
who_who
5楼-- · 2019-07-20 15:26
losin 发表于 2016-1-19 21:15
什么问题

有测试好的例子程序么,stm8从机的例子。
能否发我邮箱一份 zhuimengcanyang@163.com
最近在搞这个,头大了。
onebank
6楼-- · 2019-07-20 17:30
who_who 发表于 2016-1-26 14:20
有测试好的例子程序么,stm8从机的例子。
能否发我邮箱一份
最近在搞这个,头大了。

百度文库所搜“软件模拟IIC主从机”

一周热门 更多>