stm32f407使用i2c接口和温度传感器通信

           因为使用TMP112温度芯片,该芯片是I2C接口,用来测试温度,需要和主板进行通信。需要对STM32F407进行代码编写。

         主机初始I2C接口初始代码如下:

  LL_I2C_InitTypeDef I2C_InitStruct = {0};

  LL_GPIO_InitTypeDef GPIO_InitStruct = {0};

  LL_AHB1_GRP1_EnableClock(LL_AHB1_GRP1_PERIPH_GPIOB);
  /**I2C2 GPIO Configuration
  PB10   ------> I2C2_SCL
  PB11   ------> I2C2_SDA
  */
  GPIO_InitStruct.Pin = LL_GPIO_PIN_10|LL_GPIO_PIN_11;
  GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;
  GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_VERY_HIGH;
  GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_OPENDRAIN;
  GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
  GPIO_InitStruct.Alternate = LL_GPIO_AF_4;
  LL_GPIO_Init(GPIOB, &GPIO_InitStruct);

  /* Peripheral clock enable */
  LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_I2C2);

  /* USER CODE BEGIN I2C2_Init 1 */

  /* USER CODE END I2C2_Init 1 */
  /** I2C Initialization
  */
  LL_I2C_DisableOwnAddress2(I2C2);
  LL_I2C_DisableGeneralCall(I2C2);
  LL_I2C_EnableClockStretching(I2C2);
  I2C_InitStruct.PeripheralMode = LL_I2C_MODE_I2C;
  I2C_InitStruct.ClockSpeed = 100000;
  I2C_InitStruct.DutyCycle = LL_I2C_DUTYCYCLE_2;
  I2C_InitStruct.OwnAddress1 = 0;
  I2C_InitStruct.TypeAcknowledge = LL_I2C_ACK;
  I2C_InitStruct.OwnAddrSize = LL_I2C_OWNADDRESS1_7BIT;
  LL_I2C_Init(I2C2, &I2C_InitStruct);
  LL_I2C_SetOwnAddress2(I2C2, 0);

     然后再循环中使用下面函数就可以读取数据了。自己记录下来:

I2C_DELAY_BLOCK(!LL_I2C_IsActiveFlag_BUSY(I2C_x));
    
    /* 2.发送START信号 */
    LL_I2C_AcknowledgeNextData(I2C_x, LL_I2C_ACK);
    LL_I2C_GenerateStartCondition(I2C_x);
    I2C_DELAY_BLOCK(LL_I2C_IsActiveFlag_SB(I2C_x));
    
    /* 3.写器件地址 */
    LL_I2C_TransmitData8(I2C_x, SlaveAddr);
    I2C_DELAY_BLOCK(LL_I2C_IsActiveFlag_ADDR(I2C_x));
    LL_I2C_ClearFlag_ADDR(I2C_x);            // 清除标志位
    
    /* 4.地址位已经置位,通常TXE也会完成,为了谨慎,再查一下. */
    I2C_DELAY_BLOCK(LL_I2C_IsActiveFlag_TXE(I2C_x));
    
    /* 5.发送器件寄存器地址. */
    LL_I2C_TransmitData8(I2C_x, ReadAddr);
    I2C_DELAY_BLOCK(LL_I2C_IsActiveFlag_TXE(I2C_x));
    
    /* 6.提供RESTART信号. */
    LL_I2C_GenerateStopCondition(I2C_x);
    LL_I2C_GenerateStartCondition(I2C_x);
    I2C_DELAY_BLOCK(LL_I2C_IsActiveFlag_SB(I2C_x));
    


//LL_I2C_HandleTransfer

    
    /* 7.重新发送地址,并附带读标记. */
    LL_I2C_TransmitData8(I2C_x, SlaveAddr | 0x01);
    I2C_DELAY_BLOCK(LL_I2C_IsActiveFlag_ADDR(I2C_x));
    
    /* 8.标记读完就STOP. */
    LL_I2C_AcknowledgeNextData(I2C_x, LL_I2C_ACK);
    LL_I2C_ClearFlag_ADDR(I2C_x);

//    LL_I2C_GenerateStopCondition(I2C_x);
    I2C_DELAY_BLOCK(LL_I2C_IsActiveFlag_RXNE(I2C_x));
    pRecevData[0]= LL_I2C_ReceiveData8(I2C_x);
    /* 8.标记读完就STOP. */
    LL_I2C_AcknowledgeNextData(I2C_x, LL_I2C_NACK);
    LL_I2C_ClearFlag_ADDR(I2C_x);
    LL_I2C_GenerateStopCondition(I2C_x);
    I2C_DELAY_BLOCK(LL_I2C_IsActiveFlag_RXNE(I2C_x));
    /* 9.数据已读取. */
    pRecevData[1]= LL_I2C_ReceiveData8(I2C_x);

    经过测试,完全没有问题,使用示波器,也查看了波形,波形非常正常。代码供自己以后使用。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: STM32F407是一款强大的微控制器,可以通过软件模拟I2C总线来读写MPU6050传感器。首先,我们需要设置相关的GPIO引脚来模拟I2C的时钟(SCL)和数据线(SDA)。然后,我们可以通过相应的软件算法来模拟I2C的时序,并使用GPIO引脚来模拟信号的传输。 在进行软件模拟I2C读写MPU6050之前,我们需要先了解MPU6050的寄存器结构和通讯协议。MPU6050内部有多个寄存器,它们存储着各种传感器的原始数据和配置信息。通讯协议使用I2C,我们需要根据MPU6050的地址和寄存器地址来发送读写命令。 首先,发送开始信号。通过GPIO引脚模拟SCL和SDA,在SCL为高电平,SDA从高电平转为低电平时即可认为发送了开始信号。然后,发送MPU6050的设备地址,该地址为7位,由3位固定的值和一个可选择的读写位组成。接下来,发送要访问的寄存器地址,该地址也为7位。再发送读写命令位,0表示写入,1表示读取。 接下来,我们可以进行读写操作。对于写操作,我们发送要写入的数据到寄存器中。对于读操作,我们需要发送重复启动信号,然后再发送MPU6050的设备地址和寄存器地址,并设置读取命令位。此时,我们将把数据读取到SDA引脚上。 最后,发送停止信号。通过GPIO引脚模拟SCL和SDA,在SCL为高电平时将SDA从低电平转为高电平即可认为发送了停止信号。 以上是对于STM32F407软件模拟I2C读写MPU6050传感器的简要步骤介绍。具体实现过程中,需要根据实际需求进行相应的编码和调试。 ### 回答2: stm32f407是一款高性能的ARM Cortex-M4微控制器,可以通过软件模拟I2C总线来读写MPU6050传感器。 首先,我们需要了解MPU6050传感器的通信协议和寄存器地址。MPU6050使用I2C总线进行通信,需要通过开始信号、设备地址、寄存器地址、数据等步骤完成数据的读写。 在stm32f407上,我们可以使用GPIO引脚来模拟I2C总线的SCL(时钟线)和SDA(数据线)。我们需要配置SCL和SDA引脚为GPIO模式,并在代码中编写相应的功能实现软件模拟I2C总线的读写操作。 对于I2C总线的读操作,首先我们需要发送开始信号,然后发送设备地址加上写命令,接着发送寄存器地址,再发送一个重新开始信号,然后发送设备地址加上读命令,最后读取接收到的数据。 对于I2C总线的写操作,首先也是发送开始信号,然后发送设备地址加上写命令,接着发送寄存器地址,最后发送要写入的数据。 在代码中,我们可以按上述过程编写相应的函数来进行软件模拟的I2C读写操作,并将读取到的数据存储到相应的变量中。 需要注意的是,软件模拟I2C通信可能会导致一定的时序不准确。为了确保通信的稳定性和可靠性,我们可以使用延时函数来控制时序,并根据MPU6050传感器的参数手册调整延时时间。 总之,通过在stm32f407上进行软件模拟的I2C读写操作,我们可以实现对MPU6050传感器的数据读取和写入,从而实现与该传感器的通信和控制。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值