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和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中找不到一个。