请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
部件号: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中找不到一个。
