你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM8S硬件I2C读数据有问题

[复制链接]
aleelove 提问时间:2014-9-12 12:53 /
 读写EEPROM,写正常,读的时候,第一个数也是正常,但是后面都不对,不知道问题出在哪里,求指教,谢谢

I2C(reg).zip

下载

440.68 KB, 下载次数: 28, 下载积分: ST金币 -1

收藏 1 评论5 发布时间:2014-9-12 12:53

举报

5个回答
aleelove 回答时间:2014-9-12 12:54:42

RE:STM8S硬件I2C读数据有问题

void I2C_EE_BufferRead(u8* pBuffer, u8 ReadAddr, u8 NumByteToRead)
        {
        unsigned char temp;
  numb=NumByteToRead;
       
         /* While the bus is busy */
  //while(I2C_GetFlagStatus(I2C_FLAG_BUSBUSY));
  while(I2C_SR3 & 0x02); //总线空闲
  /* Generate start & wait event detection */
  //  I2C_GenerateSTART(ENABLE);
        I2C_CR2 |= 0x01; //产生起始位
  /* Test on EV5 and clear it */
  //while(!I2C_CheckEvent(I2C_EVENT_MASTER_MODE_SELECT));  
  while(!(I2C_SR1 & 0x01)); //起始位发送完成
  /* Send slave Address in write direction & wait detection event */
  //  I2C_Send7bitAddress(EEPROM_ADDRESS, I2C_DIRECTION_TX);
        I2C_DR = EEPROM_ADDRESS;
                place=1;
                //while(!I2C_GetFlagStatus(I2C_FLAG_ADDRESSSENTMATCHED));
    //I2C_ClearFlag(I2C_FLAG_ADDRESSSENTMATCHED);
                while(!(I2C_SR1&0x02));
                temp = I2C_SR1;
                temp = I2C_SR3;
                place=2;
   /* Test on EV6 and clear it */
    //while(!I2C_CheckEvent(I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
    //I2C_ClearFlag(I2C_FLAG_ADDRESSSENTMATCHED);
   
   /* Send Address of first byte to be read & wait event detection */
   // I2C_SendData((u8)(ReadAddr >> 8)); /* MSB */
         I2C_DR = ((u8)(ReadAddr >> 8));
    /* Test on EV8 and clear it */
   // while (!I2C_CheckEvent(I2C_EVENT_MASTER_BYTE_TRANSMITTED));
        while(!(I2C_SR1 & 0x84));
  //  I2C_SendData((u8)(ReadAddr)); /* LSB */
        I2C_DR = ((u8)(ReadAddr));
  /* Test on EV8 and clear it */
  //  while (!I2C_CheckEvent(I2C_EVENT_MASTER_BYTE_TRANSMITTED));
  while(!(I2C_SR1 & 0x84));
  /* Send STRAT condition a second time */  
// I2C_GenerateSTART(ENABLE);
I2C_CR2 |= 0x01; //产生起始位
    /* Test on EV5 and clear it */
  // while(!I2C_CheckEvent(I2C_EVENT_MASTER_MODE_SELECT));  
  while(!(I2C_SR1 & 0x01)); //起始位发送完成
  /* Send slave Address in read direction & wait event */
   // I2C_Send7bitAddress(EEPROM_ADDRESS, I2C_DIRECTION_RX);
                I2C_DR = EEPROM_READ_ADDRESS;
                //while(!I2C_GetFlagStatus(I2C_FLAG_ADDRESSSENTMATCHED));
    //I2C_ClearFlag(I2C_FLAG_ADDRESSSENTMATCHED);  
                while(!(I2C_SR1&0x02));
                temp = I2C_SR1;
                temp = I2C_SR3;
   /* Test on EV6 and clear it */
   // while(!I2C_CheckEvent(I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
    //I2C_ClearFlag(I2C_FLAG_ADDRESSSENTMATCHED);
  
  /* While there is data to be read */
  while(NumByteToRead)  
  {
     numb=NumByteToRead;
                if(NumByteToRead == 1)
    {
       numb=NumByteToRead;
                          NumByteToRead--;   
                        /* Disable Acknowledgement */
      //I2C_AcknowledgeConfig(I2C_ACK_NONE);
      I2C_CR2 &=~0x04;
      /* Send STOP Condition */
      //I2C_GenerateSTOP(ENABLE);
                        I2C_CR2 |=0x02;
                        I2C_CR2 &=0xf7;
                        while(!(I2C_SR1&0x40));
                        *pBuffer = I2C_DR;  
                        I2C_CR2 |=0x04;
    }
    //* Test on EV7 and clear it */
    //if(I2C_CheckEvent(I2C_EVENT_MASTER_BYTE_RECEIVED))  
                if(NumByteToRead > 1)  
    {      
      //I2C_CR2 |=0x04;
                        I2C_CR2 &=0xfd;
                        I2C_CR2 |=0x08;  
                        /* Read a byte from the EEPROM */
      //*pBuffer = I2C_ReceiveData();
                        while(!(I2C_SR1&0x40));
                        temp = I2C_SR1;
                        *pBuffer = I2C_DR;
      
      I2C_CR2 |=0x04;
                /* Point to the next location where the byte read will be saved */
                  pBuffer++;
      
      /* Decrement the read bytes counter */
      NumByteToRead--;   
                         
    }
废鱼 回答时间:2014-9-12 14:04:30

RE:STM8S硬件I2C读数据有问题

读取完回复ACK了吗?
aleelove 回答时间:2014-9-12 16:33:15

回复:STM8S硬件I2C读数据有问题

ack使能后应该自动产生的吧?不是像模拟I2C那样要手动放置的吧。我发现读取完寄存器的数据之后,并没有清除标志位(*pBuffer = I2C_DR;),手册上写的是读取寄存器就清除这个标志的(EV7:RxNE=1,读DR寄存器清除该标志。)。现在就是第一个数据是对的,后面都是FF
aleelove 回答时间:2014-9-12 17:04:09

RE:STM8S硬件I2C读数据有问题

问题找到了,是应答信号的问题,谢谢安,要这样写I2C_CR2 |=0x04;
I2C_CR2 &=0xfd;I2C_CR2 &= ~0x08;,结帖
w453509596 回答时间:2014-12-7 21:28:24
这个IIC还要注意硬件问题,它是硬件上的开漏引脚,我就被伤过
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版