请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号:CC2650 主题中讨论的其他器件: OPT3001、 TMP112
工具/软件:TI-RTOS
我正在使用定制的 CC2650MODA 板。 从一个空示例开始、我让 LED 闪烁正常工作。 然后、我为使用 OPT3001传感器进行 I2C 通信添加了另一项任务。 这两项任务都很顺利。 但是、当我添加另一个 I2C 任务来读取 TMP112传感器时、由于错误、我无法编译我的代码。 当我对 OPT3001任务进行注释时、我可以使 TMP112正常工作。 我提到了这 篇文章 ,说我们无法在同一个外设上执行多个 I2C_open()而不先将其关闭。 在我的代码中尝试了几个变体后、我仍然无法使其正常工作。
我知道 Sensortag 示例代码可以轻松缓解这一问题、因为即使它们在同一个 I2C 外设上有许多 I2C 传感器。 但问题是 sensortag 代码具有如此多的文件和代码、我无法弄清楚它们如何解决我遇到的这个问题。
如果只有 I2C 任务处于活动状态、您能建议如何编辑我编写的以下代码。 如何定义和声明 I2C 函数和参数/句柄,以便即使在对不同传感器使用不同的任务时也能编译 I2C 函数和参数/句柄?
/* XDCtools 头文件*/
#include
#include
/* BIOS 头文件*/
#include
#include
#include
/* TI-RTOS 头文件*/
#include
#include
/*板头文件*/
#include "Board.h"
#include
#define TASKSTACKSIZE 512
Task_StructTask0Struct;
Char task0Stack[TASKSTACKSIZE];
Task_Structtask1Struct;
Char task1Stack[TASKSTACKSIZE];
Task_Structtask2Struct;
char task2stack[TASKSTACKSIZE];
//引脚驱动器句柄*/
静态 PIN_Handle ledPinHandle;
静态 PIN_STATE ledPinState;
//
*应用 LED 引脚配置表:
*-所有 LED 板 LED 均关闭。
*/
PIN_Config ledPinTable[]={
ioID_9 | PIN_GPIO_OUTP_EN | PIN_GPIO_LOW | PIN_PushPull | PIN_DRVSTR_MED、//LED
ioID_4 | PIN_GPIO_OUTP_EN | PIN_GPIO_HIGH | PIN_PushPull | PIN_DRVSTR_MAX、//OPT3001
ioID_3 | PIN_GPIO_OUTP_EN | PIN_GPIO_HIGH | PIN_PushPull | PIN_DRVSTR_MAX、//TMP112
PIN_TERMINATE
};
/*
=== 心跳 Fxn ====
*切换 Board_LED0。 Task_sleep 由 arg0确定、而 arg0
*是为心跳任务实例配置的。
*/
void Heart Beat(){
PIN_setOutputValue (ledPinHandle、IOID_9、!PIN_getOutputValue (IOID_9));
Task_sleep (500000/Clock_tickPeriod);
PIN_setOutputValue (ledPinHandle、IOID_9、!PIN_getOutputValue (IOID_9));
Task_sleep (500000/Clock_tickPeriod);
}
void BEBeatFxn (UArg0、UArgarg1)
{
while (1){
Heart Beat();
}
}
void opt300xfxn(){
I2C_Handle opthandle;
I2C_Params optparams;
I2C_Params_init (&optparams);
optparams.transferMode = I2C_MODE_BLOCKING;
optparams.bitrate = I2C_400kHz;
opthandle = I2C_open (Board_I2C0、&optparams);
if (opthandle == NULL){
System_abort ("初始化 I2C"时出错);
}否则{
system_printf ("I2C 已初始化\n");
}
I2C_Transaction 操作事务;
uint16_t lux;
uint8_t txbuf[4];
uint8_t rxbuf[4];
opttransaction.slaveAddress = 0x44;
while (1){//在进行单次通信时执行此操作。 因为配置寄存器在一次转换后复位为00 (关断)。 每次需要进行读取时、都必须写入 config。
txbuf[0]= 0x01;
Txbuf[1]= 0xCA;//c4 = 100ms 连续、CC = 800ms 连续、C2 = 100ms 单序列、CA = 800ms 单序列热
txbuf[2]= 0x10;
opttransaction.writeBuf = txbuf;
opttransaction.readBuf = rxbuf;
opttransaction.writeCount = 3;
opttransaction.ReadCount = 0;
if (I2C_transfer (opthandle、&opttransaction)){
System_printf ("Config write!\n");
} 否则{
System_printf ("配置写入失败!\n");
}
opttransaction.writeBuf = txbuf;
opttransaction.readBuf = rxbuf;
opttransaction.writeCount = 1;
opttransaction.ReadCount = 2;
txbuf[0]= 0x00;
uint8_t i = 0;
//对于(i = 0;i<100;i++){//在连续转换模式下执行此操作。
if (I2C_transfer (opthandle、&opttransaction)){
uint8_t e、m;
float v;
Lux = rxbuf[0];
Lux =(lux<<8)|rxbuf[1];
M = lux 和0x0FFF;
System_printf ("m =%d\n"、m);
e =(lux 和0xF000)>>12;
System_printf ("e =%d\n"、e);
v =(浮点) m*(0.01 * exp2 (e));
System_printf ("Lux:%d\n"v);
}
I2C_Close (opthandle);
system_flush();
Task_sleep (2000000/Clock_tickPeriod);
}
I2C_Close (opthandle);
System_printf ("I2C closed\n");
system_flush();
}
void tempfxn(){
I2C_Handle tmphandle;
I2C_Params tmpparams;
I2C_Params_init (&tmpparams);
tmpparams.transferMode = I2C_MODE_BLOCKING;
tmpparams.bitrate = I2C_400kHz;
tmphandle = I2C_open (Board_I2C0、&tmpparams);
if (tmphandle == NULL){
System_abort ("初始化 I2C"时出错);
}否则{
system_printf ("I2C 已初始化\n");
}
I2C_Transaction tmptransaction;
uint16_t temp;
uint8_t txbuf[4];
uint8_t rxbuf[4];
tmptransaction.slaveAddress = 0x48;
while (1){
txbuf[0]= 0x01;
txbuf[1]= 0xE1;
txbuf[2]= 0x80;
tmptransaction.writeBuf = txbuf;
tmptransaction.readBuf = rxbuf;
tmptransaction.writeCount = 3;
tmptransaction.ReadCount = 0;
if (I2C_transfer (tmphandle、&tmmptransaction)){
System_printf ("Config write!\n");
} 否则{
System_printf ("配置写入失败!\n");
}
tmptransaction.writeBuf = txbuf;
tmptransaction.readBuf = rxbuf;
tmptransaction.writeCount = 1;
tmptransaction.ReadCount = 2;
txbuf[0]= 0x00;
if (I2C_transfer (tmphandle、&tmmptransaction)){
temp = rxbuf[0];
temp =(temp<<<8)|rxbuf[1];
temp = temp>>>4;//& 0xFFF0;
System_printf ("Temp * C =%d\n"、temp/16);
}
system_flush();
Task_sleep (2000000/Clock_tickPeriod);
}
I2C_Close (tmphandle);
System_printf ("I2C closed\n");
system_flush();
}
int main (void)
{
Task_Params taskParams;
Task_Params optparams;
Task_Params tmpparams;
/*呼叫板初始化函数*/
Board_initGeneral();
Board_initI2C();
/*构造心跳任务线程*/
Task_Params_init (&taskParams);
taskParams.arg0 = 1000000 / Clock_tickPeriod;
taskParams.STACKSIZE = TASKSTACKSIZE;
taskParams.stack =_task0Stack;
Task_construct(&task0Struct,(Task_FuncPtr)心跳 BeatFxn、&taskParams、NULL);
//Task_Params_init (&optparams);
//optparams.STACKSIZE = TASKSTACKSIZE;
//optparams.stack =&task1Stack;
//Task_construct(&task1Struct,(Task_FuncPtr) opt300xfxn、&optparams、NULL);
Task_Params_init (&tmpparams);
optparams.STACKSIZE = TASKSTACKSIZE;
optparams.stack =&task2Stack;
Task_constructure(&task2Struct,(Task_Functr)tempfxn,&tmpparams,NULL );
/*打开 LED 引脚*/
ledPinHandle = PIN_OPEN (&ledPinState、ledPinTable);
if (!ledPinHandle){
System_abort ("初始化板 LED 引脚时出错");
}
BIOS_start();
返回(0);
}