Thread 中讨论的其他器件:SYSBIOS、 TMP102
工具/软件:TI-RTOS
您好!
/*下面是我的示例代码*/
/* XDCtools 头文件*/
#include
#include
/* BIOS 头文件*/
#include
#include
/* TI-RTOS 头文件*/
#include
#include
/*示例/板头文件*/
#include "Board.h"
#define TASKSTACKSIZE 640
Task_Structtask0Struct;
char task0stack[TASKSTACKSIZE];
Task_Structtask1Struct;
char task1stack[TASKSTACKSIZE];
/*
* ==== taskFxn ====
* 此函数的任务是静态创建的。 请参阅工程的.cfg 文件。
*
void i2cfunc()
{
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 (Board_I2C_TMP、&i2cParams);
if (i2c == NULL){
System_abort ("初始化 I2C\n 时出错");
}
否则{
system_printf ("I2C 已初始化!\n"\});
}
/*指向 T 环境寄存器并读取其2个字节*/
TxBuffer[0]= 0x01;
i2cTransaction.slaveAddress = Board_TMP006_ADDR;
i2cTransaction.writeBuf = txBuffer;
i2cTransaction.writeCount = 1;
i2cTransaction.readBuf = rxBuffer;
i2cTransaction.ReadCount = 2;
/*采集20个样本并将其打印到控制台*/
对于(i = 0;i < 20;i++){
if (I2C_transfer (i2c、&i2cTransaction)){
/*从接收到的数据中提取°C;请参阅 TMP102数据表*/
温度=(rxBuffer[0]<< 6)|(rxBuffer[1]>> 2);
/*
*如果 MSB 设置为"1"、则我们有二进制补码
*需要符号扩展的负值
*
if (rxBuffer[0]& 0x80){
温度|= 0xF000;
}
/*
*为简单起见、将温度值除以32即可摆脱
*十进制精度;请参阅 TI 的 TMP006数据表
*
温度/= 32;
System_printf ("样本%u:%d (C)\n"、i、温度);
}
否则{
System_printf ("I2C 总线故障\n");
}
system_flush();
Task_sleep (1000);
}
/*已取消初始化 I2C */
I2C_Close (i2c);
System_printf ("I2C 已关闭!\n"\});
system_flush();
}
空 taskFxn (UARg arg0、UARg arg1)
{
i2cfunc();
}
/*
* ==== main ====
*
int main (空)
{
Task_Params taskParams;
Task_Params task1Params;
/*呼叫板初始化函数*/
Board_initGeneral();
Board_initGPIO();
Board_initI2C();
/*构造 tmp006任务线程*/
Task_Params_init (&taskParams);
taskParams.STACKSIZE = TASKSTACKSIZE;
taskParams.stack =_task0Stack;
Task_construct(&task0Struct,(Task_FuncPtr) taskFxn、&taskParams、NULL);
/*打开用户 LED */
GPIO_WRITE (Board_LED0、Board_LED_ON);
system_printf ("启动 I2C 示例\n 系统提供程序设置为 SysMin。"
"停止目标以查看 ROV 中的任何 SysMin 内容。\n");
/* SysMin 仅在您调用 flush 或 exit 时才会打印到控制台*/
system_flush();
/*启动 BIOS */
BIOS_start();
返回(0);
}
该程序在单个任务中工作正常、但如果我使用多个任务、I2C 传输函数将无法工作。
问题:
1.为什么(I2C_transfer (i2c、&i2cTransaction))可以很好地处理单个任务而不是处理多个任务?
2.我应该怎么做才能完成 I2C_transfer 调用的传输。
3.我增加了任务的堆栈大小和任务的优先级。 在这两种情况下、I2C 传输都没有完成。
在进行 I2C 传输之前、处理器会处理其他任务。 是这样吗? 如何解决?