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.

[参考译文] MSP430FR2475:有关 I2C 示例代码的问题

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1189513/msp430fr2475-questions-about-i2c-example-code

器件型号:MSP430FR2475

您好!  

我对 MSP430FRxxx 的 Resource Explorer 中的 I2C 驱动程序代码有一些问题。

在 I2C 驱动程序的 MSP430示例代码中、我找到了一个名为"CopyArray"的函数

```μ A

void CopyArray (uint8_t *、uint8_t *目标、uint8_t 计数)

  uint8_t copyIndex = 0

  对于(copyIndex = 0copyIndex < countcopyIndex++){

    dest[copyIndex]= source[copyIndex]

  

```μ A

这里的源缓冲器或目的缓冲器似乎没有什么特别的。  是否有任何理由在 memcpy 上使用 CopyArray、这样就允许用户直接将源缓冲区复制到目标缓冲区而不使用循环?

2.在 I2C ISR 中、有一些全局变量用于跟踪 Rx 和 Tx 计数、即`RXByteCtr` 和`TXByteCtr`。 这些全局变量 在 ISR 中和 ISR 外部都被修改。

在`I2C_Master_ReadReg`  函数中、在禁用 Rx 中断之前、这两个变量都被修改(RxByteCtr 设置为 count、TxByteCtr 设置为0):  

```μ A

  RXByteCtr =计数

  TXByteCtr = 0

  ReceiveIndex = 0

  TransmitIndex = 0

  /*初始化从地址和中断*/

  UCB1I2CSA = DEV_addr

  UCB1IFG &=~(UCTXIFG + UCRXIFG);   //清除任何挂起的中断

  UCB1IE &=~UCRXIE;           //禁用 RX 中断

```μ A

类似地、请在`I2C_Master_WriteReg`中进行选择。  这是否会导致 Rx/TxByteCtr 在置1后可能被修改的问题、因为在修改/读取 值之前中断未被禁用? 此外、不应在此 I2C 驱动程序文件中将这些变量声明为易失性和静态变量?  

此致、

Samyukta

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

    您好、Samyukta、

    您可以使用 memcpy 替换复制数组、实现只是为操作提供了透明度、但您需要包括 因此、这会增加一些轻微的存储器开销。

    关于正确的示例流程、在  禁用中断之前、可能会修改计数。 但这是控制器侧、因此器件决定目标何时发送数据、也就是说、您可能会获得一些杂散信号、从而导致字节计数器的值发生更改。 如果您希望阻止这种可能性、则禁用中断、然后设置字节计数器将是最佳方法。

    对于此实现、易失性和静态不会更改程序。 由于变量是全局声明的、因此它们在整个程序中保持作用域、因此不需要静态变量。 我认为编译器不会以任何方式接触这些变量、因此 volatile 不是必需的、但如果您添加 volatile 以实现一致性或防止这种可能性、它不会导致任何问题。

    此致、

    Luke