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.

[参考译文] MSP430F6721:I2C写入TMP007

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/581929/msp430f6721-i2c-write-to-tmp007

部件号:MSP430F6721
主题中讨论的其他部件: MSP430WARE

我正在使用MSP430F6721通过I2C和TI的驱动程序库与TI的TMP007温度传感器进行通信。  我可以从TMP007读取重要数据(热电压,模具温度,校准温度),但我无法可靠地向其写入数据。  当我试图写入TMP007 (写入配置寄存器或其中一个系数寄存器)时,我得到了一个部分写入,其中寄存器地址丢失。

我之前 要求提供有关我的I2C先写后读功能的反馈,这非常有用。

这是我的I2C写入功能。

/************************************************************************** //**
*@简介 使用I2C写入TMP007寄存器。
*@param[IN] address - I2C器件地址
*@param[IN] reg - TMP007寄存器用于对
*@param[IN]数据执行操作-数据写入TMP007芯片
*@retval 成功正确;否则错误
************************************************************************* /
静态bool tempWriteReg (uint8_t地址,uint8_t reg,_Q4_t数据)
{
布尔结果=假; //返回悲观值
uINT8_t temp[2]={0,0"; //要通过I2C发送的数据

//形成消息。
temp[0]=(uint8_t)(data >>8);
temp[1]=(uint8_t)(数据和0x00FF);

DO //此结构将很好地处理错误。
{
//设置要与之通话的传感器的从属地址。
EUSCI_B_I2C_setSlaveAddress (I2C_BASEADDR,地址);

//设置写模式。
EUSCI_B_I2C_setMode (I2C_BASEADDR,EUSCI_B_I2C_Transmit_mode);

//在While循环以下函数之前对看门狗进行Pat。
看门狗_update();

//将寄存器写入传感器。
//发送起始地址+地址,后面是3字节消息,后面是STOP。
结果= EUSCI_B_I2C_masterSendMultiByteStartWithTimeout (I2C_BASEADDR,reg,TEMP_TIMEOUT);
如果(结果==假)
中断;

结果= EUSCI_B_I2C_masterSendMultiByteNextWithTimeout(I2C_BASEADDR, temp[0],TEMP_timeout);
如果(结果==假)
中断;

结果= EUSCI_B_I2C_masterSendMultiByteFinishWithTimeout(I2C_BASEADDR, temp[1],TEMP_timeout);
} While (假);

返回结果;
} 

以下是使用Saleae Logic协议分析器执行以下三行代码时的I2C数据捕获。

#define TMP007_address 0x40 //传感器的7位地址

#define TMP007_REG_S0 0x0A // S0系数寄存器
#define TMPREG_REG_B0 0x0D // B0系数寄存器
#define TMP007_007_B1 0x0E // B1寄存器tempRegister Coefficient

WriteWriteReg (TMPeff_address, TEMPO_REG_DEF_DR_AD0, D0DR_AD0DR_D0, D0DR_D0DR_D0_D0_D0, B0DR_D0
0xFF32);
tempWriteReg (TMP007_address,B1_Coeff_REG_ADDR,0xFA78); 

绿色圆点表示开始条件;红色圆点表示停止条件。  蓝色波形是总线上的模拟波形。  如您所见,虽然每个事务中应该有四个字节,但第二和第三事务中只有三个字节。

我是否做了明显的错误?  另外,MSP430F6721是否有一个使用driverlib的I2C示例?  我在MSP430ware中找不到一个。

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

    您是否见过以下应用说明? 它将帮助您在未来使用I2C进行一些调试工作。 www.ti.com/.../slaa734

    话虽如此,从您的逻辑分析器屏幕截图,特别是模拟信号电平来看,我想说您的I2C线路上没有足够的上拉数据。 线路上的电容似乎太大,需要更强的拉力才能进行正确的通信。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    仅供参考,对于这个项目,我在每次写入TMP007之后,只重置I2C驱动程序。 一个肮脏的黑客攻击,但在我的情况下,它已经足够好了。

    我的电路中使用的I2C上拉电阻器的尺寸正确...我在示波器中选择了慢速采样速率,这是造成波形外观不佳的原因。

    Adam J.