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.

[参考译文] MSP432E401Y:MSP432E401Y 存在 I2C 问题

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1382557/msp432e401y-i2c-issue-with-msp432e401y

器件型号:MSP432E401Y
主题中讨论的其他器件:MSP-EXP432E401YINA226

工具与软件:

问候… 我对使用 MSP432E401YT 的 I2C 通信感到惊讶。 这里没有可供开始使用的示例程序。 然后、我在"ti/devices/msp432e4/driverlib/driverlib.h"下找到了一个 I2C 主设备示例程序。
但这甚至不起作用。

MSP 工作正常。 我认为没有硬件问题。 UART 和模拟功能正常运行。 请提供一些通过 I2C 读取和写入特定寄存器的示例。 标记了 IAM

提前感谢...

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

    /* DriverLib 包括*/
    #include

    /*标准包括*/
    #include
    #include

    #include
    #include
    #include "uartstdio.h"
    #include "pinout.h"
    #include

    /*对 I2C 状态机的定义*/
    #define I2C_MASTER_IDLE 0x0
    #define I2C_MASTER_TX 0x1
    #define I2C_MASTER_RX 0x2
    #define I2C_MASTER_Anak 0x3
    #define I2C_MASTER_DNAK 0x4
    #define I2C_MASTER_ALST 0x5
    #define I2C_MASTER_UNKN 0x6


    /*定义 I2C 总线参数*/
    #define SLAVE_ADDRESS 0x40 // I2C address
    #define I2C_NUM_DATA 2.
    #define 超时10000

    uint32_t g_ui32SysClock;
    字符 str[100];

    //驱动程序库遇到错误时调用的错误例程。
    #ifdef 调试
    void __error__(char *pcFilename、uint32_t ui32Line){}
    #endif

    /* I2C 数据和状态机的变量*/
    uint8_t sendData[I2C_NUM_DATA]={0x04};//寄存器地址
    uint8_t getData[I2C_NUM_DATA]={0x00、0x00};//用于保存接收数据的缓冲区...

    /*超时计数器*/
    uint32_t timeoutCounter;

    //配置 UART 及其引脚。  
    void ConfigureUART (void)

    //启用 UART 使用的 GPIO 外设。
    MAP_SysCtlPeripheralEnable (SYSCTL_PERIPH_GPIOA);

    //启用 UART0
    MAP_SysCtlPeripheralEnable (SYSCTL_PERIPH_UART0);

    //为 UART 模式配置 GPIO 引脚。
    MAP_GPIOPinConfigure (GPIO_PA0_U0RX);
    MAP_GPIOPinConfigure (GPIO_PA1_U0TX);
    MAP_GPIOPinTypeUART (GPIO_PORTA_BASE、GPIO_PIN_0 | GPIO_PIN_1);

    //初始化控制台 I/O 的 UART
    UARTStdioConfig (0115200、g_ui32SysClock);
    }

    int main (void)



    while (1){

    uint8_t ii;
    uint32_t systemClock;

    /*为120 MHz 配置系统时钟*/
    systemClock = MAP_SysCtlClockFreqSet ((SYSCTL_XTAL_25MHz | SYSCTL_OSC_MAIN |)
    SYSCTL_USE_PLL | SYSCTL_CFG_VCO_480)
    120000000);
    // 120000000 50000000
    G_ui32SysClock = systemClock;

    //配置器件引脚。
    PinoutSet (false、false);

    //启用 LED D1 (PN1)的 GPIO 引脚。
    MAP_GPIOPinTypeGPIOOutput (GPIO_PORTN_BASE、GPIO_PIN_0);

    //初始化 UART。
    ConfigureUART();

    /*启用到 GPIO 端口 N 的时钟并将引脚配置为输出*/
    MAP_SysCtlPeripheralEnable (SYSCTL_PERIPH_GPION);
    while (! (MAP_SysCtlPeripheralReady (SYSCTL_PERIPH_GPION))

    }
    MAP_GPIOPinTypeGPIOOutput (GPIO_PORTN_BASE、GPIO_PIN_0);
    MAP_GPIOPinWrite (GPIO_PORTN_BASE、GPIO_PIN_0、0);

    /*启用到 GPIO 端口 K 的时钟并将引脚配置为 I2C */
    MAP_SysCtlPeripheralEnable (SYSCTL_PERIPH_GPIOK);
    while (! (MAP_SysCtlPeripheralReady (SYSCTL_PERIPH_GPIOK))

    }

    MAP_GPIOPinConfigure (GPIO_PK4_I2C3SCL);
    MAP_GPIOPinConfigure (GPIO_PK5_I2C3SDA);
    MAP_GPIOPinTypeI2C (GPIO_PORTK_BASE、GPIO_PIN_5);
    MAP_GPIOPinTypeI2CSCL (GPIO_PORTK_BASE、GPIO_PIN_4);

    /*由于没有板上拉、我们将启用弱内部上拉*/
    GPIOK->PUR |=(GPIO_PIN_5 | GPIO_PIN_4);

    /*启用 I2C-3模块时钟并配置 I2C 主器件*/
    MAP_SysCtlPeripheralEnable (SYSCTL_PERIPH_I2C3);
    while (! (MAP_SysCtlPeripheralReady (SYSCTL_PERIPH_I2C3))

    }

    /*在标准模式下配置 I2C 主设备*/
    MAP_I2CMasterInitExpClk (I2C3_BASE、systemClock、false);

    /*初始化 Tx 的变量*/
    uint8_t setI2CState = I2C_MASTER_TX;
    uint8_t dataIndex = 0;

    /*将从地址放在总线上以进行写入*/
    MAP_I2CMasterSlaveAddrSet (I2C3_BASE、SLAVE_ADDRESS、FALSE);// FALSE 用于写入、TRUE 用于读取

    /*将寄存器地址写入总线*/
    MAP_I2CMasterDataPut (I2C3_BASE、sendData[dataIndex]);
    MAP_I2CMasterControl (I2C3_BASE、I2C_MASTER_CMD_BURST_SEND_START);

    /*等待传输以超时方式完成*/
    timeoutCounter = 0;
    while (MAP_I2CMasterBusy (I2C3_BASE))

    UARTprintf ("transfering\n");
    MAP_SysCtlDelay (1000);//根据需要调整延迟
    if (++timeoutCounter > timeout)

    UARTprintf ("transfer timeout\n");
    返回0;
    }
    }

    /*检查错误*/
    if (MAP_I2CMasterErr (I2C3_BASE)!= I2C_MASTER_ERR_NONE)

    UARTprintf ("transfer error\n");
    返回0;
    }

    /*短延迟*/
    MAP_SysCtlDelay (3000);

    /*初始化 Rx 的变量*/
    setI2CState = I2C_MASTER_RX;
    dataIndex = 0;

    /*将从地址放在总线上以进行读取*/
    MAP_I2CMasterSlaveAddrSet (I2C3_BASE、SLAVE_ADDRESS、TRUE);

    /*开始接收来自从器件的数据*/
    MAP_I2CMasterControl (I2C3_BASE、I2C_MASTER_CMD_BURST_RECEIVE_START);

    /*等待接收以超时方式完成*/
    timeoutCounter = 0;
    while (MAP_I2CMasterBusy (I2C3_BASE))

    UARTprintf ("transfering\n");
    MAP_SysCtlDelay (1000);//根据需要调整延迟
    if (++timeoutCounter > timeout)

    UARTprintf ("transfer timeout\n");
    返回0;
    }
    }

    /*检查错误*/
    if (MAP_I2CMasterErr (I2C3_BASE)!= I2C_MASTER_ERR_NONE)

    UARTprintf ("transfer error\n");
    返回0;
    }

    /*读取接收到的数据*/
    Getdata[dataIndex++]= MAP_I2CMasterDataGet (I2C3_BASE);

    GetDATA[1]= MAP_I2CMasterDataGet (I2C3_BASE);

    /*通过 UART 打印接收到的数据*/
    对于(ii = 0;ii < I2C_NUM_DATA;ii++)

    UARTprintf ("接收到的字节%d:0x%02x\n"、ii、getData[i]);
    }


    uint16_t busVoltageRaw =(getData[0]<< 8)| getData[1];




    MAP_SysCtlDelay (g_ui32SysClock / 3);


    }
    返回0;
    }



    这是我在 Keil uVISION 5中的代码,它正确地读取低字节,但不正确地读取高字节。

    请尽快帮助...

    提前感谢...

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [报价 userid="610146" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1382557/msp432e401y-i2c-issue-with-msp432e401y ]我对使用 MSP432E401YT 进行 I2C 通信感到吃惊。 这里没有可供开始使用的示例程序。 然后、我在"ti/devices/msp432e4/driverlib/driverlib.h"下找到了一个 I2C 主设备示例程序。
    但这甚至不起作用。

    您好!

     还有大量 I2C 示例。 您可以从 i2c_mastermode_simple_transfer 开始吗。  使用该示例需要另一个 MSP-EXP432E401Y 板运行 i2c_slavemode_simple_transfer 应用程序。  还要确保 SDA 和 SCL 总线上具有适当的拉电阻器。  

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

    getData[1]= MAP_I2CMasterDataGet (I2C3_BASE);

    我认为、在执行此操作之前、需要执行以下操作:

    > MAP_I2CMasterControl (I2C3_BASE、I2C_MASTER_CMD_BURST_RECEIVE_CONT);// Rx another

    while (map_I2CMasterBusy (I2C3_base))/* empty*/;//下一个 Rx 字节就绪?

    并用它进行跟踪

    > MAP_I2CMasterControl (I2C3_BASE、I2C_MASTER_CMD_BURST_RECEIVE_FINISH);//完成

    这种顺序出现在查尔斯建议的示例中,但它被埋了相当深的。

    [编辑:也请参考 TRM (SLAU723A)图19-11]

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

    非常感谢 您的答复...请查看我的下面的代码,我已经根据您的建议进行了更改. 但有时也会得到正确的结果、有时则不是。 请帮我解决这个问题。  

    提前感谢...

    /* DriverLib 包括*/
    #include

    /*标准包括*/
    #include
    #include
    #include
    #include "uartstdio.h"
    #include "pinout.h"

    /*对 I2C 状态机的定义*/
    #define I2C_MASTER_IDLE 0x0
    #define I2C_MASTER_TX 0x1
    #define I2C_MASTER_RX 0x2
    #define I2C_MASTER_Anak 0x3
    #define I2C_MASTER_DNAK 0x4
    #define I2C_MASTER_ALST 0x5
    #define I2C_MASTER_UNKN 0x6

    /*定义 I2C 总线参数*/
    #define SLAVE_ADDRESS 0x44 // I2C address
    #define I2C_NUM_DATA 2 //要读取的字节数
    #define TIMEOUT 10000 //迭代中的超时值

    uint32_t g_ui32SysClock;

    /* I2C 数据和状态机的变量*/
    uint8_t sendData[I2C_NUM_DATA]={0x00};//寄存器地址
    uint8_t getData[I2C_NUM_DATA]={0x00};//用于保存接收数据的缓冲区

    /*超时计数器*/
    uint32_t timeoutCounter;

    /*配置 UART 及其引脚。 这必须在 UARTprintf()之前调用。 */
    void ConfigureUART (void)

    /*启用 UART 使用的 GPIO 外设。 */
    MAP_SysCtlPeripheralEnable (SYSCTL_PERIPH_GPIOA);

    /*启用 UART0 */
    MAP_SysCtlPeripheralEnable (SYSCTL_PERIPH_UART0);

    /*针对 UART 模式配置 GPIO 引脚。 */
    MAP_GPIOPinConfigure (GPIO_PA0_U0RX);
    MAP_GPIOPinConfigure (GPIO_PA1_U0TX);
    MAP_GPIOPinTypeUART (GPIO_PORTA_BASE、GPIO_PIN_0 | GPIO_PIN_1);

    /*为控制台 I/O 初始化 UART */
    UARTStdioConfig (0115200、g_ui32SysClock);
    }

    int main (void)

    uint8_t ii;
    uint32_t systemClock;

    /*为120 MHz 配置系统时钟*/
    systemClock = MAP_SysCtlClockFreqSet ((SYSCTL_XTAL_25MHz | SYSCTL_OSC_MAIN |)
    SYSCTL_USE_PLL | SYSCTL_CFG_VCO_480)
    120000000);

    while (1){

    G_ui32SysClock = systemClock;

    /*配置器件引脚。 */
    PinoutSet (false、false);

    /*初始化 UART。 */
    ConfigureUART();

    /*启用到 GPIO 端口 N 的时钟并将引脚配置为输出*/
    MAP_SysCtlPeripheralEnable (SYSCTL_PERIPH_GPION);
    while (! (MAP_SysCtlPeripheralReady (SYSCTL_PERIPH_GPION)));

    MAP_GPIOPinTypeGPIOOutput (GPIO_PORTN_BASE、GPIO_PIN_0);
    MAP_GPIOPinWrite (GPIO_PORTN_BASE、GPIO_PIN_0、0);

    /*启用到 GPIO 端口 K 的时钟并将引脚配置为 I2C */
    MAP_SysCtlPeripheralEnable (SYSCTL_PERIPH_GPIOK);
    while (! (MAP_SysCtlPeripheralReady (SYSCTL_PERIPH_GPIOK));

    MAP_GPIOPinConfigure (GPIO_PK4_I2C3SCL);
    MAP_GPIOPinConfigure (GPIO_PK5_I2C3SDA);
    MAP_GPIOPinTypeI2C (GPIO_PORTK_BASE、GPIO_PIN_5);
    MAP_GPIOPinTypeI2CSCL (GPIO_PORTK_BASE、GPIO_PIN_4);

    /*启用 I2C-3模块时钟并配置 I2C 主器件*/
    MAP_SysCtlPeripheralEnable (SYSCTL_PERIPH_I2C3);
    while (! (MAP_SysCtlPeripheralReady (SYSCTL_PERIPH_I2C3));

    /*在标准模式下配置 I2C 主设备*/
    MAP_I2CMasterInitExpClk (I2C3_BASE、systemClock、false);

    /*初始化 I2C 操作的变量*/
    uint8_t dataIndex = 0;

    /*传输寄存器地址或命令*/
    MAP_I2CMasterSlaveAddrSet (I2C3_BASE、SLAVE_ADDRESS、FALSE);
    MAP_I2CMasterDataPut (I2C3_BASE、sendData[dataIndex]);
    MAP_I2CMasterControl (I2C3_BASE、I2C_MASTER_CMD_SINGLE_SEND);

    /*等待传输完成*/
    timeoutCounter = 0;
    while (MAP_I2CMasterBusy (I2C3_BASE))

    MAP_SysCtlDelay (1000);//根据需要调整延迟
    if (++timeoutCounter > timeout)

    UARTprintf ("transfer timeout\n");
    返回0;
    }
    }

    /*检查错误*/
    if (MAP_I2CMasterErr (I2C3_BASE)!= I2C_MASTER_ERR_NONE)

    UARTprintf ("transfer error\n");
    返回0;
    }

    /*短延迟*/
    MAP_SysCtlDelay (3000);

    /*从设备接收数据*/
    MAP_I2CMasterSlaveAddrSet (I2C3_BASE、SLAVE_ADDRESS、TRUE);
    如果(I2C_NUM_DATA > 1)

    UARTprintf ("SDA 具有超过单字节.......... \n");
    /*启动多字节读取*/
    MAP_I2CMasterControl (I2C3_BASE、I2C_MASTER_CMD_BURST_RECEIVE_START);

    /*等待接收完成*/
    timeoutCounter = 0;
    while (MAP_I2CMasterBusy (I2C3_BASE))

    MAP_SysCtlDelay (1000);//根据需要调整延迟
    if (++timeoutCounter > timeout)

    UARTprintf ("transfer timeout\n");
    返回0;
    }
    }

    /*检查错误*/
    if (MAP_I2CMasterErr (I2C3_BASE)!= I2C_MASTER_ERR_NONE)

    UARTprintf ("transfer error\n");
    返回0;
    }

    /*读取接收到的数据*/
    Getdata[dataIndex++]= MAP_I2CMasterDataGet (I2C3_BASE);

    // getData[1]= MAP_I2CMasterDataGet (I2C3_BASE);

    /*如果需要多个字节、则继续读取*/
    对于(ii = 1;ii < I2C_NUM_DATA;ii++)

    MAP_I2CMasterControl (I2C3_BASE、I2C_MASTER_CMD_BURST_RECEIVE_CONT);
    while (MAP_I2CMasterBusy (I2C3_BASE))

    MAP_SysCtlDelay (1000);//根据需要调整延迟
    if (++timeoutCounter > timeout)

    UARTprintf ("transfer timeout\n");
    返回0;
    }
    }

    /*检查错误*/
    if (MAP_I2CMasterErr (I2C3_BASE)!= I2C_MASTER_ERR_NONE)

    UARTprintf ("transfer error\n");
    返回0;
    }

    /*读取接收到的数据*/
    Getdata[dataIndex++]= MAP_I2CMasterDataGet (I2C3_BASE);
    }

    /*完成多字节读取*/
    MAP_I2CMasterControl (I2C3_BASE、I2C_MASTER_CMD_BURST_RECEIVE_FINISH);
    while (MAP_I2CMasterBusy (I2C3_BASE))

    MAP_SysCtlDelay (1000);//根据需要调整延迟
    if (++timeoutCounter > timeout)

    UARTprintf ("transfer timeout\n");
    返回0;
    }
    }

    /*检查错误*/
    if (MAP_I2CMasterErr (I2C3_BASE)!= I2C_MASTER_ERR_NONE)

    UARTprintf ("transfer error\n");
    返回0;
    }

    /*读取接收到的数据*/
    Getdata[dataIndex++]= MAP_I2CMasterDataGet (I2C3_BASE);
    }
    设计

    UARTprintf ("SDA 有单字节.......... ");
    /*单字节读取*/
    MAP_I2CMasterControl (I2C3_BASE、I2C_MASTER_CMD_SINGLE_RECEIVE);
    while (MAP_I2CMasterBusy (I2C3_BASE))

    MAP_SysCtlDelay (1000);//根据需要调整延迟
    if (++timeoutCounter > timeout)

    UARTprintf ("transfer timeout\n");
    返回0;
    }
    }

    /*检查错误*/
    if (MAP_I2CMasterErr (I2C3_BASE)!= I2C_MASTER_ERR_NONE)

    UARTprintf ("transfer error\n");
    返回0;
    }

    /*读取接收到的数据*/
    Getdata[dataIndex++]= MAP_I2CMasterDataGet (I2C3_BASE);
    }

    /*通过 UART 打印接收到的数据*/
    对于(ii = 0;ii < I2C_NUM_DATA;ii++)

    UARTprintf ("接收到的字节%d:0x%02x\n"、ii、getData[i]);
    }

    /*计算总线电压*/
    uint16_t busVoltageRaw =(getData[0]<< 8)| getData[1];
    Float busVoltage = busVoltageRaw * 1.25;// INA226总线电压 LSB 为1.25mV

    UARTprintf ("总线电压:%.2f mV\n"、busVoltage);


    MAP_SysCtlDelay (g_ui32SysClock / 3);

    }

    返回0;
    }

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

    非常感谢您的回复...
    但我没有两个 MSP。。