微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > ccs811模式转换怎么写寄存器

ccs811模式转换怎么写寄存器

时间:10-02 整理:3721RD 点击:
正在调试CCS811传感器,就是从程序流程图中,先读ID0x81,再读状态寄存器0X10,也正确,就是模式转换,写寄存器0XF4是怎么写的,怎么模式转换不过来?有调试过的能支援下么?

写了0XF4之后,读不到0x90,传感器总不正确

感觉之后检测错误,芯片自动进入转换模式

你有没有调通好了的ccs8511的程序发我一份啊!qq邮箱:852085546@qq.com谢谢啊

你怎么读到的HW_ID?跪求代码

同跪代码 上电数据就不正常,复位后可以读数据。

{
  start_IIc();
  sendbyte(0xB4);
  sendbyte(0x01);
  sendbyte(0x08);
//        stop_IIc();
//  start_IIc();
        stop_IIc();
}

{
  start_IIc();
  sendbyte(0xB4);
  sendbyte(0xF4);
//        stop_IIc();
//  start_IIc();
        stop_IIc();
}

TVOC = 0(ppb)
CO2 = 400(ppm)
TVOC = 0(ppb)
CO2 = 400(ppm)
TVOC = 0(ppb)
CO2 = 400(ppm)
TVOC = 20(ppb)
CO2 = 536(ppm)
TVOC = 3(ppb)
CO2 = 421(ppm)
TVOC = 0(ppb)
CO2 = 400(ppm)
TVOC = 0(ppb)
CO2 = 400(ppm)
TVOC = 0(ppb)
CO2 = 400(ppm)
TVOC = 29(ppb)
CO2 = 592(ppm)
TVOC = 6(ppb)
CO2 = 443(ppm)
TVOC = 1(ppb)
CO2 = 413(ppm)
TVOC = 0(ppb)
CO2 = 404(ppm)
TVOC = 0(ppb)
CO2 = 400(ppm)
TVOC = 0(ppb)
CO2 = 400(ppm)
TVOC = 0(ppb)
CO2 = 401(ppm)
TVOC = 0(ppb)
CO2 = 401(ppm)
TVOC = 0(ppb)
CO2 = 405(ppm)

重新上电后数据就不对了
TVOC = 65021(ppb)
CO2 = 65021(ppm)
TVOC = 65021(ppb)
CO2 = 65021(ppm)
TVOC = 65021(ppb)
CO2 = 65021(ppm)
TVOC = 65021(ppb)
CO2 = 65021(ppm)
TVOC = 65021(ppb)
CO2 = 65021(ppm)
TVOC = 65021(ppb)
CO2 = 65021(ppm)
TVOC = 65021(ppb)
CO2 = 65021(ppm)
TVOC = 65021(ppb)
CO2 = 65021(ppm)
TVOC = 65021(ppb)
CO2 = 65021(ppm)
TVOC = 32896(ppb)
CO2 = 0(ppm)
TVOC = 32896(ppb)
CO2 = 128(ppm)
TVOC = 65535(ppb)
CO2 = 65535(ppm)
TVOC = 32896(ppb)
CO2 = 0(ppm)
TVOC = 65535(ppb)
CO2 = 65535(ppm)
//可愁死了

跪求代码,最近搞这个,希望可以参考一下

#include "HT01.h"
#define SCLL1               GPIOB->BRR = GPIO_Pin_10
#define SCLH1               GPIOB->BSRR = GPIO_Pin_10                                             
#define SDAL1               GPIOB->BRR = GPIO_Pin_11
#define SDAH1                                GPIOB->BSRR = GPIO_Pin_11
#define SDA_STATE                        GPIOB->IDR&GPIO_Pin_11
u16 CO2, TVOC;
u16 I2C_RX[4];
u16 I2C_RX1[4];
u16 I2C_RX2[4];
void HT_Init (void)
{
        GPIO_InitTypeDef GPIO_InitStructure;
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB , ENABLE);
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
        GPIO_Init(GPIOB, &GPIO_InitStructure);
       
}
void start_IIc(void)
{
        /* SDA,SCL都为高,准备发送起始条件 */
        SDAH1;
        delay_us(2);
        SCLH1;
        delay_us(10);
   
        /* 发送起始条件: SCL高, SDA高->低 */
        SDAL1;
        delay_us(10);
        SCLL1;
        delay_us(4);
        return;
        // delay_us(1);
}
void stop_IIc(void)
{
        /* 结束条件: SCL高, SDA低->高 */
        SDAL1;
        delay_us(2);     
        SCLH1;
        delay_us(10);
        SDAH1;
        delay_us(8);
        return;
}
u8 sendbyte(unsigned char c)
{
        u8 i,ack;
        for(i=0; i<8; i++)       
        {
                if((c << i) & 0x80)               
                {
                        SDAH1;   
                }
        else   
                {
                        SDAL1;               
                }
                delay_us(10);
                SCLH1;
                delay_us(10);
                SCLL1;
        }
   
        delay_us(4);
        SDAH1;
        delay_us(6);   
        SCLH1;
        delay_us(10);
        if(SDA_STATE)
        {
                ack = 1;     
        }
        else
        {
                ack = 0;               
        }
        SCLL1;
        delay_us(4);
        return ack;
}
u8 RcvByte(void)
{
        u8 i,retc=0;
       
        /* ? */
        SDAH1;       
        for(i=0; i<8; i++)
        {
                SCLL1;
                delay_us(10);
                SCLH1;
                delay_us(10);
                retc = retc << 1;
                if(SDA_STATE)
                {
                        retc++;
                }
        }
        SCLL1;   
        delay_us(10);
        return retc;
}
void Ack_I2c(unsigned char a)
{
        /* 发送应答或非应答信号 */
        if(a == 0)       
        {
                SDAL1;        /* 应答 */        
        }
        else
        {
                SDAH1;        /* 非应答 */
        }
        delay_us(6);      
        SCLH1;
        delay_us(10);
        SCLL1;
        delay_us(4);   
       
        return;
}
void HT_Mode(void)
{
  start_IIc();
  sendbyte(0xB4);
  sendbyte(0xF4);
//        stop_IIc();
//  start_IIc();
        stop_IIc();
}
void HT_Set(void)
{
  start_IIc();
  sendbyte(0xB4);
  sendbyte(0x01);
  sendbyte(0x18);
//        stop_IIc();
//  start_IIc();
        stop_IIc();
}
void IAQ( u16 *s, u8 length )
{
        u8 i;
  start_IIc();
  sendbyte(0xB4);
  sendbyte(0x02);
//        stop_IIc();
  start_IIc();
  sendbyte(0xB5);
       
        for(i = 0; i < (length - 1); i++)
        {   
                *s = RcvByte();
                Ack_I2c(0);
                s++;
        }
        *s = RcvByte();
      
  Ack_I2c(1);       
        stop_IIc();
       
}
void Temp(u16 *s, u8 length)
{
        u8 ack, i;
        u16 j = 0;
  start_IIc();
  sendbyte(0x80);
  sendbyte(0xF3);
        do
        {
                delay_us(10);
                start_IIc();
                ack = sendbyte(0x81);
                j++;
                if(j == 1000)
                        return;
        }
        while(ack == 1);
//        delay_us(10);
        delay_us(20);
        for(i = 0; i < (length - 1); i++)
        {   
                delay_us(10);
                *s = RcvByte();
                Ack_I2c(0);
                s++;
        }
        *s = RcvByte();
      
  Ack_I2c(1);       
        stop_IIc();
       
}
void RH(u16 *s, u8 length)
{
        u8 ack, i;
        u16 j = 0;
  start_IIc();
  sendbyte(0x80);
  sendbyte(0xF5);
        do
        {
                delay_us(10);
                start_IIc();
                ack = sendbyte(0x81);
                j++;
                if(j == 1000)
                        return;
        }
        while(ack == 1);
//        delay_us(20);
        delay_us(20);
        for(i = 0; i < (length - 1); i++)
        {   
                delay_us(10);
                *s = RcvByte();
                Ack_I2c(0);
                s++;
        }
        *s = RcvByte();
      
  Ack_I2c(1);       
        stop_IIc();
       
}
void Value_of_CT(void)
{
        u16 c, t;
       
        IAQ(I2C_RX, 4);
       
        c = ((I2C_RX[0] << 8) | (I2C_RX[1]));//CO2单位是PPM
        t = ((I2C_RX[2] << 8) | (I2C_RX[3]));//TVOC单位是ppb
       
        CO2 = c;
        TVOC = t;
}
u16 Value_of_Temp(void)
{
        double t, temp;
       
        Temp(I2C_RX1, 4);
        t = ((I2C_RX1[0] * 256) + (I2C_RX1[1] & 0xFC));//最低两位必须为0
        temp =(double)(t * 0.02681 - 468.5);//根据资料公式算法:温度=-46.85+175.72*S/2^16
        return temp;
}
u16 Value_of_RH(void)
{
        double r, rh;
       
        RH(I2C_RX2, 4);
        r = (I2C_RX2[0] * 256 + (I2C_RX2[1] & 0xFC));//最低两位必须为0
        rh = (double)(r *0.0190735 - 60);//根据资料公式算法:湿度=-6+125*S/2^16
        return rh;
}

这是IIC驱动代码  上电数据是不对的,有时候需要多复位几次才行 帮忙一起调试下

层主调试出来了嘛?

复位时间长一点

你好,你的程序调试出来了吗,可以发给我一份吗,谢谢了,我的邮箱:2275829067@qq.com

代码直接复制12楼就是

传感器的Date Sheet写的乱七八糟 不是看不懂 缺好多时序图 实在是猜不出来 换方案了

炙热的心
您好!您的CCS811的程序调试好了吗?

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top