打印

STM32F103的I2C问题

[复制链接]
440|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
一亚麻怡|  楼主 | 2020-4-26 09:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
uint8_t I2C_ByteWrite(uint8_t WriteDatas,uint8_t WriteAddr){
  I2C_GenerateSTART(EEPROM_I2Cx, ENABLE);

  I2CTimeout = I2CT_FLAG_TIMEOUT;  
  /* Test on EV5 and clear it */
  while(!I2C_CheckEvent(EEPROM_I2Cx, I2C_EVENT_MASTER_MODE_SELECT))  
  {
    if((I2CTimeout--) == 0) return I2C_TIMEOUT_UserCallback(0);
  }

  I2CTimeout = I2CT_FLAG_TIMEOUT;
  /* Send EEPROM address for write */
  I2C_Send7bitAddress(EEPROM_I2Cx, EEPROM_ADDRESS, I2C_Direction_Transmitter);

  /* Test on EV6 and clear it */
  while(!I2C_CheckEvent(EEPROM_I2Cx, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED))
  {
    if((I2CTimeout--) == 0) return I2C_TIMEOUT_UserCallback(1);
  }  
  /* Send the EEPROM's internal address to write to */
  I2C_SendData(EEPROM_I2Cx, WriteAddr);

  I2CTimeout = I2CT_FLAG_TIMEOUT;
  /* Test on EV8 and clear it */
  while(!I2C_CheckEvent(EEPROM_I2Cx, I2C_EVENT_MASTER_BYTE_TRANSMITTED))
  {
    if((I2CTimeout--) == 0) return I2C_TIMEOUT_UserCallback(2);
  }

  /* Send the byte to be written */
  I2C_SendData(EEPROM_I2Cx,WriteAddr);

  I2CTimeout = I2CT_FLAG_TIMEOUT;  
  /* Test on EV8 and clear it */
  while(!I2C_CheckEvent(EEPROM_I2Cx, I2C_EVENT_MASTER_BYTE_TRANSMITTED))
  {
    if((I2CTimeout--) == 0) return I2C_TIMEOUT_UserCallback(3);
  }

  /* Send STOP condition */
  I2C_GenerateSTOP(EEPROM_I2Cx, ENABLE);

        return 1;
}

uint8_t Current_Address_Read(uint8_t ReadDatas,uint8_t ReadAddr)
{
  I2C_GenerateSTART(EEPROM_I2Cx, ENABLE);

  I2CTimeout = I2CT_FLAG_TIMEOUT;  
  /* Test on EV5 and clear it */
  while(!I2C_CheckEvent(EEPROM_I2Cx, I2C_EVENT_MASTER_MODE_SELECT))  
  {
    if((I2CTimeout--) == 0) return I2C_TIMEOUT_UserCallback(4);
  }

  I2CTimeout = I2CT_FLAG_TIMEOUT;
  /* Send EEPROM address for write */
  I2C_Send7bitAddress(EEPROM_I2Cx, EEPROM_ADDRESS, I2C_Direction_Receiver);

  /* Test on EV6 and clear it */
  while(!I2C_CheckEvent(EEPROM_I2Cx, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED))               ||程序停在这里
  {
    if((I2CTimeout--) == 0) return I2C_TIMEOUT_UserCallback(5);
  }  
        while(I2C_CheckEvent(EEPROM_I2Cx, I2C_EVENT_MASTER_BYTE_RECEIVED)==0)  
                {
                        if((I2CTimeout--) == 0) return I2C_TIMEOUT_UserCallback(6);
                }
  ReadDatas=I2C_ReceiveData(EEPROM_I2Cx);
               
        /* Disable Acknowledgement */
  I2C_AcknowledgeConfig(EEPROM_I2Cx, DISABLE);

  /* Send STOP Condition */
  I2C_GenerateSTOP(EEPROM_I2Cx, ENABLE);
                return 1;
}

int main(void)
{
        uint8_t read;
  USART_Config();
        LED_GPIO_Config();
        I2C_EE_Init();
  I2C_ByteWrite(10,EEP_Firstpage);
        Current_Address_Read(read,EEP_Firstpage);
        if(read==10)
        {
          LED_G(on);
        }else
        {
          LED_R(on);
        }
  while (1)
  {      
  }
}


   程序总是停在读EEPROM的过程传递I2C设备地址,不能继续往下执行,求解,把例程也看几遍,也想不出问题在哪。

使用特权

评论回复

相关帖子

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

本版积分规则

404

主题

404

帖子

0

粉丝