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/CC1310:I2C 卡死问题

Guru**** 2551110 points


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

https://e2e.ti.com/support/wireless-connectivity/sub-1-ghz-group/sub-1-ghz/f/sub-1-ghz-forum/799605/rtos-cc1310-i2c-stuck-problem

器件型号:CC1310

工具/软件:TI-RTOS

您好,团队

我使用硬件 i2c 接口读取外部存储器。 在 i2c 任务中调用 I2C_transfer()不会导致问题,但一旦将其放置在主函数中,它就会卡住。 测试 i2ctmp007示例没有问题、这证明了电路板是正常的。 为了避免其他影响、我关闭了所有任务并在主函数中仅使用了 I2C、但它仍然卡住。 原因是什么?
/*
=== main ====
*/
int main (void)
{
/*调用驱动程序初始化函数。 *
Board_initGeneral();

/*构造要用作资源锁定的信标对象,初始计数1 */
Semaphore_Params ledsemParams;
Semaphore_Params_init (&ledsemParams);
Semaphore_construction (&ledsemStruct, 1,&ledsemParams);

/*获取实例句柄*/
ledsemHandle = Semaphore_handle (&ledsemStructe);

uint8_t txBuffer[2];
uint8_t rxBuffer[2]={0、0};
I2C_Handle I2C;
I2C_Params i2cParams;
I2C_Transaction i2cTransaction;

FM24V10_VDD_ON ();

GPIO_init();
I2C_init();

/*创建 I2C 以供使用*/
I2C_Params_init (&i2cParams);
i2cParams.bitrate = I2C_100kHz;
I2C = I2C_open (Board_I2C0、&i2cParams);
if (i2c == NULL){
while (1);
}

TxBuffer[0]= 0x00;
TxBuffer[1]= 0x00;

i2cTransaction.slaveAddress = 0x50;
i2cTransaction.writeBuf =(uint8_t*) txBuffer;
i2cTransaction.writeCount = 2;
i2cTransaction.readBuf =(uint8_t*) rxBuffer;
i2cTransaction.ReadCount = 2;

uint8_t 结果= I2C_transfer (i2c、&i2cTransaction);

/*初始化所有任务*/
//i2cTaskInit();
//rxTaskInit();
//uartTaskInit();

/*启动 BIOS */
BIOS_start();

返回(0);
} 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    BIOS_start();初始化驱动程序工作所需的时钟等,这意味着必须在任务中执行 I2C 操作。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、ter,

    我已经见过你很长时间了、你的答案就到了问题的关键。

    此问题源于参数初始化问题。 我有一个包含射频参数和 UART 参数的结构、例如唤醒周期、串行端口波特率、在相关硬件运行之前、我必须首先从外部存储器读取参数并通过 I2C 对其进行初始化。 在 main 函数中完成赋值是最先进的方法之一。

    我有三个任务:RF 任务(优先级1)、UART 任务(优先级2)和 I2C 任务(优先级3)。 它们之间的关系是、在 RF 任务和 UART 接收到协议命令后、它们需要发送一个事件来通知 I2C 任务进行读取和写入。

    实际上、我以前曾将参数的初始化放在 I2C 任务中。 原因是:由于 I2C 任务具有最高优先级、调度程序首先执行 I2C 任务函数、然后首先完成参数初始化操作。 此时、射频任务和 UART 任务尚未调度。 但是、系统的行为让我感到非常困惑。 它不像我预期的那样工作、因为 RF 和 UART 相关的参数全部为0、这意味着参数结构(初始值全部为0)在 I2C 任务中被正确分配。 但是、在 RF 和 UART 任务中可以看到、参数尚未分配。 原因是什么? 下面是我的简化代码逻辑。

    int main (void)
    {
    /*调用驱动程序初始化函数。 *
    Board_initGeneral();
    
    /*初始化所有任务*/
    i2cTaskInit();//priority = 3.
    rxTaskInit(); //priority = 1
    uartTaskInit();//priority = 2.
    
    /*启动 BIOS */
    BIOS_start();
    
    返回(0);
    }/*
    
    I2C 任务函数。 调度程序启动时 TI-RTOS 在任务上下文中执行。 */
    static void i2cTaskFunction (UArg0、UArg0 arg1)
    {
    if (PowerOn_Para_Init()!= true)
    Use_Default_parameter();
    
    while (1)
    {
    /*等待事件*/
    uint32_t 事件= Event_pend (NodeEventHandle、0、NODE_EVENT_ALL、BIOS_WAIT_FOREVE);
    }
    }
    
    静态空 rxTaskFunction (UARg arg0、UARg arg1)
    {
    RF_cmdPropRxSniff.address 0 = SetPara.panid;
    RF_cmdPropRxSnarg1。address1 = SetPara.ownaddress;
    RF_cmdPropRadioSetup.txPower = SetPara.txpower;
    
    while(1){...};
    
    
    
    {UARtask0}
    UART_INIT ();/*串口初始化*/
    
    /*创建一个数据处理关闭的 UART。 *
    UART_PARAMS_INIT (uartParams);
    uartParams.writeDataMode = UART_DATA_BINARY;
    uartParams.readDataMode = UART_DATA_BINARY;
    uartParams.readReturnMode = UART_return_full;
    uartParams.readEcho = UART_ECHO_OFF;
    uartParams.budrate = SetPara.budrate;
    
    而(1){...};
    } 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您是否曾尝试在代码的各个部分使用 ROV/将 Dios 设置为高电平来查看在其他部分之前完成代码的哪些部分?

    我已经阅读过您的帖子几次了、我仍然不确定正在发生什么。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我使用了标志位和 LED 灯。 测试结果是首先调度 UART 任务。 我的问题只是、我需要初始化第一个已调度任务(最高优先级任务)中其他两个外设任务的所有运行参数。 根据我的优先级设置、系统是否应该不首先调度 I2C 任务?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    不应像这样工作。

    您能否发布以下代码:

    /*初始化所有任务*/
    i2cTaskInit();//priority = 3.
    rxTaskInit(); //priority = 1
    uartTaskInit();//priority = 2.
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    只有在将阻塞代码添加到 UART 和 RF 任务时、系统才会工作。 虽然这可以解决问题、但这一明显而简单的问题确实让我非常生气。 我是否有办法找到原因?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    由于我没有您的代码、因此可以回答。 我至少可以获得我在上一个帖子中询问的代码吗?