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.

[参考译文] RTOS/TM4C1294NCPDT:TI RTOS 中的 I2C_TRANSFERT()函数

Guru**** 2350610 points
Other Parts Discussed in Thread: TMP006, TMP102
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/616489/rtos-tm4c1294ncpdt-i2c_transfer-function-in-ti-rtos

器件型号:TM4C1294NCPDT
Thread 中讨论的其他器件:SYSBIOSTMP102

工具/软件: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 传输之前、处理器会处理其他任务。 是这样吗? 如何解决?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    这只是代码的片段吗? 我看不到多个任务、而只看到一个 i2c 任务。 我看到您使用创建了一个任务 Task_construct(&task0Struct,(Task_FuncPtr) taskFxn、&taskParams、NULL)。 如果您有多个任务、则需要为每个任务调用 Task_construct.
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    此外、这两个任务都尝试打开相同的 I2C 实例(例如 i2c = I2C_open (Board_I2C_TMP、&i2cParams)。 您只能调用一次 open。 如果您需要让多个任务使用同一个句柄、则只能打开一次呼叫、然后让任务使用同一个句柄。

    Todd