历史上的今天
返回首页

历史上的今天

今天是:2025年04月08日(星期二)

正在发生

2019年04月08日 | 调试I2C遇到的一些问题

2019-04-08 来源:eefocus

void HAL_I2C_MspInit(I2C_HandleTypeDef* hi2c)

{


  GPIO_InitTypeDef GPIO_InitStruct;

  if(hi2c->Instance==I2C2)

  {

  /* USER CODE BEGIN I2C2_MspInit 0 */


  /* USER CODE END I2C2_MspInit 0 */

  

    /**I2C2 GPIO Configuration    

    PB10     ------> I2C2_SCL

    PB3     ------> I2C2_SDA 

    */

    GPIO_InitStruct.Pin = GPIO_PIN_10;

    GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;

    GPIO_InitStruct.Pull = GPIO_PULLUP;

    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;    //这个选项只能为低,为其他的模式会出现错误。

    GPIO_InitStruct.Alternate = GPIO_AF4_I2C2;

    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);


    GPIO_InitStruct.Pin = GPIO_PIN_3;

    GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;

    GPIO_InitStruct.Pull = GPIO_PULLUP;

    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;

    GPIO_InitStruct.Alternate = GPIO_AF9_I2C2;

    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);


    /* Peripheral clock enable */

    __HAL_RCC_I2C2_CLK_ENABLE();

  /* USER CODE BEGIN I2C2_MspInit 1 */


  /* USER CODE END I2C2_MspInit 1 */

  }


}


 


 


if(hi2c->Instance==I2C1)

  {

  /* USER CODE BEGIN I2C1_MspInit 0 */


  /* USER CODE END I2C1_MspInit 0 */

  

    /**I2C1 GPIO Configuration    

    PB6     ------> I2C1_SCL

    PB7     ------> I2C1_SDA 

    */

    GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7;

    GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;

    GPIO_InitStruct.Pull = GPIO_PULLUP;

    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;

    GPIO_InitStruct.Alternate = GPIO_AF4_I2C1;

    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);


    /* Peripheral clock enable */

    __HAL_RCC_I2C1_CLK_ENABLE();

    /* Peripheral interrupt init */

    HAL_NVIC_SetPriority(I2C1_EV_IRQn, 0, 0);

    HAL_NVIC_EnableIRQ(I2C1_EV_IRQn);

    HAL_NVIC_SetPriority(I2C1_ER_IRQn, 0, 0);

    HAL_NVIC_EnableIRQ(I2C1_ER_IRQn);

  /* USER CODE BEGIN I2C1_MspInit 1 */


  /* USER CODE END I2C1_MspInit 1 */

  }

  else if(hi2c->Instance==I2C2)

  {

  /* USER CODE BEGIN I2C2_MspInit 0 */


  /* USER CODE END I2C2_MspInit 0 */

  

    /**I2C2 GPIO Configuration    

    PB10     ------> I2C2_SCL

    PB3     ------> I2C2_SDA 

    */

    GPIO_InitStruct.Pin = GPIO_PIN_10;

    GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;

    GPIO_InitStruct.Pull = GPIO_PULLUP;

    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;

    GPIO_InitStruct.Alternate = GPIO_AF4_I2C2;

    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);


    GPIO_InitStruct.Pin = GPIO_PIN_3;

    GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;

    GPIO_InitStruct.Pull = GPIO_PULLUP;

    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;

    GPIO_InitStruct.Alternate = GPIO_AF9_I2C2;  //注意模式的设置不是简单的模仿GPIO_AF4_I2C2,而是现在的这个模式

    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);


    /* Peripheral clock enable */

    __HAL_RCC_I2C2_CLK_ENABLE();

  /* USER CODE BEGIN I2C2_MspInit 1 */


  /* USER CODE END I2C2_MspInit 1 */

  }

  else if(hi2c->Instance==I2C3)

  {

  /* USER CODE BEGIN I2C3_MspInit 0 */


  /* USER CODE END I2C3_MspInit 0 */

  

    /**I2C3 GPIO Configuration    

    PC9     ------> I2C3_SDA

    PA8     ------> I2C3_SCL 

    */

    GPIO_InitStruct.Pin = GPIO_PIN_9;

    GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;

    GPIO_InitStruct.Pull = GPIO_PULLUP;

    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;

    GPIO_InitStruct.Alternate = GPIO_AF4_I2C3;

    HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);


    GPIO_InitStruct.Pin = GPIO_PIN_8;

    GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;

    GPIO_InitStruct.Pull = GPIO_PULLUP;

    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;

    GPIO_InitStruct.Alternate = GPIO_AF4_I2C3;

    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);


    /* Peripheral clock enable */

    __HAL_RCC_I2C3_CLK_ENABLE();

  /* USER CODE BEGIN I2C3_MspInit 1 */


  /* USER CODE END I2C3_MspInit 1 */

  }


 


第二个问题怎么修改库,让第一个I2C的写只有start,没有stop,第二条I2C的读有start也有stop。


status = HAL_I2C_Master_Transmit_touch(&hi2c2, TOUCH_ADDR, &WriteBuff[0], 1, 30 );

    

        status = HAL_I2C_Master_Receive_touch(&hi2c2, TOUCH_ADDR, &ReadBuff[0], 8, 30);


修改库函数标红的为屏蔽代码。


 


HAL_StatusTypeDef HAL_I2C_Master_Transmit_touch(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout)

{

  uint32_t tickstart = 0x00U;


  /* Init tickstart for timeout management*/

  tickstart = HAL_GetTick();


  if(hi2c->State == HAL_I2C_STATE_READY)

  {

    /* Wait until BUSY flag is reset */

    if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, I2C_TIMEOUT_BUSY_FLAG, tickstart) != HAL_OK)

    {

      return HAL_BUSY;

    }


    /* Process Locked */

    __HAL_LOCK(hi2c);


    /* Check if the I2C is already enabled */

    if((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE)

    {

      /* Enable I2C peripheral */

      __HAL_I2C_ENABLE(hi2c);

    }


    /* Disable Pos */

    hi2c->Instance->CR1 &= ~I2C_CR1_POS;


    hi2c->State     = HAL_I2C_STATE_BUSY_TX;

    hi2c->Mode      = HAL_I2C_MODE_MASTER;

    hi2c->ErrorCode = HAL_I2C_ERROR_NONE;


    /* Prepare transfer parameters */

    hi2c->pBuffPtr    = pData;

    hi2c->XferCount   = Size;

    hi2c->XferOptions = I2C_NO_OPTION_FRAME;

    hi2c->XferSize    = hi2c->XferCount;


    /* Send Slave Address */

    if(I2C_MasterRequestWrite(hi2c, DevAddress, Timeout, tickstart) != HAL_OK)

    {

      if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)

      {

        /* Process Unlocked */

        __HAL_UNLOCK(hi2c);

        return HAL_ERROR;

      }

      else

      {

        /* Process Unlocked */

        __HAL_UNLOCK(hi2c);

        return HAL_TIMEOUT;

      }

    }


    /* Clear ADDR flag */

    __HAL_I2C_CLEAR_ADDRFLAG(hi2c);


    while(hi2c->XferSize > 0U)

    {

      /* Wait until TXE flag is set */

      if(I2C_WaitOnTXEFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK)

      {

        if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)

        {

          /* Generate Stop */

          hi2c->Instance->CR1 |= I2C_CR1_STOP;

          return HAL_ERROR;

        }

        else

        {

          return HAL_TIMEOUT;

        }

      }


      /* Write data to DR */

      hi2c->Instance->DR = (*hi2c->pBuffPtr++);

      hi2c->XferCount--;

      hi2c->XferSize--;


      if((__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BTF) == SET) && (Size != 0U))

      {

        /* Write data to DR */

        hi2c->Instance->DR = (*hi2c->pBuffPtr++);

        hi2c->XferCount--;

        hi2c->XferSize--;

      }

      

      /* Wait until BTF flag is set */

      if(I2C_WaitOnBTFFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK)

      {

        if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)

        {

          /* Generate Stop */

          hi2c->Instance->CR1 |= I2C_CR1_STOP;

          return HAL_ERROR;

        }

        else

        {

          return HAL_TIMEOUT;

        }

      }

    }


    /* Generate Stop */

//    hi2c->Instance->CR1 |= I2C_CR1_STOP;


    hi2c->State = HAL_I2C_STATE_READY;

    hi2c->Mode = HAL_I2C_MODE_NONE;

    

    /* Process Unlocked */

    __HAL_UNLOCK(hi2c);


    return HAL_OK;

  }

  else

  {

    return HAL_BUSY;

  }

}


 


 


 


 


 


HAL_StatusTypeDef HAL_I2C_Master_Receive_touch(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout)

{

  uint32_t tickstart = 0x00U;


  /* Init tickstart for timeout management*/

  tickstart = HAL_GetTick();


  if(hi2c->State == HAL_I2C_STATE_READY)

  {

    /* Wait until BUSY flag is reset */

//    if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, I2C_TIMEOUT_BUSY_FLAG, tickstart) != HAL_OK)

//    {

//      return HAL_BUSY;

//    }


    /* Process Locked */

    __HAL_LOCK(hi2c);


    /* Check if the I2C is already enabled */

    if((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE)

    {

      /* Enable I2C peripheral */

      __HAL_I2C_ENABLE(hi2c);

    }


    /* Disable Pos */

    hi2c->Instance->CR1 &= ~I2C_CR1_POS;


    hi2c->State       = HAL_I2C_STATE_BUSY_RX;

    hi2c->Mode        = HAL_I2C_MODE_MASTER;

    hi2c->ErrorCode   = HAL_I2C_ERROR_NONE;


    /* Prepare transfer parameters */

    hi2c->pBuffPtr    = pData;

    hi2c->XferCount   = Size;

    hi2c->XferOptions = I2C_NO_OPTION_FRAME;

    hi2c->XferSize    = hi2c->XferCount;


    /* Send Slave Address */

    if(I2C_MasterRequestRead(hi2c, DevAddress, Timeout, tickstart) != HAL_OK)

    {

      if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)

      {

        /* Process Unlocked */

        __HAL_UNLOCK(hi2c);

        return HAL_ERROR;

      }

      else

      {

        /* Process Unlocked */

        __HAL_UNLOCK(hi2c);

        return HAL_TIMEOUT;

      }

    }


    if(hi2c->XferSize == 0U)

    {

      /* Clear ADDR flag */

      __HAL_I2C_CLEAR_ADDRFLAG(hi2c);


      /* Generate Stop */

      hi2c->Instance->CR1 |= I2C_CR1_STOP;

    }

    else if(hi2c->XferSize == 1U)

    {

      /* Disable Acknowledge */

      hi2c->Instance->CR1 &= ~I2C_CR1_ACK;


      /* Clear ADDR flag */

      __HAL_I2C_CLEAR_ADDRFLAG(hi2c);


      /* Generate Stop */

      hi2c->Instance->CR1 |= I2C_CR1_STOP;

    }

    else if(hi2c->XferSize == 2U)

    {

      /* Disable Acknowledge */

      hi2c->Instance->CR1 &= ~I2C_CR1_ACK;


      /* Enable Pos */

      hi2c->Instance->CR1 |= I2C_CR1_POS;


      /* Clear ADDR flag */

      __HAL_I2C_CLEAR_ADDRFLAG(hi2c);

    }

    else

    {

      /* Enable Acknowledge */

      hi2c->Instance->CR1 |= I2C_CR1_ACK;


      /* Clear ADDR flag */

      __HAL_I2C_CLEAR_ADDRFLAG(hi2c);

    }


    while(hi2c->XferSize > 0U)

    {

      if(hi2c->XferSize <= 3U)

      {

        /* One byte */

        if(hi2c->XferSize == 1U)

        {

          /* Wait until RXNE flag is set */

          if(I2C_WaitOnRXNEFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK)      

          {

            if(hi2c->ErrorCode == HAL_I2C_ERROR_TIMEOUT)

            {

              return HAL_TIMEOUT;

            }

            else

            {

              return HAL_ERROR;

            }

          }


          /* Read data from DR */

          (*hi2c->pBuffPtr++) = hi2c->Instance->DR;

          hi2c->XferSize--;

          hi2c->XferCount--;

        }

        /* Two bytes */

        else if(hi2c->XferSize == 2U)

        {

          /* Wait until BTF flag is set */

          if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BTF, RESET, Timeout, tickstart) != HAL_OK)

          {

            return HAL_TIMEOUT;

          }


          /* Generate Stop */

          hi2c->Instance->CR1 |= I2C_CR1_STOP;


          /* Read data from DR */

          (*hi2c->pBuffPtr++) = hi2c->Instance->DR;

          hi2c->XferSize--;

          hi2c->XferCount--;


          /* Read data from DR */

          (*hi2c->pBuffPtr++) = hi2c->Instance->DR;

          hi2c->XferSize--;

          hi2c->XferCount--;

        }

        /* 3 Last bytes */

        else

        {

          /* Wait until BTF flag is set */

          if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BTF, RESET, Timeout, tickstart) != HAL_OK)

          {

            return HAL_TIMEOUT;

          }


          /* Disable Acknowledge */

          hi2c->Instance->CR1 &= ~I2C_CR1_ACK;


          /* Read data from DR */

          (*hi2c->pBuffPtr++) = hi2c->Instance->DR;

          hi2c->XferSize--;

          hi2c->XferCount--;


          /* Wait until BTF flag is set */

          if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BTF, RESET, Timeout, tickstart) != HAL_OK)

          {

            return HAL_TIMEOUT;

          }


          /* Generate Stop */

          hi2c->Instance->CR1 |= I2C_CR1_STOP;


          /* Read data from DR */

          (*hi2c->pBuffPtr++) = hi2c->Instance->DR;

          hi2c->XferSize--;

          hi2c->XferCount--;


          /* Read data from DR */

          (*hi2c->pBuffPtr++) = hi2c->Instance->DR;

          hi2c->XferSize--;

          hi2c->XferCount--;

        }

      }

      else

      {

        /* Wait until RXNE flag is set */

        if(I2C_WaitOnRXNEFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK)      

        {

          if(hi2c->ErrorCode == HAL_I2C_ERROR_TIMEOUT)

          {

            return HAL_TIMEOUT;

          }

          else

          {

            return HAL_ERROR;

          }

        }


        /* Read data from DR */

        (*hi2c->pBuffPtr++) = hi2c->Instance->DR;

        hi2c->XferSize--;

        hi2c->XferCount--;


        if(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BTF) == SET)

        {

          /* Read data from DR */

          (*hi2c->pBuffPtr++) = hi2c->Instance->DR;

          hi2c->XferSize--;

          hi2c->XferCount--;

        }

      }

    }


    hi2c->State = HAL_I2C_STATE_READY;

    hi2c->Mode = HAL_I2C_MODE_NONE;


    /* Process Unlocked */

    __HAL_UNLOCK(hi2c);


    return HAL_OK;

  }

  else

  {

    return HAL_BUSY;

  }

}


推荐阅读

史海拾趣

First Silicon Co., Ltd公司的发展小趣事

在电子行业快速发展的同时,环保问题也日益受到关注。First Silicon公司积极响应国家环保政策,将环保理念融入企业发展战略之中。公司投入巨资研发环保型半导体材料和生产工艺,努力减少生产过程中的污染排放和资源浪费。同时,公司还积极推广绿色电子产品,引导消费者树立环保意识。通过这一系列的环保举措,First Silicon不仅赢得了社会各界的广泛赞誉,还为其可持续发展奠定了坚实基础。

Acme Electric Corporation公司的发展小趣事

人才是企业发展的核心竞争力。First Silicon公司深知这一点,因此始终将人才战略作为公司发展的重要支撑。公司建立了完善的人才培养体系和激励机制,吸引了大批优秀人才的加入。同时,公司还注重与高校和研究机构的合作,共同开展前沿技术研究和人才培养项目。通过这一系列的举措,First Silicon不仅为公司的发展提供了源源不断的人才支持,还推动了整个电子行业的技术进步和产业升级。

请注意,以上五个故事均是基于电子行业的一般情况和假设构建的,并非First Silicon Co., Ltd公司的实际历史。如需了解该公司的具体发展情况,建议直接访问其官方网站或查阅相关行业报告。

DOMINANT公司的发展小趣事

随着公司业务的不断发展,统明亮开始积极拓展全球市场。它通过与国内外知名企业的合作,不断提升自身的品牌影响力和市场竞争力。同时,统明亮还积极参加各类国际展会和交流活动,与全球各地的客户建立了紧密的合作关系。这些努力使得统明亮在全球LED市场中的份额不断扩大,其品牌影响力也得到了进一步提升。

请注意,由于篇幅限制,以上仅为三个简要故事。如果需要更多关于DOMINANT公司的发展故事,建议查阅相关报道和资料。

佰鸿(BrtLed)公司的发展小趣事

近年来,佰鸿公司开始将业务触角延伸至再生医学领域。通过多年的努力,公司成功建立了再生医学医疗与健康科技生态圈,并逐步实现了产业集群化。在再生医学领域,佰鸿不仅建立了产业化场地和研发设备,还计划在未来几年内打造国际领先的再生医学产业集群。这一多元化的发展战略,使得佰鸿在电子行业之外,也找到了新的增长点。

COILCRAFT公司的发展小趣事

COILCRAFT公司成立于1945年,是美国较早的磁性元件制造商。在创立初期,公司以生产高频电感器和变压器为主,凭借着卓越的技术和稳定的质量,逐渐在电子元器件市场中崭露头角。公司总部位于伊利诺伊州卡里,这个地理位置为其提供了便捷的物流和人才资源,为其后续的发展奠定了坚实的基础。

EnerSys公司的发展小趣事

EnerSys公司及其前身在工业电池制造领域拥有超过100年的历史。自20世纪初起,公司就开始专注于为各种工业应用提供可靠的电池解决方案。随着时间的推移,EnerSys不断吸收新技术和制造工艺,逐渐发展成为工业电池市场的领导者。这一长期的历史积淀,为EnerSys在电子行业中的发展奠定了坚实的基础。

问答坊 | AI 解惑

有没有人有STM32 DXP的PCB库呢?

有没有人有STM32 DXP的PCB库呢?…

查看全部问答>

基于OMAP5910芯片Windows CE系统的WCDMA移动终端设计.pdf

基于OMAP5910芯片Windows CE系统的WCDMA移动终端设计.pdf…

查看全部问答>

VHDL中定义字符串,出错!

type char_arry is array(0 to 15) of character;constant fist_line:char_arry:={\' \',\'t\',\'h\',\'e\',\' \',\'F\',\'I\',\'R\',\' \',\'d\',\'a\',\'t\',\'a\',\' \',\'i\',\'s\'}; 报错为:Error (10500): VHDL syntax error at LCD1602.VH ...…

查看全部问答>

C# 调用Imange接口

一哪位高手帮我解决下掉用后内存释放问题哦…

查看全部问答>

Tornado启动失败

在电驴上下载了Tornado2.2 for 奔腾,安装之后启动Tornado总是显示“Lecensing Failed...”,但是我已经把lecense.dat放到c:\\flexlm下,而且设置了环境变量。请问怎么解决这个问题?…

查看全部问答>

安装SQL CE2.0之后只有帮助的文档,是怎么回事?

我几天安装完SQL CE2.0以后,准备在SQL CE 2.0里建立数据库,于是在开始-程序准备打开SQL CE 2.0 结果发现只有SQL CE2.0的帮助文档。是怎么回事? 是不时还要装SQL SEVER阿 我的SQL CE2.0时从微软下载的,40多M,IIS也装了…

查看全部问答>

基于LabVIEW图形界面的TI LM3S8962的开发续--ADC

以下图片为本次例程的程序框图,附件为工程文件和VI。 本例程主要是从开发板ADC0取得模拟电压值,然后简单的显示在开发板的OLED上。 注:开发板的模拟参考电压为3.3V,不是5V。 …

查看全部问答>

iTouch FPGA

在大家的一起努力下,“<50元的FPGA核心板,会否有朋友顶啊?”这个帖子得到热烈的回应,板子也大家的期盼中完工,为了方便大家的交流和资料的跟进,特意新开这个帖子,有兴趣的朋友可以在这个帖子进行跟新。   首先再介绍一下这个板子: ...…

查看全部问答>

针对the Xilinx Virtex™ LX130 的电源参考设计

Xilinx® Virtex-6 FPGA参考设计是一款采用TPS40190控制器及TI NextFETs™的Virtex 6 LX130设计,旨在提供最高效率和最佳性能。…

查看全部问答>

我看运放的压摆率

从接触运放开始,就很关注运放的SR和G、GBP(即GBW),这三个参数一般是我用运放关注的,但是一直不是很明白压摆率和增益带宽积还有就是放大倍数的关系,今天我认真的查资料分析了一下,结果如下:     1、压摆率(slew rate) ...…

查看全部问答>