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.

[参考译文] 编译器/LAUNCHXL-CC2650:具有 cc2650 Launchpad 的 apds-9306/APDS-9306-065、读取 Lux 失败

Guru**** 2579665 points
Other Parts Discussed in Thread: CC2650

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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/792627/compiler-launchxl-cc2650-apds-9306-apds-9306-065-with-cc2650-launchpad-read-lux-failed

器件型号:LAUNCHXL-CC2650
Thread 中讨论的其他器件:CC2650

工具/软件:TI C/C++编译器

您好!

我尝试使用 cc2650连接到 APDS-9306环境光传感器。 我使用 I2CTemp007作为参考。 我能够读取器件 ID、但我不确定如何获取 lux 数据。  

您能建议我如何从特定寄存器读取数据吗?

我需要使用0x02启用 MAIN_CTRL 并检查 MAIN_STATUS 寄存器的状态、然后开始从 ALS_DATA_0寄存器读取数据。

以下是我的代码:

/*
=== 回声 Fxn =====
*此函数的任务是静态创建的。 请参阅工程的.cfg 文件。
*/
void taskFxn (UArg0、UArg0 arg1)
{
unsigned int i;
uint32_t 勒克斯;
uint8_t txBuffer[4];
uint8_t rxBuffer[4];
I2C_Handle I2C;
I2C_Params i2cParams;
I2C_Transaction i2cTransaction;

/*创建 I2C 以供使用*/
I2C_Params_init (&i2cParams);
i2cParams.bitrate = I2C_400kHz;
I2C = I2C_open (Board_I2C_TMP、&i2cParams);
if (i2c == NULL){
System_abort ("初始化 I2C\n 时出错");
}
否则{
system_printf ("I2C 已初始化!\n");
}

Task_sleep (1000000 / Clock_tickPeriod);

//读取 APDS-9306-65器件 ID
TxBuffer[0]= 0x06;
i2cTransaction.slaveAddress = 0x52;
i2cTransaction.writeBuf = txBuffer;
i2cTransaction.writeCount = 1;
i2cTransaction.readBuf = rxBuffer;
i2cTransaction.ReadCount = 1;

if (I2C_transfer (i2c、&i2cTransaction)){
System_printf ("设备 ID:%x\n"、rxBuffer[0]);
} 否则{
System_printf ("设备 ID 失败!\n");
}

txBuffer[0]= 0x00 | 0b00000010;
TxBuffer[1]= 0x07;
i2cTransaction.slaveAddress = 0x52;
i2cTransaction.writeBuf = txBuffer;
i2cTransaction.writeCount = 2;
i2cTransaction.readBuf = rxBuffer;
i2cTransaction.ReadCount = 2;
if (I2C_transfer (i2c、&i2cTransaction)){
System_printf ("开机:%x %x\n"、rxBuffer[0]、rxBuffer[1]);
} 否则{
System_printf ("上电失败!\n");
}



/*采集20个样本并将其打印到控制台*/
对于(i = 0;i < 20;i++){
TxBuffer[0]= 0x0D;
i2cTransaction.slaveAddress = 0x52;
i2cTransaction.writeBuf = txBuffer;
i2cTransaction.writeCount = 1;
i2cTransaction.readBuf = rxBuffer;
i2cTransaction.ReadCount = 2;
if (I2C_transfer (i2c、&i2cTransaction)){

/*从接收到的数据中提取 C 度*/
Lux = rxBuffer[0];
Lux =(lux << 8)| rxBuffer[1];
Lux =(lux << 8)| rxBuffer[2];
Lux =(lux << 8)| rxBuffer[3];
System_printf ("Lux %u:0x%x 0x%x 0x%x 0x%x%x\n"、i、rxBuffer[0]、rxBuffer[1]、rxBuffer[2]、 rxBuffer[3]);
}
否则{
System_printf ("I2C 总线故障\n");
}

system_flush();
Task_sleep (1000000 / Clock_tickPeriod);
}

/*已取消初始化 I2C */
I2C_Close (i2c);
System_printf ("I2C 已关闭!\n"\});

system_flush();
}

从这一点开始、您能给我建议吗?

我已随附 referencee2e.ti.com/.../V02_2D00_4755EN_5F00_DS_5F00_APDS_2D00_9306_5F00_2016_2D00_10_2D00_21_2D00_1130983.pdf 的数据表

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我假设您只能按字节按 ALS_DATA_0、ALS_DATA_1和 ALS_DATA_2进行访问。 以下代码应将 ALS_DATA_0读取到 rxBuffer[0]中。 您可以以类似的方式将 ALS 数据_1和 ALS 数据_2读取到 rxBuffer[1]和 rxBuffer[2]中。

    TxBuffer[0]= 0x0D;
    i2cTransaction.slaveAddress = 0x52;
    i2cTransaction.writeBuf = txBuffer;
    i2cTransaction.writeCount = 1;
    i2cTransaction.readBuf =&rxBuffer[0];
    i2cTransaction.ReadCount = 1;
    I2C_transfer (i2c、&i2cTransaction);