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.

[参考译文] TMS320F28388D:控制 FIFO 接收的每个字节

Guru**** 2524550 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1242880/tms320f28388d-control-each-byte-received-by-fifo

器件型号:TMS320F28388D

为了实现与程序的兼容性、我需要先处理从 I2C EEPROM 接收到的每个字节、然后再保存它们。  我无法保存它们并稍后进行处理。

我已经研究了 EEPROM 轮询示例并 找到了 以下接收器函数:

uint16_t I2C_ControllerReceiver(struct I2CHandle *I2C_Params)
{
    uint16_t status;
    uint16_t attemptCount;

    uint32_t base = I2C_Params->base;

    I2C_disableFIFO(base);
    I2C_enableFIFO(base);

    status = I2C_TransmittargetAddress_ControlBytes(I2C_Params);

    if(status)
    {
        return status;
    }

    uint16_t numofSixteenByte  = (I2C_Params->NumOfDataBytes) / I2C_FIFO_LEVEL;
    uint16_t remainingBytes    = (I2C_Params->NumOfDataBytes) % I2C_FIFO_LEVEL;

    I2C_setConfig(base, (I2C_CONTROLLER_RECEIVE_MODE|I2C_REPEAT_MODE));

    I2C_sendStartCondition(base);

    uint16_t i,count = 0,buff_pos=0;
    while(count < numofSixteenByte)
    {
        status = handleNACK(base);
        if(status)
        {
          return status;
        }

        count++;

        attemptCount = 1;
        while(!(I2C_getRxFIFOStatus(base) == I2C_FIFO_RXFULL) && attemptCount <= 9 * (I2C_FIFO_RXFULL + 2U))
        {
            DEVICE_DELAY_US(I2C_Params->Delay_us);
            attemptCount++;
        }

        for(i=0; i<I2C_FIFO_LEVEL; i++)
        {
            I2C_Params->pRX_MsgBuffer[buff_pos++] = I2C_getData(base);
        }
    }

    attemptCount = 1;
    while(!(I2C_getRxFIFOStatus(base) == remainingBytes) && attemptCount <= 9 * (remainingBytes + 2U))
    {
       DEVICE_DELAY_US(I2C_Params->Delay_us);
       attemptCount++;
    }

    I2C_sendStopCondition(base);

    for(i=0; i<remainingBytes; i++)
    {
        I2C_Params->pRX_MsgBuffer[buff_pos++] = I2C_getData(base);
    }

    status = handleNACK(base);
    if(status)
    {
      return status;
    }

    I2C_disableFIFO(base);

    attemptCount = 1;
    while(I2C_getStopConditionStatus(base) && attemptCount <= 3U);
    {
        DEVICE_DELAY_US(I2C_Params->Delay_us);
        attemptCount++;
    }

    return SUCCESS;

}

运行得很好、唯一的问题是它会继续询问字节、直到达到 stopCondition、并且几乎总是如此、我从这个函数中得到的字节比要求的字节数多1个。

我想问的是、我是否可以设置我要接收的字节量、并确保遵守这一点。

可表示为:

I2C_setConfig (base、(I2C_CONTROL_RECEIVE_MODE));

I2C_setDataCount (base、nRxBytes);

但无法正常工作。

我要问的另一个问题是 、我是否可以决定何时接收下一个字节。 为了说明、我需要获取1个字节、对其进行处理、然后获取另一个字节等。

我不需要任何中断或特殊的东西。 轮询每个 Rx 字节。

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

    您好!  

    控制器可以发送启动条件、然后在使用 I2C_getData API 执行读取之前轮询 RRDY 标志、然后发送停止条件。

     我想如果您一次发送1个字节、那么您无需使用 FIFO。

    此致

    西达尔特

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

    您好!

    我的问题是不发送一个或多个字节。

    实际上、我想要:

    1.设置接收模式以 接收比发送 stopCondition 多 n 个预设字节。 在这方面、我的实际问题是 I2C_setDataCount 被接收函数阻止。 这意味着主器件发送 DevAdd (W)+ Address、但从不发送 DevAdd (R)、因此不会接收 任何内容。

    接收 n 个字节并在接收到的 字节之间执行操作、因此我读取一个字节->执行操作->要求另一个字节 ECC。

    这不奏效:

        //I2C_enableFIFO(I2CA_BASE);
        I2C_setTargetAddress(I2CA_BASE, 0x50);
        I2C_setDataCount(I2CA_BASE, 2);
        I2C_putData(I2CA_BASE, 0x00);
        I2C_putData(I2CA_BASE, 0x00);
        I2C_setConfig(I2CA_BASE, I2C_CONTROLLER_SEND_MODE);
        I2C_sendStartCondition(I2CA_BASE);
        I2C_setConfig(I2CA_BASE, I2C_CONTROLLER_RECEIVE_MODE);
        I2C_setDataCount(I2CA_BASE, 2);
        I2C_sendStartCondition(I2CA_BASE);
        //I2C_getData(I2CA_BASE);
        //I2C_getData(I2CA_BASE);
        I2C_sendStopCondition(I2CA_BASE);
    

    I when I send Start Condition on I2C_CONTROLLER_RECEIVE_MODE doesn't receive nothing.

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

    您好!  

    在目标端、 是否收到 I2C_putData 发送的数据?  

    在控制器侧、而不是 I2C_setDataCount、 是否可以轮询 RRDY 标志以检查它是否接收任何数据?

    此致

    西达尔特

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

    您好!

    我发现打包的函数不允许以显式方式控制外设、因此我直接切换到了寄存器。 实际上 I2C 配置是相当工作,但我有一个奇怪的行为. 我已打开此主题:

    https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1243800/tms320f28388d-i2c-in-free-data-format-mode-sends-address-anyway

    您能否将支持切换到它并关闭它?

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

    您好!  

    正在关闭本主题帖。 另一个已分配给专家。

    此致

    西达尔特