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

STM32F072RB I2C遇到TXIS无法置位的问题

[复制链接]
huochaosuma 提问时间:2017-7-29 17:52 /

hi:
   大家好,遇到一个I2C的问题,请大家帮分析一下,不胜感激!
   系统使用I2C接2片 MPC23017实现GPIO的扩展,使用STM32F072RB 的I2C 2,引脚GPIO都配置了AF ,且I2C初始化也是参考了ST的例子。
   发送数据时i2c_expand_gpio_writeBuffer函数里,while(I2C_GetFlagStatus(GPIO_EXT_I2C, I2C_ISR_TXIS) == RESET) 直到超时一直得不到TXIS置位,请大家帮分析下。




uint8_t i2c_expand_gpio_writeBuffer(uint8_t i2c_chip_addr,uint8_t* pBuffer, uint16_t WriteAddr, uint16_t* NumByteToWrite)
{   
  uint32_t DataNum = 0;
  uint32_t i2cTimeout = 0;

  /* Configure slave address, nbytes, reload and generate start */
  I2C_TransferHandling(GPIO_EXT_I2C, i2c_chip_addr, 1, I2C_Reload_Mode, I2C_Generate_Start_Write);

  /* Wait until TXIS flag is set */
  i2cTimeout = GPIO_EXT_I2C_LONG_TIMEOUT;  
  while(I2C_GetFlagStatus(GPIO_EXT_I2C, I2C_ISR_TXIS) == RESET)
  {
    if((i2cTimeout--) == 0) return I2C_ERROR_TIMEOUT;
  }

  /* Send  address */
  I2C_SendData(GPIO_EXT_I2C, (uint8_t)WriteAddr);

  /* Wait until TCR flag is set */
  i2cTimeout = GPIO_EXT_I2C_LONG_TIMEOUT;
  while(I2C_GetFlagStatus(GPIO_EXT_I2C, I2C_ISR_TCR) == RESET)
  {
    if((i2cTimeout--) == 0) return I2C_ERROR_TIMEOUT;
  }

  /* Update CR2 : set Slave Address , set write request, generate Start and set end mode */
  I2C_TransferHandling(GPIO_EXT_I2C, i2c_chip_addr, (uint8_t)(*NumByteToWrite), I2C_AutoEnd_Mode, I2C_No_StartStop);

  while (DataNum != (*NumByteToWrite))
  {      
    /* Wait until TXIS flag is set */
    i2cTimeout = GPIO_EXT_I2C_LONG_TIMEOUT;
    while(I2C_GetFlagStatus(GPIO_EXT_I2C, I2C_ISR_TXIS) == RESET)
    {
      if((i2cTimeout--) == 0) return I2C_ERROR_TIMEOUT;
    }  

    /* Write data to TXDR */
    I2C_SendData(GPIO_EXT_I2C, (uint8_t)(pBuffer[DataNum]));

    /* Update number of transmitted data */
    DataNum++;   
  }  

  /* Wait until STOPF flag is set */
  i2cTimeout = GPIO_EXT_I2C_LONG_TIMEOUT;
  while(I2C_GetFlagStatus(GPIO_EXT_I2C, I2C_ISR_STOPF) == RESET)
  {
    if((i2cTimeout--) == 0) return I2C_ERROR_TIMEOUT;
  }   

  /* Clear STOPF flag */
  I2C_ClearFlag(GPIO_EXT_I2C, I2C_ICR_STOPCF);

  i2c_expand_gpio_waitStandbyState(i2c_chip_addr);

  /* If all operations OK, return sEE_OK (0) */
  return OK;
}


收藏 1 评论5 发布时间:2017-7-29 17:52

举报

5个回答
huochaosuma 回答时间:2017-7-29 17:55:54
void i2c_expand_gpio_Init(void)
{
  I2C_InitTypeDef  I2C_InitStructure;
  GPIO_InitTypeDef  GPIO_InitStructure;
  
  /* Configure the I2C clock source. The clock is derived from the HSI */
  RCC_I2CCLKConfig(RCC_I2C1CLK_HSI);
   
  /* GPIO_EXT_I2C_SCL_GPIO_CLK and GPIO_EXT_I2C_SDA_GPIO_CLK Periph clock enable */
  RCC_AHBPeriphClockCmd(GPIO_EXT_I2C_SCL_GPIO_CLK | GPIO_EXT_I2C_SDA_GPIO_CLK, ENABLE);
  
  /* GPIO_EXT_I2C Periph clock enable */
  RCC_APB1PeriphClockCmd(GPIO_EXT_I2C_CLK, ENABLE);
  
  /* Connect PXx to I2C_SCL*/
  GPIO_PinAFConfig(GPIO_EXT_I2C_SCL_GPIO_PORT, GPIO_EXT_I2C_SCL_SOURCE, GPIO_EXT_I2C_SCL_AF);
  
  /* Connect PXx to I2C_SDA*/
  GPIO_PinAFConfig(GPIO_EXT_I2C_SDA_GPIO_PORT, GPIO_EXT_I2C_SDA_SOURCE, GPIO_EXT_I2C_SDA_AF);
  
  /* GPIO configuration */  
  /* Configure GPIO_EXT_I2C pins: SCL */
  GPIO_InitStructure.GPIO_Pin = GPIO_EXT_I2C_SCL_PIN;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  GPIO_Init(GPIO_EXT_I2C_SCL_GPIO_PORT, &GPIO_InitStructure);
  
  /* Configure GPIO_EXT_I2C pins: SDA */
  GPIO_InitStructure.GPIO_Pin = GPIO_EXT_I2C_SDA_PIN;
  GPIO_Init(GPIO_EXT_I2C_SDA_GPIO_PORT, &GPIO_InitStructure);
  
  /* I2C configuration */
  /* GPIO_EXT_I2C configuration */
  I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
  I2C_InitStructure.I2C_AnalogFilter = I2C_AnalogFilter_Enable;
  I2C_InitStructure.I2C_DigitalFilter = 0x00;
  I2C_InitStructure.I2C_OwnAddress1 = 0x00;
  I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
  I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
  I2C_InitStructure.I2C_Timing = GPIO_EXT_I2C_TIMING;
  
  /* Apply GPIO_EXT_I2C configuration after enabling it */
  I2C_Init(GPIO_EXT_I2C, &I2C_InitStructure);
   
  /* GPIO_EXT_I2C Peripheral Enable */
  I2C_Cmd(GPIO_EXT_I2C, ENABLE);

  /*Init I2C Slave MPC23017, all port is output*/
  mpc23017Init();
  
}


这是我的I2C初始化,端口 和 I2C 2的选择宏定义,已经检查好多遍了,不会有什么问题。
huochaosuma 回答时间:2017-7-29 17:57:03
GPIO_EXT_I2C_TIMING   我使用了ST的工具excel 和 Cube 按照APB1的外设时钟值生成过,但是没什么效果。
斜阳__ 回答时间:2017-10-11 10:07:11
帮顶         
anguswang 回答时间:2017-10-11 10:40:05
你 I2C 使用的是 HSI 时钟,你却用 APB1 时钟来生成 TIMING ?
另外你时钟配置的是多少? 超过 400K 需要打开 SYSCFG 的 FastMode 控制位。

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

无薪税绵 回答时间:2017-10-11 10:44:38
楼主可以检查一下,硬件是否有问题。
找个其它正常的IIC器,试试,
看看是硬件还是软件的问题。

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

所属标签

相似问题

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版