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.

[参考译文] MSP430FR4133:MSP430FR4133 I2C 帮助

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1329533/msp430fr4133-msp430fr4133-i2c-help

器件型号:MSP430FR4133

大家好、我希望有人可以帮助我配置 MSP430Fr4133以便与 SSD1306 I2C 显示屏配合使用?

Fullscreen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// I2C.c
#include "i2c.h"
#include <msp430fr4133.h>
#include <stdint.h>
#define SDA BIT2 // i2c sda P5.2
#define SCL BIT3 // i2c scl P5.3
unsigned char* PTxData; // Pointer to TX data
unsigned char TxByteCtr; // number of bytes to TX
void i2c_init(void) {
P5SEL0 |= SCL + SDA; // Assign I2C pins to USCI_B0
UCB0CTL1 |= UCSWRST; // Enable SW reset
UCB0CTLW0 = UCMST + UCMODE_3 + UCSYNC; // I2C Master, synchronous mode
UCB0CTL1 = UCSSEL_2 + UCSWRST; // Use SMCLK, keep SW reset
UCB0BRW = 10; // fSCL = SMCLK/10 = ~100kHz with SMCLK 1MHz
UCB0BRW = 0;
UCB0CTL1 &= ~UCSWRST; // Clear SW reset, resume operation
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
我附上了代码供参考。 我认为这个问题可能与 I2C 引脚/中断矢量的配置有关、因为这是我从原始库进行的更改、在 GitHub 上对代码进行了调整。 非常感谢您的任何帮助! 谢谢!

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

    它在您运行时有什么作用?

    ----------------

    > PMM_unlockLPM5 ();

    将其上移、使其在调用 ssd1306 _init (或甚至在 i2c_init 之前)之前、因为它需要运行 GPIO。

    ----------------

    我还建议您检查 NACK (UCNACKIE/USCI_I2C_UCNACKIFG)、以防万一。   

    [编辑:更正了拼写错误。]

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

    您好、Bruce、感谢您的回复。 我已经纳入了你的建议,但仍然没有运气。 屏幕不显示任何内容。 从进行一些调试(在中断矢量处设置断点)、代码似乎从不 进入中断例程。 我已根据使用 I2C 的 MSP Academy 示例修改了寄存器、并获得以下代码。 不过、屏幕上仍然没有输出。 感谢您尝试解决此问题。

    Fullscreen
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    #include "i2c.h"
    #include <msp430fr4133.h>
    #include <stdint.h>
    #define SDA BIT2 // i2c sda P5.2
    #define SCL BIT3 // i2c scl P5.3
    unsigned char *PTxData; // Pointer to TX data
    unsigned char TxByteCtr; // number of bytes to TX
    void i2c_init(void) {
    P5SEL0 |= SCL + SDA; // Assign I2C pins to USCI_B0
    UCB0CTLW0 |= UCSWRST; // Enable SW reset
    UCB0CTLW0 = UCMST + UCMODE_3 + UCSYNC; // I2C Master, synchronous mode
    UCB0CTLW0 = UCSSEL_2 + UCSWRST; // Use SMCLK, keep SW reset
    UCB0BRW = 10; // fSCL = SMCLK/10 = ~100kHz with SMCLK 1MHz
    UCB0BRW = 0;
    UCB0CTLW0 &= ~UCSWRST; // Clear SW reset, resume operation
    UCB0IE |= UCTXIE0 | UCNACKIE; // Enable TX interrupt
    } // end i2c_init
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

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

    这有问题:

    Fullscreen
    1
    2
    3
    UCB0CTLW0 |= UCSWRST; // Enable SW reset
    UCB0CTLW0 = UCMST + UCMODE_3 + UCSYNC; // I2C Master, synchronous mode
    UCB0CTLW0 = UCSSEL_2 + UCSWRST;
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    至少可以将它从混合字和字节访问的第一个版本更改为更糟糕的版本。

    行2清零 UCSWRST、行3清零行2中所做的设置。

    它应该与以下代码类似:

    Fullscreen
    1
    2
    UCB0CTLW0 = UCSWRST; // Enable SW reset
    UCB0CTLW0 |= UCMST | UCMODE_3 | UCSYNC | UCSSEL_2; // I2C Master, synchronous mode
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

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

    谢谢、David。 出于某些原因、只有当我在宏之间使用"+"符号而不是"|"符号时、代码才会进入 ISR。 此代码现在触发 ISR:

    void i2c_init (void){

      P5SEL0 |= SCL;//将 I2C 引脚分配至 USCI_B0

      P5SEL0 |= SDA;

      UCB0CTLW0 |= UCSWRST;//启用软件复位

      UCB0CTLW0 |= UCMST + UCMODE_3 + UCSYNC;// I2C 主器件、同步模式

      UCB0CTLW0 |= UCSSEL_2 + UCSWRST;//使用 SMCLK,保持软件复位

      UCB0BRW = 10;// fSCL = SMCLK/10 =~100kHz 及 SMCLK 1MHz

      UCB0BRW = 0;

      UCB0CTLW0 &=~μ A UCSWRST;//清除软件复位、恢复操作

      UCB0IE |= UCTXIE0;//启用 TX 中断

    }//结束 i2c_init

    但使用 UCB0CTLW0 |= UCSSEL_2 | UCSWRST 将不起作用。 屏幕上仍然没有输出、但这是一个进步。 您能否说明什么时候使用字节/字访问更好? 我曾查看过相关的用户指南、但并未真正按照其中的说明操作。 感谢您的帮助  

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

    字节访问是从真正旧的 MSP430器件进行的保留、而旧的 MSP430器件也是如此。 TI 为那些从那里开始并倾向于该方式的符号提供了帮助。 我不喜欢它、因为当我看到 UCB0CTL1时、我认为高字节实际上是低字节。 太令人困惑了。 它是一个字寄存器使用字访问。

    设置比特率的代码使用字访问、但在写入时假定有两个字节访问。 你不仅得到太快的比特率,但你违反了 brclk/4限制。

    由于这些寄存器中的所有字段不重叠、因此 按位或与加法之间的结果不应有差异。 我更喜欢使用位元或、因为我真的不想在位之间进行进位。 即使是在偶然情况下。

    另一个问题是、寄存器在复位后并不总是为零。 (请参阅文档。) 例如、UCCSEL 为3。 这一次不是问题。

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

    非常感谢详细的答复,大卫。 我将在船上提供许多有用的信息、试着让它正常工作。 加油打气  

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

    您已删除 i2c_write 最后一行中的"_ bis_SR_register (CPUOFF + GIE);"。 这是维护调度的内容。 现在一样、代码将循环运行、并在前一个操作完成前尝试开始一个新操作。 我建议您将这条线放回。

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

    感谢 Bruce 的检查和建议。

    尊敬的 Ross:

    如果仍存在问题、请分享您正在使用的新代码。

    同时、我还有进一步的调试建议-请检查 IIC 总线中的信号波形、当 没有数据或 时钟/数据不正确时。

    B.R.

    萨尔

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

    感谢 Bruce 和 Sal 的支持。 我认为可能需要将 UCTXIE0更改为 UCTXIE2、因为原始库(为不同的 MSP 器件编写、使用的是 IE2 |= UCB0TXIE 行)。 显然、我的器件上没有 IE2寄存器、因此这可能是问题的根源。 我明天会用示波器尝试你的建议、Sal。 再次感谢你们  

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

    UCTXIFG2 (UCTXIE2)只在使用多个地址的从器件上触发(特别是 UCB0I2COA2)、但情况并非如此。 UCTXIE 与 UCTXIE0相同。

    [编辑:次要澄清。]

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

    谢谢 Bruce。 节省了几个小时!

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

    大卫已经指出了这一点:

    >  UCB0BRW = 10;// fSCL = SMCLK/10 =~100kHz 及 SMCLK 1MHz

    >  UCB0BRW = 0;

    您应该删除第二行、它(重新)将 I2C 时钟设置为1MHz。