各位前辈大家好,小弟正在做一个测气体浓度的项目,要用到LMP91000这款芯片,我在网上下载到了其基于MSP430单片机的code,程序一开始就对LMP91000进行设置,命令是0X48,我知道0X48是91000的地址,我的问题是难道直接写入地址,不用写入任何命令就可以从01–12中读取数据吗?然后后面又是写入0X00,写入0X18,让我不太理解,请用过的前辈为我解答一下,谢谢。
I2CSetup(LMP91000_I2C_Address); (0X48) // Initialize I2C modul
TI_LMP91000_MENB_PxOUT &= ~TI_LMP91000_MENB_PIN; // Enable \MENB Pin
TI_LMP91000_MENB_PxDIR |= TI_LMP91000_MENB_PIN; // Set pin direction is outpu
while (status == TI_LMP91000_NOT_READY) (0X00) // wait while device is not ready
status = LMP91000_I2CReadReg(TI_LMP91000_STATUS_REG); (0X00) // Read device ready status
read_val[0] = LMP91000_I2CReadReg(TI_LMP91000_LOCK_REG); (0X01) // Read from lock register default value
read_val[1] = LMP91000_I2CReadReg(TI_LMP91000_TIACN_REG); (0X10) // Read TIA control register default value
read_val[2] = LMP91000_I2CReadReg(TI_LMP91000_REFCN_REG); (0X11) // Read Reference control register default value
read_val[3] = LMP91000_I2CReadReg(TI_LMP91000_MODECN_REG); (0X12) // Read Mode control register default value
(0X01) (0X00)
LMP91000_I2CWriteReg(TI_LMP91000_LOCK_REG, TI_LMP91000_WRITE_UNLOCK); // unlock the registers for write
(0X10) (0X18)
LMP91000_I2CWriteReg(TI_LMP91000_TIACN_REG, TIACN_NEW_VALUE); // Modify TIA control register
read_val[1] = LMP91000_I2CReadReg(TI_LMP91000_TIACN_REG); // Read to confirm register is modified
(0X10)
// test if write/read values match
if (read_val[1] == TIACN_NEW_VALUE) (0X18)
{
while (1) // no error: blink LED continuously
{
__delay_cycles(250000);
__delay_cycles(250000);
TI_LMP91000_LED_PxOUT ^= TI_LMP91000_LED_PIN;
}
} else
{
TI_LMP91000_LED_PxOUT &= ~TI_LMP91000_LED_PIN; // error: Set LED OFF
}
(0X10) (0X03)
LMP91000_I2CWriteReg(TI_LMP91000_TIACN_REG, TI_LMP91000_TIACN_REG_VALUE); // store default value back in TIACN
(0X01) (0X00)
LMP91000_I2CWriteReg(TI_LMP91000_LOCK_REG, TI_LMP91000_WRITE_LOCK); // lock the registers
TI_LMP91000_MENB_PxOUT |= TI_LMP91000_MENB_PIN; // Disable \MENB Pin
Annie Liu:
关于您的问题,正在与产品工程师沟通,一旦有回复会尽快通知您。
您也可以跟进下面这个帖子,与产线工程师做进一步的沟通:https://e2e.ti.com/support/sensors/f/1023/t/897524
Annie Liu:
(寄存器0x02至0x09是保留的,因此读取它们毫无意义)
该过程将是(使用MENB作为芯片选择,或者如果在这里仅读取一个设备,则MENB线可以拉低)
1.首先读取状态寄存器,以查看设备是否准备就绪(这是可选的)2.可以读取寄存器0x10、0x11和0x12
或者
2.可以写入寄存器0x01,进行解锁,然后可以修改寄存器0x10、0x11,例如:
解锁和写入3个寄存器(缩小)
通过I2C进行解锁操作(放大)
用0x0E写入0x10(放大)
用0xC0写入0x11(放大)
用0x03写入0x12(放大)
3.可以写入寄存器0x01,以重新锁定(如果需要)
无需进行上述解锁操作即可写入寄存器0x12。
在您引用的MSP430代码中,有4个演示应用程序示例-修改之前请先检查它们。
user6322020:
回复 Annie Liu:
谢谢您的回复,我再问三个问题:
1 我用LMP91000测气体浓度,是否是通过IIC总线给LMP91000写入命令,然后用单片机AD口采样LMP91000的VOUT端信号,那个就是浓度值是吗?我现在就是这样测得,测得的数据一直为0V,我是没有加电极测得,相当于是LMP91000空载。
2 关于LMP91000的C1端与C2端的电阻值如何选择,我看有些手册上是将C1与C2间接一个0欧电阻,如下图所示,但是C1与C2间不是用来配置TIA的跨阻阻抗的吗?如果接0欧电阻,不是将配置的跨阻阻抗短路了吗?如下图所示。
3 最后您能帮我看下我的寄存器设置是否正确吗
void LMP91000_INIT(void){ LMP91000_IO_INIT(); i2c_Start(); i2c_SendByte(0x48); i2c_SendByte(0x01); i2c_SendByte(0x00); i2c_Stop(); i2c_Delay(); i2c_Delay();
i2c_Start(); i2c_SendByte(0x48); i2c_SendByte(0x10); i2c_SendByte(0x0C); i2c_Stop(); i2c_Delay(); i2c_Delay();
i2c_Start(); i2c_SendByte(0x48); i2c_SendByte(0x11); i2c_SendByte(0xC0); i2c_Stop(); i2c_Delay(); i2c_Delay();
i2c_Start(); i2c_SendByte(0x48); i2c_SendByte(0x01); i2c_SendByte(0x01); i2c_Stop(); i2c_Delay(); i2c_Delay();
i2c_Start(); i2c_SendByte(0x48); i2c_SendByte(0x12); i2c_SendByte(0x03); i2c_Stop(); i2c_Delay(); i2c_Delay();}
Annie Liu:
回复 user6322020:
TIA电阻增益可以在内部设置(对于该寄存器中的位4:2,使用寄存器0x10,值001b至111b),或者将寄存器0x10设置为外部(使用相同的位并设置为000b),并且增益设置为 使用外部电阻器完成-它(没有显示或描述)不是短路或为零欧姆。
可以使用EVM工具找到传感器示例设置-
https://www.ti.com/lit/zip/snac007 (this is the software)
https://www.ti.com/tool/LMP91000EVM(传感器板,可以直接连接到MCU,产品页面上提供了MSP430源代码)
您可以从数据库中选择要使用的传感器并获得基本设置-在这里您可以看到氧气传感器的示例
选择传感器:
然后查看设置