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.

[参考译文] MSP430FR2512:I2C -启用从器件

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1054263/msp430fr2512-i2c---enabling-slave

器件型号:MSP430FR2512

您好!

I2C 通信有一个大问题。

代码由 CapTIvate 设计中心生成、初始化如下所示:

    //
    // Re-map EUSCI B0 pins to secondary locations
    // This frees up CapTIvate IOs
    //
    SYSCFG2 |= USCIBRMP;

    // P1.0: OUTPUT LOW
    // P1.1: OUTPUT LOW
    // P1.2: OUTPUT LOW
    // P1.3: OUTPUT LOW
    // P1.4: UCA0 UART TXD if (DEFAULT_OSC_SELECTION == CS_XT1CLK_SELECT), else OUTPUT LOW
    // P1.5: UCA0 UART RXD if (DEFAULT_OSC_SELECTION == CS_XT1CLK_SELECT), else OUTPUT LOW
    // P1.6: OUTPUT LOW
    // P1.7: OUTPUT LOW
#if (DEFAULT_OSC_SELECTION == CS_XT1CLK_SELECT)
    P1OUT  = (0);
    P1DIR  = (GPIO_PIN0 | GPIO_PIN1 | GPIO_PIN2 | GPIO_PIN3 | GPIO_PIN6 | GPIO_PIN7);
    P1SEL0 = (GPIO_PIN4 | GPIO_PIN5);
    P1SEL1 = (0);
#else
    P1OUT  = (0);
    P1DIR  = (GPIO_PIN0 | GPIO_PIN1 | GPIO_PIN2 | GPIO_PIN3 | GPIO_PIN4 | GPIO_PIN5 | GPIO_PIN6 | GPIO_PIN7);
    P1SEL0 = (0);
    P1SEL1 = (0);
#endif

    // P2.0: UCA0 UART TXD if (DEFAULT_OSC_SELECTION == CS_REFOCLK_SELECT), else XOUT
    // P2.1: UCA0 UART RXD if (DEFAULT_OSC_SELECTION == CS_REFOCLK_SELECT), else XIN
    // P2.2: SYNC (SET OUTPUT LOW UNLESS USED)
    // P2.3: OUTPUT LOW
    // P2.4: IRQ (OPEN DRAIN), set high to start
    // P2.5: UCB0 I2C SDA
    // P2.6: UCB0 I2C SCL
#if (DEFAULT_OSC_SELECTION == CS_XT1CLK_SELECT)
    P2OUT  =  (GPIO_PIN4);
    P2DIR  =  (GPIO_PIN2 | GPIO_PIN3 | GPIO_PIN4);
    P2SEL0 =  (0);
    P2SEL1 =  (GPIO_PIN0 | GPIO_PIN1 | GPIO_PIN5 | GPIO_PIN6);
#else
    P2OUT  =  (0);
    P2DIR  =  (GPIO_PIN2 | GPIO_PIN3 | GPIO_PIN4);
    P2SEL0 =  (GPIO_PIN0 | GPIO_PIN1);
    P2SEL1 =  (GPIO_PIN5 | GPIO_PIN6);
#endif

但在 MSP430FR2512IPW16上、没有生成的代码设置 SDA 和 SCL 的 PIN2.5和 PIN2.6。

因此、我更改了两个方面:

   P1DIR =(GPIO_PIN0 | GPIO_PIN1 | GPIO_PIN2 | GPIO_PIN3 | GPIO_PIN4 | GPIO_PIN5 | GPIO_PIN6 | GPIO_PIN7);更改为

   P1DIR =(GPIO_PIN0 | GPIO_PIN1 | GPIO_PIN4 | GPIO_PIN5 | GPIO_PIN6 | GPIO_PIN7);

  P1SEL1 =(GPIO_PIN2 | GPIO_PIN3);

我还将   SYSCFG2 |= USCIBRMP 更改为    SYSCFG2 &=~USCIBRMP;

我认为、如果我想获得 PIN1.2 = SDA 和 PIN1.3 = SCL、这就是我必须做的

但我仍然没有通信。 我错过了什么吗?

提前感谢您

Igor

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

    您好 Igor、

    是的、16引脚封装没有次级 I2C 引脚、20引脚型号也是如此。  16引脚器件上的唯一 I2C 是 P1.2、P1.3。  遗憾的是、这些也是 CAP1.2和 CAP1.3。

    因此您的配置是正确的:

    P1SEL0 =(GPIO_PIN2 | GPIO_PIN3);
    P1SEL1 =(0);
    SYSCFG2 &=~USCIBRMP;

    如果您将其设置为与 CapTIvate 设计中心 GUI 进行通信、则还需要将其中一个 GPIO 引脚配置为中断引脚。  大多数 CapTIvate 演示默认为 P1.1。  如果您选择使用此引脚或其他引脚、请确保将方向配置为输入、并且在 CAPT_commConfig.h 文件中需要定义相应的引脚、以便 I2C 驱动器知道要为中断驱动哪个引脚。

    #define I2CSLAVE__REQ_pout                                            (P1OUT)
    #define I2CSLAVE__REQ_Pdir                                            (P1DIR)
    #define I2CSLAVE__REQ_MASK                                             (BIT1)

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

    尊敬的 Dennis:

    首先、我使用 REGISTER_I2C 尝试使用 MCU 板、但我始终从 I2C 获得 NACK 响应(我保留默认从地址0x0A)。 我还尝试了其他 Salve 地址、但没有成功。

    然后、我尝试 通过 CAPTIVATE_PGMR 板与具有 BULK_I2C 的设计中心 GUI 进行通信(我在 PGMR 板上手动触发 IRQ)、并获取 NACK

    然后、我尝试与设计中心 GUI 进行 UART 通信、并实现了完美的工作。

    我在这里发帖、看看我是否错过了 I2C 设置。

    我还能做什么?

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

    您好 Igor、

    听起来一切正常。  您能否使用示波器或逻辑探头获取 I2C 事务 NACK 的捕获?  您的电路板上是否有 SDA、SCL 上拉电阻器?  如果是、有什么价值?  SDA、SCL 引脚上是否有电容器? 您将什么 GPIO 引脚用于 IRQ 引脚?

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

    尊敬的 Dennis:

    我再次更新代码、现在可以正常工作。

    唯一的区别在于:

    P1SEL0 =(GPIO_PIN2 | GPIO_PIN3);

    我以前有:

    P1SEL1 =(GPIO_PIN2 | GPIO_PIN3);

    老实说、我不知道 P1SEL1 和 P1SEL0之间有什么区别

    谢谢、问题已解决

    此致

    Igor

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

    您好 Igor、

    你让我在那里流汗了一段时间。 很高兴您找到了它。

    在 MSP430 MCU 上、每个 IO 引脚可具有不同的功能。  在该器件上、多达四个不同的功能、例如 I2C、UART、PWM、ADC 输入、 等等  默认情况下、它们始终是 POR 上的 GPIO (通用输入/输出)。

    要选择引脚的"替代"功能、您可以根据 数据表第6.11节中的此表设置 PxSEL0和 PxSEL1位

    因此、要为 I2C 功能设置 GPIO 引脚 P1.2和 P1.3、请设置 P1SEL0 =(GPIO_PIN2 | GPIO_PIN3)和 P1SEL1 = 0。

    希望这有助于解释操作。

    此时、我将假定您能够推进您的项目、因此我将此帖子标记为已解决。 如果情况并非如此,请单击“这无法解决我的问题”按钮,并使用更多信息回复此主题。
    如果此主题已锁定、请单击"提出相关问题"按钮、然后在新主题中描述您的问题的当前状态以及您可能需要帮助我们帮助解决您的问题的任何其他详细信息。