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.
我已成功使用 DriverLib I2C 驱动程序在 LP8860-Q1背光控制器上写入寄存器。 我需要帮助的是以正确的顺序调用正确的 DriverLib 主模式 API 调用、以便从 OPT3001-Q1环境光传感器读取数据。 我已阅读 DriverLib 用户指南和 HTML 文档、但没有足够的详细信息来了解如何正确混合 API 调用以获得具有重复起始条件的组合写入/读取、从而满足 OPT3001-Q1读取周期要求。 I2C DriverLib 代码示例都不会显示正确的 API 调用顺序。 请帮助我了解在 OPT3001-Q1上的读取周期应使用的 API 调用顺序。 谢谢您...
对于 OPT3001、显示了 I2C 写入和 I2C 读取周期。 在这种情况下、我不想写入寄存器而只读取寄存器。 在对寄存器进行读取时、在部分写入周期内推出的最后一个 RA (寄存器地址)将用作读取的寄存器地址。 我们是否真的无法使用 API 来完成此序列? 如果您不想执行完全写入、则必须发送 WRITE 命令的前两个字节、后跟一个重复的 START 条件、然后发送如下所示的完整读取命令序列。 这种类型的寄存器读取协议并不是所有的异常协议、如果 DriverLib API 目前还不支持它、则应该支持它。 可以就此问题获得 TI 的答复吗?
大家好、Tishebur、
我已查看 MSP430驱动程序库 MSP430i2xx 用户指南 和 MSP430驱动程序库 MSP430i2xx API 指南。 有多个字节写入和读取的 API 函数的说明。
使用 EUSCI_B I2C 进行主多字节传输:
使用 EUSCI_B I2C 的主多字节接收:
对于您的情况、请尝试使用这些函数来读取/写入 OPT3001。
此致、
Lixin
大家好、Tshelbur、
您可以发送从器件地址和寄存器地址、在发送停止之后跟随 EUSCI_B_I2C_masterReceiveStart ()、然后使用 EUSCI_B_I2C_masterReceiveMultiByteNext ()读取多个数据。
我们有一个用于 MSP430FR2355的驱动程序示例代码、用于按照附件的方式写入/读取 OPT3001。 它是 CCS 项目。 您可以参考它并轻松地将其轮询至 MSP430i2041。
请尝试一下、如果您有任何其他问题、请告诉我。
此致、
谢谢、我已经下载了此示例、现在我正在查看代码。 我应该能够很快给它一个尝试、并提供有关它工作效果的反馈。
我现在可以使用它、但仅在调试和尝试不同的方法和 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的读取、除拼写错误外、代码没有问题:
我认为在你纠正它后它会很好地工作。
如果您有任何其他问题、请告诉我。
此致、
Lixin
感谢第二组眼睛、这不是第一次、也不是最后一次、因为剪贴错误会浪费大量软件工程师的时间!