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.

[参考译文] MSP430F1611:I2C 时钟选择问题

Guru**** 2390755 points
Other Parts Discussed in Thread: MSP430F1611

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/770630/msp430f1611-i2c-clock-select-issue

器件型号:MSP430F1611

大家好、

我实际上有点困惑。 我尝试在 I2C 主模式下与连接的器件通信。 由于某些测试方案、它未连接。

我使用以下代码:

#include <__cross_studio_io.h>
#include 

//------------------------------------------------------------
//变量

int delay_counter = 0;

//------------------------------------------
//主函数

void main (void){

// OSC
WDTCTL = WDT_ADLY_1000; //看门狗计时器1000ms
//IE1 = WDTIE; //启用看门狗中断
BCSCTL1 &=~XT2OFF; //启用振荡器
执行{ //外部时钟的延迟
IFG1 &=~OFIFG;
对于(DELAY_COUNTER = 0xFF;DELAY_COUNTER > 0;DELAY_COUNTER--);
}while (((IFG1 & OFIFG)!= 0);
BCSCTL2 = SELM_2 + SELS; //外部时钟(8MHz)

//端口
// USART0 (I2C)
P3SEL |=(BIT1 + BIT3); //外设选择

// I2C LEVELSHIFTER
P4SEL &=~BIT1; // I/O 选择
P4DIR |= BIT1; // P4.1 I2C-LEVELSHIFTER 作为输出

// USART 0
U0CTL |= SWRST; //初始化 USART0状态机
U0CTL |= I2C + SYNC; USART0
U0CTL 上的// I2C 模式&=~I2CEN; //禁用 I2C

// I2C
I2CTCTL = I2CSSEL_1; // ACLK 时钟
I2CPSC = 0x00; //时钟预密封器/1
I2CSCLH = 0x0A; //移位时钟高电平
I2CSCLL = 0x0A; //移位时钟低电平

//预期:
// ACLK = 32kHz
// PRESCALED,其中/1 => 32kHz
//高电平= 5 x (I2CPSC + 1)= 5
//低电平= 5 x (I2CPSC + 1)= 5
//完整周期:10 => 3.2kHz

//测量值:250kHz

I2CNDAT = 0; //初始化零字节
U0CTL |= I2CEN; //启用 I2C
U0CTL |= MST; // MSP 的主模式

I2CIE |= TXRDYIE + ARDYIE; //中断使能

P4OUT |= BIT1; //默认情况下启用 I2C 电平转换器

// I2C 写入
while (I2CDCTL & I2CBB);
I2CSA = 0x1A; //从器件地址
I2CNDAT = 0x01; //保存数据长度

U0CTL |= MST; //启用主控模式
I2CTCTL |= I2CTRx; //发送模式
I2CTCTL |= I2CSTT + I2CSTP; //起始条件和停止条件

while (1){};

}

void I2C_ISR (void)__interrupt[USART0TX_vector]{

switch (I2CIV){
案例8: //访问就绪中断
中断;
情况12: //发送就绪中断
I2CDRB = 0xAA;
中断;
默认值:
中断;
}

我将在电路板上使用两个不同的振荡器。 一个在 X2IN (MCLK 和 SMCLK)上具有8MHz 频率、在 XIN (ACLK)上具有32.768Hz 振荡器。

我使用 I2CSSELx 选择的时钟源似乎无关紧要、结果始终保持不变。 I2C 总线上的第一个数据(器件地址)的时钟频率为250kHz。

是否有人可以确认这种行为、并告诉我如何更改它以便与较慢的时钟一起使用?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    P.S.:在 while 循环之前添加"_bis_SR_register (LPM0_bits + GIE);"可以解决奇怪的行为。 也可以将断点设置为 while (1)。 当 FET 调试器停止第69行上的代码执行时、从器件地址已随正确使用的 ACLK 一起发送。 如果没有断点、它不使用 ACLK。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Steven、

    无法从32KHz ACLK 获取250kHz I2C 时钟、因此我在这里怀疑很奇怪。
    我首先尝试临时重新配置 P5.4、P5.5和 P5.6 (64引脚封装)、以便您可以在这些引脚上输出 MCLK、SMCLK 和 ACLK、并验证时钟频率是否正确。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、再说一次、

    感谢 Dennis Lehman 的回答。 我现在已经完成了。 所有三个时钟都正常运行。

    连接了 ACLK (P5.6)的输出、在选择了 ACLK (IC2SSEL_1)的情况下首次 SCL 输出时触发:

    缩小:

    相比之下、如果添加断点@ while (1):

    这是正确的 bahavior。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    有趣。 在没有任何调试器连接到系统的情况下发生的任何情况。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    这与 wihtout 任何断点相同。

    谢谢!

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

    在该器件上、ACLK 由外部32kHz 时钟供源、该时钟可能具有很长的启动时间、具体取决于电路中的晶体和电容。 与 MCLK 和 SMCLK 相比、我很好奇 ACLK 何时开始运行。 连接调试器后、MSP 在您到达断点之前就已经上电、因此32kHz 振荡器有足够的时间来加快速度。

    如果未连接调试器、您能否在监控 MCLK 和 ACLK 时执行另一次示波器触发?
    我想了解 ACLK 开始生成时钟信号所需的时间。
    您必须循环通电、而不仅仅是重置器件。
    请告诉我您看到的内容。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    我修改了我的代码、以便 I2C 数据通过看门狗计时器中断发送、每个中断为1000ms。

    首次发送数据时、如下所示:

    您可以看到 SCL 为黄色、ACLK 为蓝色、MCLK 为紫色。 这两个时钟在很长一段时间内都正常运行。 已测试、未连接任何调试器。

    新代码:

    #include <__cross_studio_io.h>
    #include 
    
    //------------------------------------------------------------
    //变量
    
    int delay_counter = 0;
    
    //------------------------------------------
    //主函数
    
    void main (void){
    
    //看门狗
    WDTCTL = WDT_ADLY_1000; //看门狗定时器1000ms
    IE1 = WDTIE; //启用看门狗中断
    
    // OSC
    BCSCTL1 &=~XT2OFF; //启用振荡器
    执行{ //外部时钟的延迟
    IFG1 &=~OFIFG;
    对于(DELAY_COUNTER = 0xFF;DELAY_COUNTER > 0;DELAY_COUNTER--);
    }while (((IFG1 & OFIFG)!= 0);
    BCSCTL2 = SELM_2 + SELS; //外部时钟(8MHz)
    
    // USART0 (I2C)端口
    P3SEL |=(BIT1 + BIT3); //外设选择
    P5SEL |=(BIT4 + BIT4 + BIT6);
    P5DIR |=(BIT4 + BIT5 + BIT6);
    
    // MCLK 和 ACLK 输出
    P5SEL |=(BIT4 + BIT6);
    P5DIR |=(BIT4 + BIT6);
    
    // I2C LEVELSHIFTER
    P4SEL &=~BIT1; // I/O 选择
    P4DIR |= BIT1; // P4.1 I2C-LEVELSHIFTER 作为输出
    P4OUT |= BIT1; //默认情况下启用 I2C 电平转换器
    
    // USART0
    U0CTL |= SWRST; //初始化 USART0状态机
    U0CTL |= I2C + SYNC; USART0
    U0CTL 上的// I2C 模式&=~I2CEN; //禁用 I2C
    
    // I2C
    I2CTCTL = I2CSSEL_1; // ACLK 时钟
    I2CPSC = 0x00; //时钟预密封器/1
    I2CSCLH = 0x00; //移位时钟高电平
    I2CSCLL = 0x00; //移位时钟低电平
    
    U0CTL |= I2CEN; //启用 I2C
    U0CTL |= MST; // MSP 的主模式
    
    I2CIE |= TXRDYIE + ARDYIE; //中断使能
    
    _BIS_SR (GIE); //启用所有中断
    
    while (1){_NOP ();};
    
    }
    
    void watchdog_timer (void)_interrupt[WDT_vector]{
    
    // I2C 写入
    while (I2CDCTL & I2CBB);
    I2CSA = 0x1A; //从器件地址
    I2CNDAT = 0x01; //保存数据长度
    
    U0CTL |= MST; //启用主控模式
    I2CTCTL |= I2CTRx; //发送模式
    I2CTCTL |= I2CSTT + I2CSTP; //起始条件和停止条件
    
    }
    
    void I2C_ISR (void)__interrupt[USART0TX_vector]{
    
    switch (I2CIV){
    案例8: //访问就绪中断
    中断;
    情况12: //发送就绪中断
    I2CDRB = 0xAA;
    中断;
    默认值:
    中断;
    }
    
    
    

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

    好的,你已经正式把我骗了:(
    根据您最新的代码和波形、在我看来 ACLK 不是 I2C 模块的源。
    因此、这将使 SMCLK 成为可疑器件。

    因此、对于 MCLK 和 SMCLK、XT2上的频率为8MHz。
    I2PSC 分频器= 1
    I2CSCLH = 0
    I2CSCLL = 0

    (根据用户指南)
    I2CSCLH = 5 x (I2CPSC + 1)= 10
    I2CSCLL = 5 x (I2CPSC + 1)= 10

    这意味着您的总 I2C 时钟周期为20。
    假设 SMCLK 以8MHz 的频率驱动 I2C、然后8000000/20 = 400kHz、当我回顾您最初的示波器捕获时、似乎 SCL 的运行频率@ 400kHz。

    那么、您能否在 I2C 配置完毕后的某个位置设置一个断点、并验证 I2CTCTL 寄存器的位5 = 0、位4 = 1 (选择 ACLK)。
    在您这么做的同时、我将了解能否从支持该系列器件的工程师中获得一些帮助。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Dennis、

    [引用 user="Dennis Lehman">您在 XT2上有8MHz MCLK 和 SMCLK。
    I2PSC 分频器= 1
    I2CSCLH = 0
    I2CSCLL = 0

    (根据用户指南)
    I2CSCLH = 5 x (I2CPSC + 1)= 10
    I2CSCLL = 5 x (I2CPSC + 1)= 10

    这意味着您的 I2C 总时钟周期为20。[/quot]

    我不知道这是不是正确的。 当 I2PSC = 1时、这意味着寄存器设置为0x00 (/1个分频器)。 不应该将其计算为总周期10而不是20?

    当我使用 SMCLK 为 SCL 计时时、上面提到的计算似乎是正确的、除了几个时钟周期过长。 但我认为这是勘误表 I2C14的行为。

    MSP430F16111勘误表修订版 G: www.ti.com/.../slaz146g.pdf

    [引用 USER="Dennis Lehman">您能否在 I2C 配置完毕后的某个位置设置断点、并验证 I2CTCTL 寄存器的位5 = 0、位4 = 1 (选择 ACLK)。
    在您这么做的同时、我将了解能否从支持该系列器件的工程师中获得一些帮助。

    我已经使用一个断点验证了 I2CTCTL 是否已正确配置为使用 ACKL。

    损坏的硬件可能会被排除、我已经使用了另外2个控制器(相同的器件型号)进行了尝试。

    感谢您的帮助!

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

    您好 Steven、

    关于时钟周期、我从 系列用户指南第5-26页了解到、I2CSCLL 将 SCL 时钟的周期设置为低电平、I2CSCLH 将 SCL 时钟的周期设置为高电平。  它们共同决定了 SCL 时钟频率的总周期。

    让我澄清我之前的观点(I2CPSC 分频器= 1)、我 试图将其表达为 I2CPSC ='000'。

    因此,在原始时钟设置中 ,I2CPSC ='000' 会导致 I2CIN 时钟=8MHz  。     然后 I2CSCLL 和 I2CSCLH 设为10、使20 (1/8MHz)时钟= 400kHz。

    我仍在努力从我们成熟的 MCU 团队获得答案。

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

    您好 Dennis、

    根据家庭指南:

    假设 I2CPSC 为000h、公式会得出:5 x (0 + 1)= 5、这会使低相位和高相位共同变为10、或者我错了吗?

    谢谢!

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

    您好 Steven、

    如果您看15.2.6节、就会发现 I2CSCLH 和 I2CSCLL 决定 SCL 时钟信号频率。

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

    您好 Dennis、

    是的、将 I2CPSC 设置为002h 时、会产生一个带有 I2CIN / 3的 SCL (请参阅您的注释示例)。

    将 I2CPSC 设置为000h 会导致 SCL 为 I2CIN / 10、而不是20。

    我认为以下设置适用于该示例:

    I2CPSC = 002h
    I2CSCLH = 000h => 5 x
    I2CSCLL = 000h => 5 x

    计算:I2CCLK =[(I2CPSC + 1) x (I2CSCLH + 2)]+[(I2CPSC + 1) x (I2CSCLL + 2)]=[(2 + 1) x (5)]+[(2 + 1) x (5)]= 30

    对于/1的分频器:

    I2CPSC = 000h
    I2CSCLH = 000h => 5 x
    I2CSCLL = 000h => 5 x

    计算:I2CCLK =[(I2CPSC + 1) x (I2CSCLH + 2)]+[(I2CPSC + 1) x (I2CSCLL + 2)]=[(0 + 1) x (5)]+[(0 + 1) x (5)]= 10

    但这并不重要,除非选择了正确的时钟:-)

    谢谢!

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

    是的、您回答正确。 很抱歉、这张视频有混淆。 我现在有一个设置、可以运行您的代码。 借助8MHz MCLK、SMCLK 和32kHz ACLK 以及您最新代码中的设置、当我选择 ACLK (I2CSSEL_1)时、我会看到 SCL = 3.3Khz、这大约是10分频。 当我使用 I2CSSEL_2和 I2CSSEL_3 (SMCLK)时、我的 SCL 为625KHz、不接近于8MHz SMCLK 的预期800kHz。 请给我更多时间来跟踪该器件的一些帮助、我将返回并回答您的问题。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Dennis:

    [引用 user="Dennis Lehman"]当我使用 I2CSSEL_2和 I2CSSEL_3 (SMCLK)时、我的 SCL 为625KHz、不接近于8MHz SMCLK 预期的800kHz

    请勿忘记 I2C14勘误表。 这种行为是可能的、因为在使用频率超过1MHz 的主时钟时、I2CSCLL 和 I2CSCLH 的某些周期过长。

    谢谢!

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

    您好 Steven、

    已确认-此问题在勘误表中为 I2C14。

    我按如下方式进行了测试:

    I2CPSC  DIV   测得的  预期频率

    0x07      8.         10万            10万

    0x06      7.         114K            114K

    0x05      6.         133K            133K

    0x04      5.         160K            160K

    0x03      4.         20万                      200万

    0x02      3.         268K            267K

    0x01      2.         362K            400k (差)

    0x00      1         609K            800k (坏)

    因此、根据勘误表、选择一个分频器、使 I2CIN 为1MHz 或更低。

    这是否适合您?  您尝试实现的 I2CIN 频率是多少?

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

    尊敬的 Dennis:

    我认为、对于大多数应用而言、100kHz SCL 是好的。

    但这不是这里的主要问题。 主要问题是、在没有断点或低功耗模式(均在 I2C 主器件 TX 之后)的情况下、ACLK 无法正确选择。

    实际上、我不再需要使用 ACLK、因为要获得100kHz SCL、我不能使用32kHz ACLK (我必须使用 SMCLK)、但 ACLK 行为仍然很奇怪。 如果我想用 ACLK 创建一个 I2C SCL 时钟以用于调试、那么应该根据引起奇怪行为的原因来确定。

    您说过您能够使用我的代码使用 ACLK 创建3.3kHz SCL 吗? 或者您是否对其进行了任何更改? MSP430F1611?

    可能存在一些与编译器相关的差异、十六进制差分应披露这一点。

    非常感谢您的友好帮助!

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

    帮助没有问题。 让我捕获一些屏幕快照、以显示我的工作情况。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Steven、

    我将 需要就此向我们的设计团队提交勘误表。  您可以在 我的屏幕中看到捕获各种时钟和 I2C 活动。  如果您仔细观察、I2C 事务开始在 前4个时钟周期中使用 SMCLK 运行、然后切换到 ACLK、后者被10分频为3.27khz。

    该屏幕捕获是 SMCLK 提供 I2C 时钟的时间的缩放。

    由于此器件似乎存在问题、您是否有理由不考虑使用其他器件?

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

    您好 Dennis、

    由于我们有多个使用此器件的传感器硬件、因此无法切换到较新的硬件。

    不过、我们可以使用 SMCLK 为我们的应用的 I2C 模块计时、因此不用担心。

    我很高兴能够帮助发现此器件的新勘误表。

    保持最新:-)

    谢谢!