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.

[参考译文] MSP430FR5994:MSP430FR5994 I2C EEPROM

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1513963/msp430fr5994-msp430fr5994-i2c-eeprom

器件型号:MSP430FR5994
主题中讨论的其他部件: ENERGYTRACE

工具/软件:

尊敬的所有人:

当使用使用 EEPROM 存储器的 I2C 例程时、我遇到了以下情况。

MSP430FR5994上的 I2C 配置

////////////////////////////////////////////////////////////////////////////////
//         Definição da Porta P5 como Serial I2C das Memórias EEPROMS         //
////////////////////////////////////////////////////////////////////////////////
   P5OUT = 0;                                                                   // Reseta Todos os Pinos da Porta P5
   P5DIR = 0xFF;                                                                // Define Todos os Pinos da Porta P5 como Saídas
   P5OUT &=~ 0xFF;                                                              // Inicializa Todos os Pinos da Porta P5 com Nível Lógico "0" Baixo
   P5SEL0 |=  (SDA | SCL);     // P5.0 e P5.1 options select P5SEL0 = 0         // Seleciona o Pino da Porta P5.0 UCB1SDA e P5.1 UCB1SCL como Barramento I2C                                                   
   P5SEL1 &=~ (SDA | SCL);     // P5.0 e P5.1 options select P5SEL1 = 1         // Seleciona Módulo Secundário Conforme Tabela I/O Function Selection = 1 | 0
   // Configuração do Barramento I2C das Memórias EEPROMs
   UCB1CTLW0 |= UCSWRST + UCMST + UCMODE_3 + UCSYNC + UCSSEL__SMCLK;            // Enable SW reset, I2C Master, Modo i2c, synchronous mode
   UCB1BRW = 40;                                                                // fSCL = SMCLK = 16.000.000/40 = 400 kHz
   UCB1CTLW0 &=~ UCSWRST;                                                       // Clear SW reset, resume operation
   UCB1IE |= UCNACKIE + UCTXIE0 + UCRXIE0;                                      // Interrupts Enable

使用 eeprom_ackPolling()时、如下所示:

/*----------------------------------------------------------------------------*/
// Description:
//   Acknowledge Polling. The EEPROM will not acknowledge if a write cycle is
//   in progress. It can be used to determine when a write cycle is completed.
/*----------------------------------------------------------------------------*/

void EEPROM_AckPolling(void)
{                                                                               // finished all operations
   do
     {
        UCB1STATW = 0x00;                                                       // clear I2C interrupt flags
        UCB1CTLW0 |= UCTR;                                                      // I2CTRX=1 => Transmit Mode (R/W bit = 0)
        UCB1CTLW0 &= ~UCTXSTT;
        UCB1CTLW0 |= UCTXSTT;                                                   // start condition is generated
        while (UCB1CTLW0 & UCTXSTT)                                             // wait till I2CSTT bit was cleared
          {
             if (!(UCNACKIFG & UCB1STATW))                                      // Break out if ACK received
             break;
          }
        UCB1CTLW0 |= UCTXSTP;                                                   // stop condition is generated after
                                                                                // slave address was sent => I2C communication is started
        while (UCB1CTLW0 & UCTXSTP);                                            // wait till stop bit is reset
        Delay_TA3_ms(6);                                                        // Aguarda 6 milisegundo
     }
   while (UCNACKIFG & UCB1STATW);
}

我注意到、LPM3中的电流消耗几乎比以这种方式使用时高10倍(约640uA)、约67uA:

/*----------------------------------------------------------------------------*/
// Description:
//   Acknowledge Polling. The EEPROM will not acknowledge if a write cycle is
//   in progress. It can be used to determine when a write cycle is completed.
/*----------------------------------------------------------------------------*/

void EEPROM_AckPolling(void)
{
  Delay_TA3_ms(6);                                                             // Aguarda 6 milisegundo
}


在写入 EEPROM 存储器后、论坛上的任何人是否都遇到过电流消耗的这种差异?

此致、

Anderson Portela

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

    您(是否也)测量了 EEPROM 器件本身的消耗量? 我认为 EnergyTrace 测量通过 LaunchPad 上的3V3电源总线的所有器件。

    由于代码似乎等待 I2C 空闲、因此 EEPROM 内部编程周期主要发生在延迟函数期间。  表1-1中的24LC1025 (例如)数据表[MCHP Doc 21941E]提到它可以在编程时绘制5mA (最大值);我想这是一个峰值而不是一个常数、我从未测量过该曲线。

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

    如果 I2C 端口保持在 SDA 或 SCL 被拉至低电平的状态、您可能会看到这么大的电流。 具体取决于所使用的上拉电阻。

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

    24LC1025数据表中 ACK 轮询的图7.1显示的序列与此处使用的序列不同。

    此循环错误我:

            while (UCB1CTLW0 & UCTXSTT)                                             // wait till I2CSTT bit was cleared
              {
                 if (!(UCNACKIFG & UCB1STATW))                                      // Break out if ACK received
                 break;
              }

    流程图与 STT 清除时间的文本之间存在脱节。 粗体文本(32.2.5.2.1)显示:"UCTXSTT 标志在发送完整地址后立即清除。" 它还说,NACK 将清除 STT 和 STP。 该流程图意味着在收到 ACK 或 NACK 后清除 STT。 它不能同时存在,而第一个将是一个问题。

    在任何情况下、在清除 STT 之前检查 NACK 都是毫无意义的。

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

    LPM/唤醒模型巧妙、但非常简单。

    特别是、唤醒是匿名的;如果有多个唤醒源、LPM 代码负责确保获得正确的唤醒源。 通常、这是一个系统级操作、建议避免 在库函数中使用 LPM。 (请记住、SLAA208旨在用作示例代码。)

    一种可能的方法是完成标准、例如使用"while (!complete){LPM;}"的计时器毫秒计数器。 I2C 驱动程序需要执行类似的操作。

    我要提到的另一个伪迹是唤醒是异步的:在 main ()处于活动状态时发出的唤醒将丢失,从而导致竞争条件。 通常、这要求在 LPM 之前检查是否完成(严格要求:GIE=0)。

    对于更简单的设计、"后停"(例如毫秒级唤醒)(如某些 RTOS 中所示)将使事情变得至关重要。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    关于如何使用计时器生成必要延迟的任何建议

    不要那样使用计时器。

    由于有多个 ISR 可能导致退出低功耗模式、您不知道是计时器触发的。 代码只是假设它确实如此。 另外、在等待计时器的同时进入 LPM3没有任何好处。

    但我讨厌这样的东西: "虽然(UCB1STAT 和 UCBUSY);"所有这些等待循环都假设 I2C 事务将按预期进行。 如果没有、代码会滞留在其中一个循环中。 或连接到调试器上可接受的值。

    我更喜欢包含超时检查。

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

    您好:

    我还发现 I2C 上拉电阻器为10k。对于400kHz 的频率、正确的值为2k。已识别和更正!

    尊敬的 David Schultz:

    不要那样使用计时器。

    使用这些计时器作为延迟的任何不同方法? 您能帮助我实现您的应用创意吗? 一个示例、以便我更好地理解?

    另外、在等待计时器的同时进入 LPM3没有任何好处。

    我必须进入 LPM3以产生延迟、并在退出 LPM3并关闭后等待一会儿、例如脉冲式螺线管。 示例:

    如果(Low_Control == 1)//如果是低压控制?

    Porta_P8OUT || G2012_S32;
    DELAY_TA4_ms (10);
    Porta_P8OUT &=~ G2012_S32;
    }
    暴露

    如果(High_Control == 1)//如果是高压控制?

    Porta_P8OUT || G2012_S31;
    DELAY_TA4_ms (10);
    Porta_P8OUT &=~ G2012_S31;
    }
    }

    此致、

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

    不可以。 由于您实际上只是等待计时器设置其中断标志、而在等待期间不执行任何操作、因此只需等待中断标志会更简单。 当然要小心、不要启用该中断。

    但仍然是一种避免__delay_cycles ()的复杂方法。