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.

[参考译文] MSP432P401R:MSP432P401R Launchpad 和 TMP100温度传感器问题

Guru**** 2391415 points
Other Parts Discussed in Thread: TMP100, TMP006

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/623677/msp432p401r-msp432p401r-launchpad-and-tmp100-temperature-sensor-issue

器件型号:MSP432P401R
主题中讨论的其他器件:TMP100

我无法从 TMP100获取温度读数。 我使用的是 EUSCI B2。 跟踪我的代码(尽可能多地使用 Driverlin API)。

ADD0和 ADD1线路在芯片上接地  

 我在调用 TMP100SendData (data_buffer、SlaveAddress)时包含了 SCL 和 SDA 波形的屏幕截图;

在 TMP100Init...中  融合函数并执行以下行:

MAP_I2C_masterSendMultiByteStart (EUSCI_B2_base、buffer[i]);//发送开始、地址和第一个字节

似乎代码正在写入正确的地址(即0x48,但 在发送0x01之前我看不到'ACK')

SCL -顶部图

SDA -底部图

代码:

#define TMP100_SLAVE_ADDRESS0 0x48

#define TMP100_RES_12BITS        0x60 //转换时间通常为320ms

#define NON_SHUTDOWN_MODE   0x00 //连续转换

将 EUSCI_B2设置为主器件后、我运行以下初始化函数:

  TMP100Init (TMP100_SLAVE_ADDRESS0、TMP100_RES_12BITS | NON_SHUTDOWN_MODE);//等式至 TMP100Init (0x48、TMP100_RES_12BITS | NON_SHUTDOWN_MODE)

空 TMP100Init (uint_fast16_t SlaveAddress、uint8_t Config_Reg_Value)

uint8_t DATA_buffer[3];

DATA_buffer[0]= TMP100_CONFIG_register; // 0x01
DATA_buffer[1]= Config_Reg_Value;// 0x01
DATA_buffer[2]= 0;//针对'TMP100SendData 例程的缓冲器终止

TMP100SendData (data_buffer、SlaveAddress);

//重置为读取温度

DATA_buffer[0]= TMP100_TEMP_register;
DATA_buffer[1]= 0;//针对'TMP100SendData 例程的缓冲器终止

TMP100SendData (data_buffer、SlaveAddress);

void TMP100SendData (uint8_t *缓冲区、uint_fast16_t SlaveAddress)


unsigned int i = 0;

//指定从机地址
MAP_I2C_setSlaveAddress (EUSCI_B2_base、SlaveAddress);

//将主设备设置为发送模式
MAP_I2C_setMode (EUSCI_B2_base、EUSCI_B_I2C_Transmit 模式);

MAP_I2C_masterSendMultiByteStart (EUSCI_B2_base、buffer[i]);//发送开始、地址和第一个字节

i++;
while (buffer[i]!= 0)

MAP_I2C_masterSendMultiByteNext (EUSCI_B2_base、buffer[i]);
i++;

MAP_I2C_masterSendMultiByteStop (EUSCI_B2_base);//结束传输

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

    David、

     下面我建议使用已知工作程序来读取 I2C、但前提是您使用的是 LaunchPad。 如果这不正确、以下内容可能不适合您。 如果是这样、请告诉我、我们可以尝试其他方法。

     首先、我可能会尝试运行其中一个 TI 驱动程序(使用 TI-RTOS)示例、该示例已知可使用 I2C 读取温度。TI Resource Explorer/ Software/SimpleLink 下的"i2ctmp007"示例 从 TI 传感器集线器 BoosterPack 读取 I2C 温度传感器(TMP007)。 它使用不同的 EUSCI 实例和 I2C 地址(后者可通过编辑 i2ctmp007.c 源文件中的变量 TMP007_obj_TEMP 进行更改)。

    该程序只需读取温度并将值输出到反向通道 UART。

    这至少可以让您查看硬件或软件是否存在故障。 (虽然您可能没有收到 ACK、这表明存在连接问题或可能解决了问题、但这是值得怀疑的。)  运行上述程序至少会为您提供一个已知的工作起点。  

    如需更多信息   、请参阅 SimpleLink Academy "多线程 RTOS 恒温器"模块、了解如何使用传感器集线器 BoosterPack 并通过 I2C 读取温度。  

    此致、

     Bob

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

    尊敬的 David:

     我们提供了一些 i2c 驱动器(使用 driverlib)、您可能会在 boostxl_sensor_sensorgui 示例中发现它们非常有用。

    请查看 tmp007.c 和 i2c_driver.c 移植它以支持 TMP100应该非常简单、您能否尝试一下、如果您看到相同的行为、请告知我们。

     希望这对您有所帮助。

      David

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

    尊敬的 Bob:

    我更改了 SCL 和 SDA 上拉电阻器、TMP100初始化有效。

    我的下一个问题是使用 driverlib API 读取温度数据。

    我查看了非 RTOS 示例 (教育版 Booster MKII 的 tmp006代码、 以及 simplelink drivelib 示例'i2c_master_rw_erial_start-master_code.c')

    我尝试了2种代码实现:(为了清晰起见、添加了行号)

    代码1是 第1-12行、不起作用。

    这是 我第二次在第3行执行。 我注意到了这一点

    SDA 在第二个运行时为低电平。 我唯一可以解决此问题的方法是对 TMP100 IC 进行下电上电。

    代码2 只是第1行、第4行至第12行。 (即不包括第2行和第3行)。

     不过、当我使用具有不同地址的2个 TMP100器件时、这种做法会起作用、

    当针对一个 TMP100运行代码时,它会报告另一个器件的温度。 它看起来是

    第5行和第7行中的值来自之前读取的 TMP100。

    注:我执行以下操作:

    Read_Sensor1->Read_Sensor2->Read_Sensor1..... 等等

    其中 READ_SensorX 运行 指定 TMP100的代码。

    由于使用该顺序的'i2c_master_rw_er重复_start-master_code.c'代码中有注释、第6行和第7行按该顺序排列。

    以下是注释:

          /*

          *切换顺序,以便在接收最后一个时设置 STOP

          *字节读取字节、以便可以读取下一个字节。

          *

    实际上、当我切换线路6和7时、即使我加热或冷却 TMP100、温度读数也不会改变

    代码:

    浮点 TMP100ReadTemperature (uint_fast16_t SlaveAddress)

      volatile uint16_t temp = 0;

      volatile uint16_t val = 0;

      volatile uint16_t valscratch = 0;

      浮点温度值;

      1、MAP_I2C_setSlaveAddress (EUSCI_B2_base、SlaveAddress);

    2、 MAP_I2C_setMode (EUSCI_B2_base、EUSCI_B_I2C_Transmit 模式);

        /*发送开始和发送缓冲区的第一个字节。 *

    3.   MAP_I2C_masterSendMultiByteStart (EUSCI_B0_BASE 、0x00]);//点 对点温度寄存器

    4.MAP_I2C_masterReceiveStart  (EUSCI_B2_BASE);

      5. Val = MAP_I2C_masterReceiveMultiByteNext (EUSCI_B2_base);//获取 MSByte

    6.  MAP_I2C_masterReceiveMultiByteStop (EUSCI_B2_base);//发送停止

    7.valscratch  = MAP_I2C_masterReceiveMultiByteNext (EUSCI_B2_base);//获取 LSByte

    8.  Val =(val << 8)& 0xFF00; //移位至顶部 MSB

     9. valscratch = valscratch &(0x00FF);

    10. temp = val | valscratch;

    11. 温度=温度>> 4;

     12.  温度=(浮点) temp* 0.0625;

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

    尊敬的 David:

    当我发布我的温度读数问题时、您似乎回答了。 我将查看 tmp007 driverlib 示例。 谢谢

    David

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    David、
    大卫杜夫的回答是否解决了您的问题?
    -Bob
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我尝试将他的帖子链接( 具有中断模式的 tmp007)中使用的一些概念与我的 tmp100 (非中断模式)结合使用、并遇到了2017年9月14日帖子中指出的问题。  'i2c_driver.c'代码执行 一些 I2C 状态检查(例如 NAK、START、STOP)、我想知道如何在非中断运行模式下执行类似的检查。