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.

[参考译文] MSP430FR2433:I2C 在启动时挂起

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1040367/msp430fr2433-i2c-hangs-on-start

器件型号:MSP430FR2433

您好!

每当我调用 ROM_EUSCI_B_I2C_masterSendMultiByteStart()时,它在 func 内的 while 循环上挂起,我在网络上有另一个从设备,但没有 任何东西可以摆脱挂起。

//*****************************************************************************
//! This example shows how to configure the I2C module as a master for
//! single byte transmission in interrupt mode. The address of the slave
//! module that the master is communicating with also set in this example.
//!
//! Demo - EUSCI_B0 I2C Master TX single bytes to MSP430 Slave
//!
//!  Description: This demo connects two MSP430's via the I2C bus. The master
//!  transmits to the slave. This is the master code. It continuously
//!  transmits 00h, 01h, ..., 0ffh and demonstrates how to implement an I2C
//!  master transmitter sending a single byte using the USCI_B0 TX interrupt.
//!  ACLK = n/a, MCLK = SMCLK = BRCLK = default DCO = ~1MHz
//!
//!                                /|\  /|\
//!               MSP430FR4133      10k  10k     MSP430FR4133
//!                   slave         |    |        master
//!             -----------------   |    |   -----------------
//!           -|XIN  P5.2/UCB0SDA|<-|----+->|P5.2/UCB0SDA  XIN|-
//!            |                 |  |       |                 | 32kHz
//!           -|XOUT             |  |       |             XOUT|-
//!            |     P5.3/UCB0SCL|<-+------>|P5.3/UCB0SCL     |
//!            |                 |          |             P1.0|--> LED
//!
//! This example uses the following peripherals and I/O signals.  You must
//! review these and change as needed for your own board:
//! - I2C peripheral
//! - GPIO Port peripheral (for I2C pins)
//! - SCL2
//! - SDA
//! - CS
//!
//! This example uses the following interrupt handlers.  To use this example
//! in your own application you must add these interrupt handlers to your
//! vector table.
//! - USCI_B0_VECTOR.
//!
//
//*****************************************************************************
#include "driverlib.h"

//*****************************************************************************
//
//Set the address for slave module. This is a 7-bit address sent in the
//following format:
//[A6:A5:A4:A3:A2:A1:A0:RS]
//
//A zero in the "RS" position of the first byte means that the master
//transmits (sends) data to the selected slave, and a one in this position
//means that the master receives data from the slave.
//
//*****************************************************************************
#define SLAVE_ADDRESS 0xBE//or could be 0xBE MC also says to write is BE to read is BF

//*****************************************************************************
//
//Target frequency for SMCLK in kHz i2c standard mode
//
//*****************************************************************************
#define CS_SMCLK_DESIRED_FREQUENCY_IN_KHZ   1000

//*****************************************************************************
//
//SMCLK/FLLRef Ratio
//
//*****************************************************************************
#define CS_SMCLK_FLLREF_RATIO   30


uint8_t transmitData;
void Send_I2C_Start(uint16_t reg)
{
    ROM_EUSCI_B_I2C_masterSendMultiByteStart(EUSCI_B0_BASE,reg >> 8);

    ROM_EUSCI_B_I2C_masterSendMultiByteNext(EUSCI_B0_BASE,reg & 0xFF);
}
void Send_I2C_End()
{
    ROM_EUSCI_B_I2C_masterSendMultiByteStop(EUSCI_B0_BASE);
}
void Send_I2C(uint8_t* data,uint8_t size)
{
    //send data
    uint8_t i = 0;
    for(i = 0; i < size; i++)
    {
        ROM_EUSCI_B_I2C_masterSendMultiByteNext(EUSCI_B0_BASE,data[i]);
    }
}


void main (void)
{
    WDT_A_hold(WDT_A_BASE);

    //Set Ratio and Desired MCLK Frequency  and initialize DCO
    CS_initFLLSettle(
        CS_SMCLK_DESIRED_FREQUENCY_IN_KHZ,
        CS_SMCLK_FLLREF_RATIO
        );

    //Set SMCLK = DCO with frequency divider of 1
    CS_initClockSignal(
    		CS_SMCLK,
    		CS_DCOCLKDIV_SELECT,
    		CS_CLOCK_DIVIDER_1
    		);

    //Set MCLK = DCO with frequency divider of 1
    CS_initClockSignal(
    		CS_MCLK,
    		CS_DCOCLKDIV_SELECT,
    		CS_CLOCK_DIVIDER_1
    		);

    // Configure Pins for I2C
    /*
    * Select Port 5
    * Set Pin 2, 3 to input with function, (UCB0SIMO/UCB0SDA, UCB0SOMI/UCB0SCL).
    */
    GPIO_setAsPeripheralModuleFunctionInputPin(
        GPIO_PORT_P5,
        GPIO_PIN2 + GPIO_PIN3,
        GPIO_PRIMARY_MODULE_FUNCTION
    );

    /*
     * Disable the GPIO power-on default high-impedance mode to activate
     * previously configured port settings
     */
    PMM_unlockLPM5();

    //Initialize Master
    EUSCI_B_I2C_initMasterParam param = {0};
    param.selectClockSource = EUSCI_B_I2C_CLOCKSOURCE_SMCLK;
    param.i2cClk = CS_getSMCLK();
    param.dataRate = EUSCI_B_I2C_SET_DATA_RATE_100KBPS;
    param.byteCounterThreshold = 50;
    param.autoSTOPGeneration = EUSCI_B_I2C_NO_AUTO_STOP;
    ROM_EUSCI_B_I2C_initMaster(EUSCI_B0_BASE, &param);

    //Specify slave address
    ROM_EUSCI_B_I2C_setSlaveAddress(EUSCI_B0_BASE,
        SLAVE_ADDRESS
        );

    //Set in transmit mode
    ROM_EUSCI_B_I2C_setMode(EUSCI_B0_BASE,
        EUSCI_B_I2C_TRANSMIT_MODE
        );

    //Enable I2C Module to start operations
    ROM_EUSCI_B_I2C_enable(EUSCI_B0_BASE);

    ROM_EUSCI_B_I2C_enableInterrupt(EUSCI_B0_BASE,
    EUSCI_B_I2C_TRANSMIT_INTERRUPT0 +
    EUSCI_B_I2C_TRANSMIT_INTERRUPT1 +
    EUSCI_B_I2C_TRANSMIT_INTERRUPT2 +
    EUSCI_B_I2C_TRANSMIT_INTERRUPT3 +
    EUSCI_B_I2C_STOP_INTERRUPT);

    
    uint8_t index = 0;

while(index++ < 5)
{
Send_I2C_Start(0x01);
uint8_t data[] = {0xFF,0xFD};
Send_I2C(data,2);
Send_I2C_End();

}

}

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

    MCU 只有3个端口已将其更改为端口1、现在所有端口都可以正常工作

     GPIO_setAsPeripheralModuleFunctionInputPin(
            GPIO_PORT_P1,
            GPIO_PIN2 + GPIO_PIN3,
            GPIO_PRIMARY_MODULE_FUNCTION
        );

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

    感谢您的发帖和分享!