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:MSP432 Launchpad 至 OPT3001传感器 BoosterPack I2C 连接

Guru**** 2528350 points
Other Parts Discussed in Thread: OPT3001

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/830496/msp432p401r-msp432-launchpad-to-opt3001-sensors-boosterpack-i2c-connection

器件型号:MSP432P401R
主题中讨论的其他器件:OPT3001BOOSTXL-SENSORS

大家好、在我上一篇文章之后、我尝试在 MSP432 Launchpad 和 Sensors BoosterPack 上的 OPT3001传感器之间建立 I2C 连接。

我正在使用 i2c.h 库中的函数、但我不确定我所做的是不是正确的。 我在这篇帖子中提出了很多问题、如果阅读这篇文章的人只能回答一个特定的问题、我很高兴听到它!

这是我的"设置函数":

void Setup_MSP432_Receive (void)(空)

//配置端口以使用 Sensors BoosterPack
//为 I2C_SCL 选择 I2C 功能(P6.5)
MAP_GPIO_setPeripheralModuleFunctionOutputPin (GPIO_PORT_P6、GPIO_PIN5、GPIO_PRIMARY_MODULE_Function);
//为 I2C_SDA 选择 I2C 功能(P6.4)
MAP_GPIO_setPeripheralModuleFunctionOutputPin (GPIO_PORT_P6、GPIO_PIN4、GPIO_PRIMARY_MODULE_Function);

//在接收模式下将 MSP432 Launchpad 配置为主器件
MAP_I2C_initMaster (EUSCI_B0_BASE、&I2CCONFIG_eUSCIB0);
MAP_I2C_setSlaveAddress (EUSCI_B0_BASE、0x47);//OPT3001 I2C 7位地址
MAP_I2C_setMode (EUSCI_B0_BASE、EUSCI_B_I2C_Receive_mode);//设置主设备以接收 OPT 数据
MAP_I2C_enableModule (EUSCI_B0_BASE);//启用 I2C 模块

这应将我的 MSP432设置为 I2C 连接中的主设备。 这是设置主设备的正确方法还是在错误路径上? 此外、我还需要将 OPT3001传感器设置为从设备吗?是否足够使用"setSlaveAddress"函数中的地址、它将被识别为支持 I2C 的外设?

现在、我正在尝试从传感器读取"lux"数据。 它保存在一个名为"结果"的寄存器中、该寄存器的长度为2字节。 我尝试使用此函数读取数据。

uint16_t readOPT3001数据(空)

uint8_t data[2];

setup_MSP432_receive();
MAP_I2C_masterReceiveStart (EUSCI_B0_BASE);
DATA[0]= MAP_I2C_masterReceiveMultiByteNext (EUSCI_B0_BASE);
DATA[1]= MAP_I2C_masterReceiveMultiByteFinish (EUSCI_B0_BASE);

我意识到我没有返回声明,我稍后将补充。 我的问题是"MAP_I2C_masterReceiveStart()"是否允许我从传感器读取数据? 如果我甚至不传递寄存器的地址、它如何知道如何从"结果"寄存器中读取? 此外、该器件:

DATA[0]= MAP_I2C_masterReceiveMultiByteNext (EUSCI_B0_BASE);
DATA[1]= MAP_I2C_masterReceiveMultiByteFinish (EUSCI_B0_BASE);

此部件似乎错误。 这些函数仅允许我读取一个字节、但寄存器为2个字节。 如何使用 I2C 读取该2字节寄存器?  

此外、我是否需要在每次传输后发送一个 ACK 位、或者函数本身是否执行此操作?

感谢您的帮助!

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

    尊敬的 Adem:

    是否有理由尝试使用 driverlib 而不是 TI 驱动程序?

    谢谢、

    Alexis

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

    我使用的是适用于 MSP432 Launchpad 的 FreeRTOS 演示的 driverlib 文件夹中提供的驱动程序。 我已经开始使用"opt3001.c" 文件中使用的函数。 我创建了一个任务:

    uint16_t RawOptValue = 0;

    void read_opt (void* pvParameters)
    {
    浮点转换 optValue = 0.0;
    
    sensorOpt3001Init();
    
    for (;;){
    sensorOpt3001Enable (真);
    vTaskDelay (PDM_TO_TICKs (1000));
    
    //测试传感器是否工作,如果工作正常,则 LED 闪烁100ms
    
    if (sensorOpt3001Test()== true)
    {
    configTOGGLE_LED();
    vTaskDelay (PDM_TO_TICKs (100));
    configTOGGLE_LED();
    }
    
    sensorOpt3001Read (&RawOptValue);
    sensorOpt3001Convert (RawOptValue、ConvertedOptValue);
    
    sensorOpt3001使能(false);
    
    
    //将数据发送到队列
    
    if (xOPTQueue!= NULL){
    xQueueSend (xOPTQueue、(void *)&ConvertOptedValue、0);
    }
    }
    

    使用 FreeRTOS 演示中 driverlib 中 opt3001.c 文件中的函数、我希望任务能够启用 OPT3001传感器、等待1秒、对传感器进行测试、 让 LED 闪烁100ms、然后测量并转换 lux 值、并将其发送到队列。 但是、if 语句永远不会为真、LED 永远也不会闪烁。 我是否对这些功能的工作方式有根本的误解?

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

    尊敬的 Adem:

    那么、为了澄清一下、您使用的是 MSP432P401R Launchpad 和 BOOSTXL-SENSORS BoosterPack? 您是否尝试按原样运行 i2copt3001示例?

    谢谢、

    Alexis

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

    尊敬的 Adem:

    我一段时间内没有听到您的反馈、因此我要关闭这个线程。 如果您有任何其他信息或问题、您可以回复或打开新主题。  

    谢谢、

    Alexis