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.

[参考译文] MSP432P401R:无法为I2C通信生成时钟

Guru**** 2589280 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/631359/msp432p401r-could-not-generate-clock-for-i2c-communication

部件号:MSP432P401R

您好,

我正在尝试使用示例代码(i2c_master_rw_重复 性start-master_code)在2个MSP432P401R之间建立通信,但我无法生成时钟。 我调试了代码,序列未进入 EUSCIB0_IRQHandler。  


请告诉我问题是什么。  

谢谢!

Sushrut

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,
    您是否在I2C线路上有上拉? 您是否在另一台设备上下载了相应的从属代码? 是否可以尝试另一对i2c示例代码?

    dev.ti.com/.../

    dev.ti.com/.../

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

    您好Chris,

    感谢您的回复。

    它现在工作了,我忘记了连接上拉电阻器。

    但我要将外部 温度和湿度传感器连接到MSP432。 我正在使用MSP432的主代码。 但我有这个传感器的Arduino文件。 是否可以获取与MSP432兼容的此传感器的任何文件?

    我正在使用CCS来实现这一目标。

    我无法在MSP432和传感器之间建立通信, 您建议使用的任何示例代码都可以连接到外部传感器。

    谢谢!

    Sushrut

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    www.seeedstudio.com/Grove-Temperature&Humidity-Sensor-(SHT31)-p-2655.html

    这是我正在使用的传感器。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Sushrut,
    看一下数据表,似乎重复的启动示例可以很好地工作。 dev.ti.com/.../

    您需要调整TX的大小以发送命令MSB和lsb,然后接收的值将仅为6字节。 还有一些命令似乎没有读取,因此您可以使用多字节主代码发送两个字节。

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

    您好,Chris:

    感谢您的回复。

    我尝试使用重复的启动示例代码。

    我在代码中更改了TX数组的MSB和lsb。 但我没有从传感器获得任何数据。 COD序列正在进入

    IF (STATUS和EUSCI_B_I2C_Transmit_INTERRUPT0), 但未进入 IF (STATUS和EUSCI_B_I2C_receive _INTERRUPT0)。

    我也不明白为什么需要使用多字节主代码来发送两个字节。

    请您仔细研究一下,并告诉我我missed.e2e.ti.com/.../i2c_5F00_master_5F00_rw_5F00_repeated_5F00_start_2D00_master_5F00_code_5F00_MSP_5F00_EXP432P401R_5F00_nortos_5F00_ccs.rar上的内容

    谢谢!

    Sushrut

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

    您好,Chris:

    我添加了传感器的头文件并更改了代码以从传感器接收数据,但无法从传感器获取数据。

    我不使用任何IRQHandler,我只是使用 简单的命令来读取数据。

    请仔细阅读所附的代码并帮助我阅读这些数据。

    e2e.ti.com/.../i2c_5F00_slave_5F00_initiated_5F00_read_2D00_master_5F00_code_5F00_Techchallenge.rar

    谢谢!

    Sushrut

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

    您好,Chris:

    我正在使用重复的启动主代码。

    我逐行调试了代码,以检查MSP为何未与传感器通信。

    我开始知道,在 map_I2C_masterSendMultiByteStart 命令中,代码执行正在停止。 我深入研究了该函数,然后在循环未执行时执行下面的操作。  

    //传送中断标志轮询。
    while (!BISTAND_PERI(EUSSCI_B_CMIS(moduleInstance)->rIFG.r,UCTXIFG_OFS));

    基本上我不能将起始字节发送到传感器。

    请帮我解决这个问题。

    谢谢!

    Sushrut

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Sushrut,
    我看了你发送的代码,我找不到相关的I2C命令。 也许此示例可能会有所帮助:

    dev.ti.com/.../

    请参考i2c_driver.c (从第177行和第350行开始)以及如何访问tmp007.c。

    /***********************************************************
    功能:
    */
    bool readI2C (uint8_t ui8Addr,uint8_t ui8Reg,uint8_t *数据,uint8_t ui8ByteCount)

    /*待办:延迟*/
    /*等待就绪*/
    同时(MAP_I2C_isBusy (EUSCI_B1_BASE));

    /*将数据分配给本地指针*/
    pData =数据;

    /*禁用I2C模块以进行更改*/
    MAP_I2C_DisableModule (EUSCI_B1_BASE);

    /*设置要接收的字节数*/
    i2cConfig.byteCounterThreshold = ui8ByteCount;
    i2cConfig.autoSTOPGeneration = EUSCI_B_I2C_SEND_STOP_Automatically_on_BYTECOUNT_THRESHOLD;
    MAP_I2C_initMaster (EUSCI_B1_BASE,(const eUSI_I2C_MasterConfig *)&i2cConfig);

    /*加载设备从属地址*/
    MAP_I2C_setSlaveAddress (EUSCI_B1_BASE,ui8Addr);

    /*启用I2C模块以启动操作*/
    MAP_I2C_enableModule (EUSCI_B1_BASE);

    /*启用主停止和nack中断*/
    MAP_I2C_enableInterrupt (EUSCI_B1_BASE,EUSCI_B_I2C_STOP_INTERRUPT +)
    EUSCI_B_I2C_NAK_INTERRUPT);

    /*将我们的本地状态设置为BUSY */
    ui8Status = eUSI_BUSY;

    /*发送起始位并注册*/
    MAP_I2C_masterSendMultiByteStart (EUSCI_B1_BASE,ui8Reg);

    /*为剩余数据启用主中断*/
    MAP_Interrupt_enableInterrupt (INT_EUSCIB1);

    /*注:如果要接收的字节数=1,则目标寄存器将被移动
    *在写入阶段,UCBxTBCNT将被计数,并将提前触发停止位
    *如果count大于1,则等待下一个TXBUF空中断(刚好在reg值之后
    *被移出
    */
    while (ui8Status == eUSI_BUSY)

    IF (MAP_I2C_getInterruptStatus (EUSCI_B1_BASE,EUSCI_B_I2C_Transmit_INTERRUPT0))

    ui8Status = eUSI_IDLE;
    }
    }

    ui8Status = eUSI_BUSY;

    /*关闭TX并生成重新启动*/
    MAP_I2C_masterReceiveStart (EUSCI_B1_BASE);

    /*启用RX中断*/
    MAP_I2C_enableInterrupt (EUSCI_B1_BASE,EUSCI_B_I2C_receive _INTERRUPT0);

    /*等待接收所有数据*/
    while (ui8Status == eUSI_BUSY)


    #ifdef use_lpm
    MAP_PCM_GotoLPM0();
    #否则
    __no_operation();
    #endif
    }

    /*禁用中断*/
    MAP_I2C_DisableInterrupt (EUSCI_B1_BASE,EUSCI_B_I2C_STOP_INTERRUPT +)
    EUSCI_B_I2C_NAK_INTERRUPT + EUSCI_B_I2C_receive _INTERRUPT0);
    MAP_Interrupt_DisableInterrupt (INT_EUSCIB1);

    IF (ui8Status == eUSI_nack)

    返回(FALSE);
    }
    否则

    RETURN (TRUE);
    }
    }

    此致,
    Chris