我要做的是使用 sensortag 获取红外温度和湿度传感器读数。 我知道 ble SDK 中的 sensortag 源代码包含该代码。 但我需要从外部传感器(Si7006-A20-IM)读取读数。 我从 cc2650 sensortag 开始(因为 tmp007 与我需要使用的传感器的距离更近)、并尝试扩展 launchpad (simple_peripheral)的源代码、并从 tmp007读取温度传感器。
我所做的主要是在应用程序中编辑 simple_peripheral.c。 有一个带有回调函数 simpleBLEPeripheral_taskFxn()的任务,此任务是在 SimpleBLEPeripheral_createTask()中创建的。 我同样从 main 创建了一个任务调用函数 create_MyTask()来创建任务,回调函数为 MyTask_fxn()。 我已经在 seSimpleBLEPeripheral_taskFxn()中发布了一个与 MyTask 相关的信号量,以便 BIOS 可以运行 MyTask。 任务运行正常。
接下来、我将 i2ctmp007_CC2650STK_TI_CC2650f128示例中粘贴的 I2C 代码(在 sensortag 上运行正常)复制到 MyTask 函数中。
unsigned int i;
uint16_t 温度;
uint8_t txBuffer[1];
uint8_t rxBuffer[2];
I2C_Handle i2c;
I2C_Params i2cParams;
I2C_Transaction i2cTransaction;
/*创建 I2C 以供使用*/
I2C_Params_init (&i2cParams);
i2cParams.bitrate = I2C_400kHz;
I2C = I2C_open (0、&i2cParams);
if (i2c == NULL){
MSG[7]='n';
//System_abort ("初始化 I2C\n 时出错");
}
否则{
//msg[7]= I2C_transfer (i2c、&i2cTransaction);
//System_printf ("I2C 已初始化!\n");
}
/*指向 T 环境寄存器并读取其2个字节*/
txBuffer[0]= TMP007_obj_TEMP;
i2cTransaction.slaveAddress = Board_TMP007_ADDR;
i2cTransaction.writeBuf = txBuffer;
i2cTransaction.writeCount = 1;
i2cTransaction.readBuf = rxBuffer;
i2cTransaction.ReadCount = 2;
MSG[9]++;
if (I2C_transfer (i2c、&i2cTransaction)){
温度= 16;
/*从接收到的数据中提取°C;请参阅 TMP102 数据表*/
温度=(rxBuffer[0]<< 6)|(rxBuffer[1]>> 2);
/*
*如果 MSB 设置为"1"、则我们有二进制补码
*需要符号扩展的负值
*
if (rxBuffer[0]& 0x80){
温度|= 0xF000;
}
/*
*为简单起见、将温度值除以32即可摆脱
*十进制精度;请参阅 TI 的 TMP007 数据表
*
温度/= 32;
MSG[5]=温度;
温度= 12;
//System_printf ("采样%u:%d (C)\n"、i、温度);
}
否则{
// System_printf ("I2C 总线故障\n");
}
I2C_open (0、&i2cParams)不返回 false。 但是 I2C_transfer (i2c、&i2cTransaction)不起作用。 if condition 从不执行时的代码。