当前位置:   article > 正文

SGP30_调试1_sgp30iic时序调节问提

sgp30iic时序调节问提

SGP30开发)发送指令过程需要延时

1.没添加延时

在开发过程中遇到的小问题,模拟IIC驱动SGP30二氧化碳传感器的时候,发送读取器件指令没有添加延时

void SGP30_Write(uint8_t cmd1, uint8_t cmd2)
{
        
    i2c_Start(DEV_SGP30);/* 总线开始信号 */
    i2c_SendByte(DEV_SGP30,SGP30_write);//发送器件地址+写指令
    i2c_WaitAck(DEV_SGP30); /*等待应答*/

    i2c_SendByte(DEV_SGP30,cmd1);
    i2c_WaitAck(DEV_SGP30);

    i2c_SendByte(DEV_SGP30,cmd2);
    i2c_WaitAck(DEV_SGP30);

    i2c_Stop(DEV_SGP30);
	//DEBUG 指令写入需要延时不能过快写入,不然有可能器件读取失败
    //bsp_DelayMS(100);

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

导致图中读取B1之后,器件返回NACK,无应答,原因是没有添加bsp_DelayMS(100);

image-20240429003926833

2.添加延时后

void SGP30_Write(uint8_t cmd1, uint8_t cmd2)
{
        
    i2c_Start(DEV_SGP30);/* 总线开始信号 */
    i2c_SendByte(DEV_SGP30,SGP30_write);//发送器件地址+写指令
    i2c_WaitAck(DEV_SGP30); /*等待应答*/

    i2c_SendByte(DEV_SGP30,cmd1);
    i2c_WaitAck(DEV_SGP30);

    i2c_SendByte(DEV_SGP30,cmd2);
    i2c_WaitAck(DEV_SGP30);

    i2c_Stop(DEV_SGP30);
	//DEBUG 指令写入需要延时不能过快写入,不然有可能器件读取失败
    bsp_DelayMS(100);

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

image-20240429004327972

image-20240429004331644

图中写入B1读地址之后,器件应答,开始返回数据。

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号