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.

[参考译文] MSP430I2041:MSP430I2014 DriverLib I2C 驱动程序-针对具有重复启动条件的 I2C 外设寄存器读取的正确 DriverLib I2C API 调用顺序

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/777717/msp430i2041-msp430i2014-driverlib-i2c-driver---proper-driverlib-i2c-api-call-order-for-i2c-peripheral-register-reads-with-repeat-start-condition

器件型号:MSP430I2041
主题中讨论的其他器件:OPT3001-Q1LP8860-Q1OPT3001MSP430FR2355

我已成功使用 DriverLib I2C 驱动程序在 LP8860-Q1背光控制器上写入寄存器。 我需要帮助的是以正确的顺序调用正确的 DriverLib 主模式 API 调用、以便从 OPT3001-Q1环境光传感器读取数据。 我已阅读 DriverLib 用户指南和 HTML 文档、但没有足够的详细信息来了解如何正确混合 API 调用以获得具有重复起始条件的组合写入/读取、从而满足 OPT3001-Q1读取周期要求。 I2C DriverLib 代码示例都不会显示正确的 API 调用顺序。 请帮助我了解在 OPT3001-Q1上的读取周期应使用的 API 调用顺序。 谢谢您...

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    没有正确的调用顺序;driverlib 不直接支持重复的启动条件。

    您必须首先执行写入事务、而不执行停止操作(例如 USCI_B_I2C_masterSendMultiByteStart)、然后(无 driverlib)等待 TXIFG 被置位、将其清零、然后执行读取事务。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    对于 OPT3001、显示了 I2C 写入和 I2C 读取周期。 在这种情况下、我不想写入寄存器而只读取寄存器。 在对寄存器进行读取时、在部分写入周期内推出的最后一个 RA (寄存器地址)将用作读取的寄存器地址。 我们是否真的无法使用 API 来完成此序列? 如果您不想执行完全写入、则必须发送 WRITE 命令的前两个字节、后跟一个重复的 START 条件、然后发送如下所示的完整读取命令序列。 这种类型的寄存器读取协议并不是所有的异常协议、如果 DriverLib API 目前还不支持它、则应该支持它。 可以就此问题获得 TI 的答复吗?

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

    请参阅 MSP430F5359:使用 driverlib 处理重复起始条件:奇怪的停止条件

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

    大家好、Tishebur、

    我已查看 MSP430驱动程序库 MSP430i2xx 用户指南MSP430驱动程序库 MSP430i2xx API 指南。 有多个字节写入和读取的 API 函数的说明。  

    使用 EUSCI_B I2C 进行主多字节传输:  

    • EUSCI_B_I2C_masterSendMultiByteStart();  
    • EUSCI_B_I2C_masterSendMultiByteNext();
    • EUSCI_B_I2C_masterSendMultiByteStop();

     使用 EUSCI_B I2C 的主多字节接收:

    • EUSCI_B_I2C_masterReceiveMultiByteStart();
    • EUSCI_B_I2C_masterReceiveMultiByteNext();
    • EUSCI_B_I2C_masterReceiveMultiByteFinish();
    • EUSCI_B_I2C_masterReceiveMultiByteStop();

    对于您的情况、请尝试使用这些函数来读取/写入 OPT3001。  

    此致、  

    Lixin  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    一个重复起始条件是一个不跟在一个停止条件之后的起始条件。 它的设计使您可以在与器件通信期间发出多个启动条件、而不会将总线发送到另一个发送器。 我认为、如果我可以发送从器件地址和寄存器地址、而不发送 STOP、然后发送另一个 START、那么我应该是可以的。 除了第一部分中使用的 EUSCI_B_I2C_masterSendMultiByteStop()之外,您的序列是正确的。 此外、由于读取/写入位必须翻转、因此我认为您还必须从写入模式切换到读取模式。 我今天将尝试一下、看看它是否起作用。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    未经请求:我尚未遇到需要重复启动的 I2C 从设备(尽管他们的数据表中有声明)。 它确实为您节省了一个停止条件(1-2位时间)。

    话虽如此:我认为在某个地方有一个重复启动示例、但可能不适用于 I2041。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    大家好、Tshelbur、

    您可以发送从器件地址和寄存器地址、在发送停止之后跟随 EUSCI_B_I2C_masterReceiveStart ()、然后使用 EUSCI_B_I2C_masterReceiveMultiByteNext ()读取多个数据。

    我们有一个用于 MSP430FR2355的驱动程序示例代码、用于按照附件的方式写入/读取 OPT3001。 它是 CCS 项目。 您可以参考它并轻松地将其轮询至 MSP430i2041。  

    请尝试一下、如果您有任何其他问题、请告诉我。  

    此致、  

    Lixin e2e.ti.com/.../OPT3001_5F00_MSP_2D00_EXP430FR2355.zip

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

    谢谢、我已经下载了此示例、现在我正在查看代码。 我应该能够很快给它一个尝试、并提供有关它工作效果的反馈。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    大家好、Tshelbur、
    您是否已尝试过、是否成功解决了问题?

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

    我现在可以使用它、但仅在调试和尝试不同的方法和 API 调用顺序之后、才会使用这里和提供的示例文件中建议的方法和 API 调用顺序。 我仍然遇到 LP8860-Q1读取问题、LP8860-Q1写入现在工作、OPT3001-Q1读取和写入现在都工作。 为什么 LP8860-Q1读取不起作用对我来说毫无意义。 以下读取和写入函数(还需要执行其他步骤才能正确清除此代码之外的中断、否则这些操作将无法正常工作。 我还必须从基于中断的模式切换到轮询模式、才能使任何内容正常工作(即使我之前使用的是 LP8860-Q1写入操作中断。 轮询模式和中断模式的 API 文档需要改进、这样就不必查看整个驱动程序代码即可大致正常工作。 此当前代码还没有使用超时...

    (笑声)

    /*初始化 I2C (LP8860地址、LP8860_SLAVE_ADDR<0x2D>用于写入)、SCL (P1.6、引脚23)和 SDA (P1.7、引脚24)... *

    sMasterParams.selectClockSource = EUSCI_B_I2C_CLOCKSOURCE_SMCLK;
    sMasterParams.i2cClk = 4096000;
    sMasterParams.datarate = EUSCI_B_I2C_SET_DATA_RATE 400KBPS;
    sMasterParams.byteCounterThreshold = 0;
    sMasterParams.autoSTOPGeneration = EUSCI_B_I2C_NO_AUTO_STOP;
    EUSCI_B_I2C_initMaster (EUSCI_B0_BASE,&sMasterParams);//初始化 I2C 端口以主模式... *
    EUSCI_B_I2C_setSlaveAddress (EUSCI_B0_BASE、LP8860_SLAVE_ADDR);//设置 LP8860-Q1从器件 I2C 地址... *
    EUSCI_B_I2C_clearInterrupt (EUSCI_B0_BASE,(EUSCI_B_I2C_Transmit INTERRUPT0 | EUSCI_B_I2C_NAK_INTERRUPT));
    EUSCI_B_I2C_ENABLE (EUSCI_B0_BASE);//启用 I2C 端口以开始操作... *

    (笑声)

    /*********
    **
    *函数:void i2c_lp8860_write (uint8_t u8SlaveAddress、*
    * uint8_t u8RegisterAddress、*
    * uint8_t u8Data *
    *说明:此函数向 LP8860器件发送 I2C 写入... *
    *返回:void *
    **
    秘书长的报告 /
    void i2c_lp8860_write (uint8_t u8SlaveAddress、uint8_t u8RegisterAddress、uint8_t u8Data)

    /*确保发送完最后一个交易*/
    while (eUSCI_B_I2C_masterIsStopSent (eUSCI_B0_BASE)== eUSCI_B_I2C_Sending _stop);
    __DELAY_CYCLS (50);/* LP8860-Q1要求的停止和启动条件之间的最小值为1.3usec ... *

    /*复制 I2C 写入数据和复位索引... *
    I2C_LP8860_Write_Data[0]= u8RegisterAddress;//设置寄存器地址... *
    I2C_LP8860_Write_Data[1]= u8Data;//将数据设置为写入... *

    /*配置正确的 I2C 从地址和读/写模式... *
    EUSCI_B_I2C_setMode (EUSCI_B0_BASE、EUSCI_B_I2C_Transmit _mode);
    EUSCI_B_I2C_setSlaveAddress (EUSCI_B0_BASE,u8SlaveAddress);
    EUSCI_B_I2C_clearInterrupt (EUSCI_B0_BASE、EUSCI_B_I2C_Transmit INTERRUPT0);
    while (eUSCI_B_I2C_isBusBusy (eUSCI_B0_BASE));
    EUSCI_B_I2C_masterSendMultiByteStart (EUSCI_B0_BASE、I2C_LP8860_Write_Data[0]);
    EUSCI_B_I2C_masterSendMultiByteFinish (EUSCI_B0_BASE、I2C_LP8860_Write_Data[1]);

    /*********
    **
    *函数:void i2c_lp8860_read (uint8_t u8SlaveAddress、*
    * uint8_t u8RegisterAddress、*
    * uint8_t* pu8Data )*
    *说明:此函数向 LP8860器件发送/rcv I2C 读取... *
    *返回:void *
    **
    秘书长的报告 /
    void i2c_lp8860_read (uint8_t u8SlaveAddress、uint8_t u8RegisterAddress、uint8_t* pu8Data)

    /*确保发送完最后一个交易*/
    while (eUSCI_B_I2C_masterIsStopSent (eUSCI_B0_BASE)== eUSCI_B_I2C_Sending _stop);
    __DELAY_CYCLS (50);/* LP8860-Q1要求的启动和停止条件之间的最小值为1.3usec ... *

    /*复制 I2C 读取数据和复位索引... *
    I2C_LP8860_Read_Data[0]= u8RegisterAddress;//设置寄存器地址... *
    I2C_LP8860_Read_Data[1]= 0;//清除要读取的数据... *

    /*配置正确的 I2C 从地址和读/写模式... *
    EUSCI_B_I2C_setMode (EUSCI_B0_BASE、EUSCI_B_I2C_Transmit _mode);
    EUSCI_B_I2C_setSlaveAddress (EUSCI_B0_BASE,u8SlaveAddress);
    EUSCI_B_I2C_clearInterrupt (EUSCI_B0_BASE、EUSCI_B_I2C_Transmit INTERRUPT0);
    while (eUSCI_B_I2C_isBusBusy (eUSCI_B0_BASE));
    EUSCI_B_I2C_masterSendMultiByteStart (EUSCI_B0_BASE、I2C_LP8860_Write_Data[0]);
    while (!EUSCI_B_I2C_getInterruptStatus (EUSCI_B0_BASE、EUSCI_B_I2C_Transmit INTERRUPT0));
    EUSCI_B_I2C_masterSendMultiByteStop( EUSCI_B0_BASE );
    while (!EUSCI_B_I2C_getInterruptStatus (EUSCI_B0_BASE、EUSCI_B_I2C_STOP_INTERRUPT));
    EUSCI_B_I2C_masterReceiveStart( EUSCI_B0_BASE );
    while (!EUSCI_B_I2C_getInterruptStatus (EUSCI_B0_BASE、EUSCI_B_I2C_Receive_INTERRUPT0));
    I2C_LP8860_Read_Data[1]= EUSCI_B_I2C_masterReceiveMultiByteFinish (EUSCI_B0_BASE);

    /*将 I2C 读取复制到用户数据空间... *
    * pu8Data = I2C_LP8860_Read_Data[1];

    /*********
    **
    *函数:void i2c_opt3001_write (uint8_t u8SlaveAddress、*
    * uint8_t u8RegisterAddress、*
    * uint16_t u16Data *
    *说明:此函数向 OPT3001器件发送 I2C 写入... *
    *返回:void *
    **
    秘书长的报告 /
    void i2c_opt3001_write (uint8_t u8SlaveAddress、uint8_t u8RegisterAddress、uint16_t u16Data)

    /*确保发送完最后一个交易*/
    while (eUSCI_B_I2C_masterIsStopSent (eUSCI_B0_BASE)== eUSCI_B_I2C_Sending _stop);
    __DELAY_CYCLS (50);/* LP8860-Q1要求的启动和停止条件之间的最小值为1.3usec ... *

    /*复制 I2C 写入数据和复位索引... *
    I2C_OPT3001_Write_Data[0]= u8RegisterAddress;
    I2C_OPT3001_Write_Data[1]=(uint8_t)(u16Data>>8);// MSB */
    I2C_OPT3001_Write_Data[2]=(uint8_t) u16Data;/* LSB *

    /*配置正确的 LP8860 I2C 从器件地址和读/写模式... *
    EUSCI_B_I2C_setMode (EUSCI_B0_BASE、EUSCI_B_I2C_Transmit _mode);
    EUSCI_B_I2C_setSlaveAddress (EUSCI_B0_BASE,u8SlaveAddress);
    EUSCI_B_I2C_clearInterrupt (EUSCI_B0_BASE、EUSCI_B_I2C_Transmit INTERRUPT0);
    while (eUSCI_B_I2C_isBusBusy (eUSCI_B0_BASE));
    EUSCI_B_I2C_masterSendMultiByteStart (EUSCI_B0_BASE、I2C_OPT3001_Write_Data[0]);
    EUSCI_B_I2C_masterSendMultiByteNext (EUSCI_B0_BASE、I2C_OPT3001_Write_Data[1]);
    EUSCI_B_I2C_masterSendMultiByteFinish (EUSCI_B0_BASE、I2C_OPT3001_Write_Data[2]);

    /*********
    **
    *函数:void i2c_opt3001_read (uint8_t u8SlaveAddress、*
    * uint8_t u8RegisterAddress、*
    * uint16_t* pu16Data)*
    *说明:此函数向 OPT3001器件发送 I2C 读取... *
    *返回:void *
    **
    秘书长的报告 /
    void i2c_opt3001_read (uint8_t u8SlaveAddress、uint8_t u8RegisterAddress、uint16_t* pu16Data)

    /*确保发送完最后一个交易*/
    while (eUSCI_B_I2C_masterIsStopSent (eUSCI_B0_BASE)== eUSCI_B_I2C_Sending _stop);
    __DELAY_CYCLS (50);/* LP8860-Q1要求的启动和停止条件之间的最小值为1.3usec ... *

    I2C_OPT3001_READ_Data[0]= u8RegisterAddress;
    I2C_OPT3001_READ_Data[1]= 0;/*寄存器值 LSB…… *
    I2C_OPT3001_READ_Data[2]= 0;/*寄存器值 LSB…… *

    /*将主设备设置为发送模式 PL */
    EUSCI_B_I2C_setMode (EUSCI_B0_BASE、EUSCI_B_I2C_Transmit _mode);
    EUSCI_B_I2C_setSlaveAddress (EUSCI_B0_BASE,u8SlaveAddress);
    EUSCI_B_I2C_clearInterrupt (EUSCI_B0_BASE、EUSCI_B_I2C_Transmit INTERRUPT0);
    while (eUSCI_B_I2C_isBusBusy (eUSCI_B0_BASE));
    EUSCI_B_I2C_masterSendMultiByteStart (EUSCI_B0_BASE、I2C_OPT3001_READ_Data[0]);
    while (!EUSCI_B_I2C_getInterruptStatus (EUSCI_B0_BASE、EUSCI_B_I2C_Transmit INTERRUPT0));
    EUSCI_B_I2C_masterSendMultiByteStop( EUSCI_B0_BASE );
    while (!eUSCI_B_I2C_getInterruptStatus (eUSCI_B0_BASE、eUSCI_B_I2C_STOP_INTERRUPT)));
    EUSCI_B_I2C_masterReceiveStart( EUSCI_B0_BASE );
    while (!eUSCI_B_I2C_getInterruptStatus (eUSCI_B0_BASE、eUSCI_B_I2C_Receive_INTERRUPT0));
    I2C_OPT3001_READ_Data[1]= EUSCI_B_I2C_masterReceiveMultiByteNext (EUSCI_B0_BASE);
    I2C_OPT3001_READ_Data[2]= EUSCI_B_I2C_masterReceiveMultiByteFinish (EUSCI_B0_BASE);

    /*将读取的数据复制到用户空间... *
    *pu16Data =(uint16_t)(((uint16_t)I2C_OPT3001_READ_Data[1])<<8)|((uint16_t)I2C_OPT3001_READ_Data[2]));

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

    大家好、Tshelbur、

    好极了、OPT3001 I2C 写入和读取工作正常。

    对于 LP8860-Q1的读取、除拼写错误外、代码没有问题:

    • /*配置正确的 I2C 从地址和读/写模式... *
    • EUSCI_B_I2C_setMode (EUSCI_B0_BASE、EUSCI_B_I2C_Transmit _mode);
    • EUSCI_B_I2C_setSlaveAddress (EUSCI_B0_BASE,u8SlaveAddress);
    • EUSCI_B_I2C_clearInterrupt (EUSCI_B0_BASE、EUSCI_B_I2C_Transmit INTERRUPT0);
    • while (eUSCI_B_I2C_isBusBusy (eUSCI_B0_BASE));
    • EUSCI_B_I2C_masterSendMultiByteStart (EUSCI_B0_BASE、I2C_LP8860_Write_Data[0]  -> I2C_LP8860_Read_Data[0]);
    • while (!EUSCI_B_I2C_getInterruptStatus (EUSCI_B0_BASE、EUSCI_B_I2C_Transmit INTERRUPT0));
    • EUSCI_B_I2C_masterSendMultiByteStop( EUSCI_B0_BASE );
    • while (!EUSCI_B_I2C_getInterruptStatus (EUSCI_B0_BASE、EUSCI_B_I2C_STOP_INTERRUPT));
    • EUSCI_B_I2C_masterReceiveStart( EUSCI_B0_BASE );
    • while (!EUSCI_B_I2C_getInterruptStatus (EUSCI_B0_BASE、EUSCI_B_I2C_Receive_INTERRUPT0));
    • I2C_LP8860_Read_Data[1]= EUSCI_B_I2C_masterReceiveMultiByteFinish (EUSCI_B0_BASE);

    我认为在你纠正它后它会很好地工作。  

    如果您有任何其他问题、请告诉我。  

    此致、

    Lixin

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

    好极了、OPT3001 I2C 写入和读取工作正常。

    对于 LP8860-Q1的读取、除拼写错误外、代码没有问题:

    /*配置正确的 I2C 从地址和读/写模式... *
    EUSCI_B_I2C_setMode (EUSCI_B0_BASE、EUSCI_B_I2C_Transmit _mode);
    EUSCI_B_I2C_setSlaveAddress (EUSCI_B0_BASE,u8SlaveAddress);
    EUSCI_B_I2C_clearInterrupt (EUSCI_B0_BASE、EUSCI_B_I2C_Transmit INTERRUPT0);
    while (eUSCI_B_I2C_isBusBusy (eUSCI_B0_BASE));
    EUSCI_B_I2C_masterSendMultiByteStart (EUSCI_B0_BASE、I2C_LP8860_Write_Data[0]-> I2C_LP8860_Read_Data[0]);
    while (!EUSCI_B_I2C_getInterruptStatus (EUSCI_B0_BASE、EUSCI_B_I2C_Transmit INTERRUPT0));
    EUSCI_B_I2C_masterSendMultiByteStop( EUSCI_B0_BASE );
    while (!EUSCI_B_I2C_getInterruptStatus (EUSCI_B0_BASE、EUSCI_B_I2C_STOP_INTERRUPT));
    EUSCI_B_I2C_masterReceiveStart( EUSCI_B0_BASE );
    while (!EUSCI_B_I2C_getInterruptStatus (EUSCI_B0_BASE、EUSCI_B_I2C_Receive_INTERRUPT0));
    I2C_LP8860_Read_Data[1]= EUSCI_B_I2C_masterReceiveMultiByteFinish (EUSCI_B0_BASE);
    我认为在你纠正它后它会很好地工作。

    如果您有任何其他问题、请告诉我。

    此致、

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

    感谢第二组眼睛、这不是第一次、也不是最后一次、因为剪贴错误会浪费大量软件工程师的时间!

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

    发送 EUSCI_B_I2C_ReceivmasterStart()后代码卡住,因为我正在等待接收中断,而不是检查正在完成的启动操作。 下面的代码不会更改为等待启动完成而不是接收中断、这是正确的更改吗?

    /*********
    * *
    *函数:void i2c_lp8860_write (uint8_t u8SlaveAddress、 *
    * uint8_t u8RegisterAddress、 *
    * uint8_t u8Data) *
    *说明:此函数向 LP8860器件发送 I2C 写入... *
    *返回: 无效 *
    * *
    秘书长的报告 /
    void i2c_lp8860_write (uint8_t u8SlaveAddress、uint8_t u8RegisterAddress、uint8_t u8Data)

    /*确保发送完最后一个交易*/
    while (eUSCI_B_I2C_masterIsStopSent (eUSCI_B0_BASE)== eUSCI_B_I2C_Sending _stop);
    __DELAY_CYCLS (100);/* LP8860-Q1要求的停止和启动条件之间的最小值为1.3usec ... *

    /*出于调试目的独立跟踪读取/写入数据... *
    I2C_LP8860_Write_Data[0]= u8RegisterAddress;//设置寄存器地址... *
    I2C_LP8860_Write_Data[1]= u8Data; /*将数据设置为写入... *

    /*配置正确的 I2C 从地址和读/写模式... *
    EUSCI_B_I2C_setMode (EUSCI_B0_BASE、EUSCI_B_I2C_Transmit _mode);
    EUSCI_B_I2C_setSlaveAddress (EUSCI_B0_BASE,u8SlaveAddress);
    EUSCI_B_I2C_clearInterrupt (EUSCI_B0_BASE、EUSCI_B_I2C_Transmit INTERRUPT0);
    while (eUSCI_B_I2C_isBusBusy (eUSCI_B0_BASE));
    EUSCI_B_I2C_masterSendMultiByteStart (EUSCI_B0_BASE、I2C_LP8860_Write_Data[0]);
    EUSCI_B_I2C_masterSendMultiByteFinish (EUSCI_B0_BASE、I2C_LP8860_Write_Data[1]);
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    抱歉、代码错误...这是正确的代码...

    /*********
    * *
    *函数:void i2c_lp8860_read (uint8_t u8SlaveAddress、 *
    * uint8_t u8RegisterAddress、 *
    * uint8_t* pu8Data) *
    *说明:此函数向 LP8860器件发送/rcv I2C 读取... *
    *返回: 无效 *
    * *
    秘书长的报告 /
    void i2c_lp8860_read (uint8_t u8SlaveAddress、uint8_t u8RegisterAddress、uint8_t* pu8Data)

    /*确保发送完最后一个交易*/
    while (eUSCI_B_I2C_masterIsStopSent (eUSCI_B0_BASE)== eUSCI_B_I2C_Sending _stop);
    __DELAY_CYCLS (100);/* LP8860-Q1要求的启动和停止条件之间的最小值为1.3usec ... *

    /*出于调试目的独立跟踪读取/写入数据... *
    I2C_LP8860_Read_Data[0]= u8RegisterAddress;//设置寄存器地址... *
    I2C_LP8860_READ_Data[1]= 0; /*清除要读取的数据... *

    /*配置正确的 I2C 从地址和读/写模式... *
    EUSCI_B_I2C_setMode (EUSCI_B0_BASE、EUSCI_B_I2C_Transmit _mode);
    EUSCI_B_I2C_setSlaveAddress (EUSCI_B0_BASE,u8SlaveAddress);
    EUSCI_B_I2C_clearInterrupt (EUSCI_B0_BASE、EUSCI_B_I2C_Transmit INTERRUPT0);
    while (eUSCI_B_I2C_isBusBusy (eUSCI_B0_BASE));
    EUSCI_B_I2C_masterSendMultiByteStart (EUSCI_B0_BASE、I2C_LP8860_Read_Data[0]);
    while (!EUSCI_B_I2C_getInterruptStatus (EUSCI_B0_BASE、EUSCI_B_I2C_Transmit INTERRUPT0));
    EUSCI_B_I2C_masterSendMultiByteStop( EUSCI_B0_BASE );
    while (!EUSCI_B_I2C_getInterruptStatus (EUSCI_B0_BASE、EUSCI_B_I2C_STOP_INTERRUPT));
    EUSCI_B_I2C_masterReceiveStart( EUSCI_B0_BASE );
    while (eUSCI_B_I2C_masterIsStartSent (eUSCI_B0_BASE)== eUSCI_B_I2C_Sending _start);
    I2C_LP8860_Read_Data[1]= EUSCI_B_I2C_masterReceiveMultiByteFinish (EUSCI_B0_BASE);

    /*将 I2C 读取复制到用户数据空间... *
    * pu8Data = I2C_LP8860_Read_Data[1];
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    大家好、Tshelbur、

    我不知道为什么您在 EUSCI_B_I2C_masterReceiveStart (EUSCI_B0_BASE)之后更改了代码?
    原始代码为:
    •EUSCI_B_I2C_masterReceiveStart( EUSCI_B0_BASE );
    •while (!EUSCI_B_I2C_getInterruptStatus (EUSCI_B0_BASE、EUSCI_B_I2C_Receive_INTERRUPT0));
    •I2C_LP8860_Read_Data[1]= EUSCI_B_I2C_masterReceiveMultiByteFinish (EUSCI_B0_BASE);
    但请检查上面的代码。

    此致、
    Lixin
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    大家好、Tshelbur、
    与 OPT3001 I2C 读取函数相比、检查代码更好、因为它是相似的。 当遇到问题时、最好使用示波器检查波形以找出根本原因。 我现在要关闭这个线程。 如果您有更多问题、请直接回复此主题或发布其他帖子。

    此致、
    Lixin