This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TMP1826:如何驱动TMP1826?

Guru**** 1178510 points
Other Parts Discussed in Thread: TMP1826, SN74LVC1G07
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/sensors-group/sensors/f/sensors-forum/1097942/tmp1826-how-to-drive-tmp1826

部件号:TMP1826
主题中讨论的其它部件: SN74LVC1G07

大家好

我们希望使用MCU GPIO驱动TMP1826 ,但它无法工作。我们使用数据表中推荐的电路对其进行了设置。 它与总线供电应用一起使用。在调试时,我们尝试将上拉电阻从330欧姆~ 11k欧姆调整, 但它仍然不起作用,我们也尝试将MCU改为3.3V类型,但结果仍然一样。  谁可以帮助检查它?

下面是调试代码,请使用CMD: ReadTemperature,ReadROM,但它只回复0xFF,

位Init_DS18B20 (void)

 位dat=0;
 DQ = 1;   //DQ 重置
 DelayUs2x(5);  //延迟
 DQ = 0;        //驱动器低
   Delay500us (); //  //  480us < TMP1826 <560us
   DelayUs2x (50);  //20us
 DQ = 1;       //上拉
 Delay50us();//15~60US
   DelayUs2x (50);  //20us
 DAT=DQ;       //检查DQ  
 DelayUs2x(25);//
 DelayUs2x(200);
 DelayUs2x(200);
 返回dat;
}

无符号char ReadOneChar(void)          

无符号char i=0;
无符号字符dat =0;
对于(i=8;i>0;i--)
 {
 DQ = 0;//
   Delay3us()   ;
 dat>=1;
 DQ = 1;//
   Delay20us()   ;    
 IF (DQ)
   {dat|=0x80;}
   Delay50us()   ;
      DQ = 1;
   Delay20us()   ;    
 }
 返回(dat);
}

void WriteOneChar(unsigned char dat)

 无符号char i=0;
      DQ = 1;    
 SPower=1;
 对于(i=8; i>0; i--)
 {
 如果(dat&0x01)
 {    
 DQ = 0;
      DELAY _5us ();
 DQ = 1;
      Delay50us();
      Delay20us();
    }
    否则
    {
     DQ = 0;    
         Delay20us();
         Delay50us();
         Delay20us();
       }
      
 dat>=1;
      DQ = 1;    
         Delay20us();
 }
}

无符号int ReadTemperatureTMP1826(void)

无符号字符a=0;
无符号int b=0;
无符号int t=0;
INIT_DS18B20();
WriteOneChar(0xCC);//跳过
WriteOneChar(0x44);//
Delay50ms();
INIT_DS18B20();
WriteOneChar(0xCC);//
WriteOneChar(0xBE);//
a=ReadOneChar();//  低字节
B=ReadOneChar();//  高字节
INIT_DS18B20();
B<<=8;
T=a+b;
返回(t);
}

/*------------------
                   读取ROM 64位ID
---------------- */
void ReadROM (void)

无符号char i=0;
DelayUs2x(100);
INIT_DS18B20();
WriteOneChar(0x33);//

 对于(i=0;i<8;i++)
 {      
 buf[i]=ReadOneChar();  
       }  
}

 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,Yang,

    您需要禁用GPIO输出以允许TMP1826响应。 在某些情况下,需要将输出切换至"输入","Z","三态"或"高阻抗"状态。 我在您的代码中没有看到任何显示这种情况的迹象。

    谢谢!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好,任

    感谢您的检查。

    我们使用8位MCU对其进行测试,它不需要像STM32那样配置其模式, 我们可以自动将其用作输出或输入。  

    此外,我还尝试将GPIO模式更改为“三态”或“高影响”状态,但仍然无法工作。

    您能告诉我您的测试代码和建议的测试电路吗?

    如果可以,我将不胜感激。

    \n您406.7019万您需要406.7019万需要禁用GPIO输出以允许TMP1826响应。 在某些情况下,需要将输出切换至"输入","Z","三态"或"高阻抗"状态。 我在您的代码中没有看到任何显示。[/QUOT]

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,Yang,

    这里我展示了一个额外的组件,漏极开路驱动 器SN74LVC1G07,创建Z状态。 这是TMP1826在无争用的情况下响应所必需的。 由于此组件是单向组件,因此必须在辅助GPIO上接收。

     

    要使电路使用一个GPIO,您必须指示GPIO输出Z而不是逻辑H。您可以通过将GPIO配置为输入, 并在需要输出逻辑L时将其重新配置为输出。IO配置将是一个单独的寄存器。 它可以称为输出掩码。  

    // assume your controller has 8 GPIO, the 8 GPIO correspond to 8 bits
    // OUTPUT will be the 8-bit register that controls the state of the pin high/low
    // OUT_MASK will be the 8-bit register that configures the 8 pins as input or output
    
    #define SDQ 4 //this is the value of our pin in the reigster, pin 3 (hypothetical)
    
    void setSDQ(char value){
     if (value) {
      OUT_MASK &= ~SDQ; //clear bit to configure as input
      // pull-up resistor will create logic H 
     }
     else {
      OUT_MASK |= SDQ; //set bit to configure as output
      OUTPUT &= ~SDQ; //clear bit to output low
     }
    }
    
    void main(){
     setSDQ(0);
     setSDQ(1);
     setSDQ(0);
    }

    谢谢!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好,任

    我把它设置为漏极开路,只连接外部上拉电阻,但还是反馈0xff。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您能否向我展示您的SDQ活动的示波器捕获? 在复位脉冲期间,您是否能够看到TMP1826的响应?

    是否确定您的控制器可以在11漏极开路模式下读取输入,如图所示? 只有模式00被描述为双向。 此代码是否与此控制器上的其它设备一起使用?

    您可能需要使用小于20us的读取延迟。 查看示波器或分析仪以确认实际时间。  

    谢谢!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好,任

    是的,在重置pluse期间,我可以从TMP1826获得响应。以下是重置代码。当DQ=1时,释放总线有100us延迟。 您可以发现TMP1826已将其设置为540us低电 平。它似乎可以激活。

    bit Init_DS18B20(void)
    {
     bit dat=0;
     DQ = 1;    //DQ复位
     DelayUs2x(5);   //稍做延时
     DQ = 0;         //单片机将DQ拉低
    	Delay500us();  //精确延时 大于 480us 小于960us    //   480us<  TMP1826 <560us
    //	Delay20us();   //20us
    
     DQ = 1;        //拉高总线
     Delay50us(); //15~60us 后 接收60-240us的存在脉冲
    	Delay50us();;   //20us
     dat=DQ;        //如果x=0则初始化成功, x=1则初始化失败
      
     DelayUs2x(25); //稍作延时返回
     DQ=1;		// new add
     Delay50us();
     Delay500us();
    
    
     return dat;
    }
    

     但是当我尝试设置0x33以读取地址时,它只反馈0xff。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    bit Init_DS18B20 (void)

     位dat=0;
     DQ = 1;   //DQ 重置
     DelayUs2x(5);  //延迟
     DQ = 0;        //驱动器低
       Delay500us (); //  //  480us < TMP1826 <560us
       DelayUs2x (50);  //20us
     DQ = 1;       //上拉
     Delay50us();//15~60US
       DelayUs2x (50);  //20us
     DAT=DQ;       //检查DQ  
     DelayUs2x(25);//
     DelayUs2x(200);
     DelayUs2x(200);
     返回dat;
    }

    dat是否返回0?  

    首先传输读取命令0x33 LSBit,因此确保1 1 0 0 1 0出现在示波器或逻辑分析仪上。

    写入/读取位的定时分辨率比重置信号小得多。 另外,请使用示波器检查数据位,以确保定时按预期显示。  

    地址为64位,因此您应接收到多于0xFF的地址。 我的示例设备是 0x2700万0000325E。0.0325万。

    谢谢!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,Ren

    现在它可以读出地址,它似乎被设计的产品饼干所涂胶。  

    谢谢