[STM32F1] 硬件 I2C 搞不定

[复制链接]
 楼主| shimx 发表于 2021-5-9 23:49 | 显示全部楼层 |阅读模式
什么原因?
static void MX_I2C2_Init(void)
{

  /* USER CODE BEGIN I2C2_Init 0 */

  /* USER CODE END I2C2_Init 0 */

  /* USER CODE BEGIN I2C2_Init 1 */

  /* USER CODE END I2C2_Init 1 */
  I2cHandle.Instance = I2C2;
  I2cHandle.Init.ClockSpeed = 100000;
  I2cHandle.Init.DutyCycle = I2C_DUTYCYCLE_2;
  I2cHandle.Init.OwnAddress1 = I2C_ADDRESS;
  I2cHandle.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
  I2cHandle.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
  I2cHandle.Init.OwnAddress2 = 0xff;
  I2cHandle.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
  I2cHandle.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
  if (HAL_I2C_Init(&I2cHandle) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN I2C2_Init 2 */

  /* USER CODE END I2C2_Init 2 */

}
 楼主| shimx 发表于 2021-5-9 23:51 | 显示全部楼层
ipman 发表于 2021-5-9 23:53 | 显示全部楼层
唉,总之STM32硬件I2C很头疼,能用模拟凑合就算了吧,如果实在数据量大影响实时性再考虑,毕竟稳定性最重要。
lizye 发表于 2021-5-9 23:54 | 显示全部楼层
正点原子的程序直接用,端口模拟的IIC
liliang9554 发表于 2021-5-9 23:55 | 显示全部楼层
我都是直接操作寄存器,不用库函数,就不给你程序了,你自己搜库函数的程序
jiajs 发表于 2021-5-9 23:56 | 显示全部楼层
大家都在用软件I2C,很多芯片的例程也是软件I2C,所以还是用软件的好了。
jlyuan 发表于 2021-5-9 23:58 | 显示全部楼层
我以前买了个VOC传感器,用硬件I2C搞半天搞不起来,用软件的一下就好了。
yangxiaor520 发表于 2021-5-10 07:09 来自手机 | 显示全部楼层
楼主是用的F1系列嘛?这个系列的硬件IIC好像有bug
zwll 发表于 2021-5-10 21:51 | 显示全部楼层
我用过硬件IIC,没发现有问题啊
 楼主| shimx 发表于 2021-5-10 21:55 | 显示全部楼层
我用的是 103c8t6,楼上用哪款?
 楼主| shimx 发表于 2021-5-10 21:59 | 显示全部楼层
产生波形了,应该是硬件的问题
 楼主| shimx 发表于 2021-5-10 22:01 | 显示全部楼层
/* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_USB_DEVICE_Init();
  MX_I2C2_Init();
  /* USER CODE BEGIN 2 */
         /*##-5- Master sends read request for slave ##############################*/
    do
    {
      if(HAL_I2C_Master_Transmit_IT(&I2cHandle, (uint16_t)I2C_ADDRESS, (uint8_t*)&bTransferRequest, 1)!= HAL_OK)
      {
        /* Error_Handler() function is called in case of error. */
        Error_Handler();
      }
执行到这里 SCL SDA 就全拉低了·,波形上也看得出
 楼主| shimx 发表于 2021-5-10 22:04 | 显示全部楼层
MX_I2C2_Init();
  /* USER CODE BEGIN 2 */
         /*##-5- Master sends read request for slave ##############################*/
          bTransferRequest = MASTER_REQ_WRITE;
                //bTransferRequest = MASTER_REQ_READ;
    do
    {
      if(HAL_I2C_Master_Transmit_IT(&I2cHandle, (uint16_t)I2C_ADDRESS, (uint8_t*)&bTransferRequest, 1)!= HAL_OK)
      {
        /* Error_Handler() function is called in case of error. */
        Error_Handler();
      }

主模式读和写都不行
午夜粪车 发表于 2021-5-10 22:07 | 显示全部楼层
用库函数应该没问题的
zhanghqi 发表于 2021-5-10 22:10 | 显示全部楼层
我的429开发板触控就是I2C通信的,用的库函数,没什么问题
yszong 发表于 2021-5-10 22:13 | 显示全部楼层
初始化的时候,GPIO时钟和模式,I2C时钟和模式设置正确,调用发送或接收函数的时候,注意用哪种方式进行传输
dingy 发表于 2021-5-10 22:16 | 显示全部楼层
调用相应的函数,应该没问题的
heweibig 发表于 2021-5-10 22:18 | 显示全部楼层
单片机坏了的可能性很小的吧
 楼主| shimx 发表于 2021-5-10 22:23 | 显示全部楼层
F4 可能是没问题,F1 好多人碰到问题,不可能是巧合
yszong 发表于 2021-5-10 22:26 | 显示全部楼层
do{}循环里面发送完后做啥了?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

857

主题

10661

帖子

5

粉丝
快速回复 在线客服 返回列表 返回顶部