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.

[参考译文] MSP430FR2433:I2C 设置数据速率中可能存在 DriverLib 错误

Guru**** 2551150 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/790402/msp430fr2433-possible-driverlib-bug-in-i2c-set-data-rate

器件型号:MSP430FR2433
主题中讨论的其他器件:MSPWARE

在函数 EUSCI_B_I2C_initMaster ()中的 DriverLib eusci_b_i2c.c 中,此代码看起来是错误的,似乎与注释不匹配。

/*
*计算实现小于或的最快速度的时钟分频器
*等于所需速度。 分子被偏置以偏向较大的值
*时钟分频器、以便生成的时钟始终小于或等于
*连接到所需的时钟、永不大于任何值。
*
PreScalarValue =(uint16_t)(param->i2cClk / param->datarate);
HWREG16 (baseAddress + OFS_UCBxBRW)=预分段值;

除法是无符号的、而小数是截断的。 因此、预分频值(时钟分频器)小于所需的实际数据速率(频率)大于所需的值。

例如,对于 param->i2cClk of 1M 和 param->datarate of 400k (最大 I2C 数据速率),preScalarValue 为2 (2.5,比例截断)。
因此、实际数据速率将为500kbps、比所需速度快。

我看不到任何"偏置"分子的代码。

CCS 8.02和相当新版本的 MSPWare DriverLib

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

    您好、Lloyd、

    注释只是提醒我们时钟配置期间需要注意的事项、尽管除了源选择之外、只有一个用于分频设置的寄存器、就像 UG 说明一样、

    回到 I2C 的实际情况、您可以平衡时钟源频率设置(.i.e、SMCLK 的灵活频率设置)和预分频器设置、以便获得目标频率、希望这对您有所帮助。

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

    不、我仍然感到困惑。

    我的代码初始化 param->i2cClk= 1000000和 param->dataarate=EUSCI_B_I2C_SET_DATA_RATE _400KBPS。 我的目的是使 I2C 总线数据速率为400kHz 或更低、这是两个芯片(MSP430和从器件)支持的最大速率、而我的目的是比特率发生器的时钟源是1MHz 的 SMCLK。  在.h 中、EUSCI_B_I2C_SET_DATA_RATE 400KBPS 定义为400000。

    EUSCI_B_I2C_initMaster()中的代码似乎将 UCBxBRW 设置为2 (整数除法为1、000、000、000、000、000、000、000、000得到2、因为小数根据 C 语言被截断。)

    您可以引用“BITCLK 频率由 fBRCLK/UCBRx 给出。” 在本例中、fBRCLK 为1MHz、UCBRx 为2 (寄存器 UCBxBRW 的16位的另一个名称)。 这会产生500kHz 的 BITCLK 频率、这不是我的目的。

    由于 UCBRx 是偶数、因此引用的文本“生成的 SCL 的最小高电平和低电平周期为:Tlow、min = THIGH、min =(UCBRx/2)/fBRCLK”适用。 它还产生 Tlow、min 和 t大腿、min 均等于1/1,000,000。 但这也意味着频率(每秒的高脉冲数)为500kHz。 (您可以通过两种方式指定方波的频率、即每秒高脉冲数或每脉冲持续时间(以秒为单位)。 所引用的文本似乎冗余地指定了两种方式的数据速率。)

    我认为 DriverLib 实现掩盖或抽象了设置数据速率的一些复杂性。 我认为选择 EUSCI_B_I2C_SET_DATA_RATE 400KBPS 会产生400kbps、但根据您引用的内容、它会产生500kbps。

    此外,您还可以引用“在单主控模式中可以使用的最大位时钟是 fBRCLK/4。” 这似乎表明我的意图不受支持、即如果选择1MHz 的 SMCLK、eUSCI_B 将只在250kHz 下工作。 这似乎意味着可以将 UCBxBRW 设置为一个值、这样 eUSCI_B 就不起作用。 DriverLib 代码不能防止您这样做。 这很奇怪、因为我的代码似乎可以工作(500kbps 时?) 但我可以幸运吗? 我不知道测量的 I2C SCL 频率,因为我没有示波器。

    由于我不信任 DriverLib 代码,因此权变措施是自己设置 UCBxBRW。 值4、该值应产生250kbps 的数据速率。

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

    您好、Lloyd、

    有关最大和最小位时钟脉冲的描述用于在主器件和 slavers 之间发生同步时的场景参考。 对于频率设置、我们只需使用 fBRCLK/UCBRx 的公式。 您可以很容易地找到这样的 driverlib、

    变量 param 用于检查当前 SMCLK 频率并从宏 EUSCI_B_I2C_SET_DATA_RATE 400KBPS 获取目标频率、函 数 EUSCI_B_I2C_initMaster 用于完成配置、在此期间、预分频器值根据 SMCLK 和目标数据速率计算得出。

    因此、对于400bps 的情况、您可以将 SMCLK&UCBRx 的组合设置为2000000&5或4000000&10。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是的、如果我不使用 DriverLib 函数、而是直接写入 eUSCI_B 寄存器、则可以正确设置数据速率。

    或者、如果我读取 DriverLib 函数的实现、我将会传递它的"被套接"参数、正如您所说的:2、000和5、然后它将正确设置数据速率。

    但我想说的是、如果只读取 DriverLib 函数的 API 文档、则可能会被误导。

    在上面显示的代码中(如果 SMCLK 为1MHz),数据速率将为500kbps (根据我的数学计算,您不同意?)

    这与传递的值 EUSCI_B_I2C_SET_DATA_RATE 400KBPS 相矛盾。 程序员认为他们选择的是400kbps、但他们得到的是500kbps。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Lloyd、

    明白您的观点、我建议 driverlib 所有者在评论中添加必要的信息。 这应该在 I2C 位时钟配置期间告知源时钟频率设置。 非常感谢!