ccs811调试指南

前言

最近使用CCS811这一款集成环境参数测量芯片,由于CCS811本身的原因,导致调试颇为不顺利。现在已经调试出来,把自己的经验分享给大家。主控芯片stm32f103。

问题一:无法正常读取硬件id及状态

这个问题有可能是:

1.进行了某些误操作,导致CCS811芯片本身跑飞,所以怎么复位都不能读取。解决办法是对芯片复位,即INT脚接地
2.IIC通讯本身有问题,讲IIC通讯的读和写里的延迟加大,至少5us

问题二:从boot模式转换到测量模式失败

当上面的参数能读取出来的时候,其实通讯本身已经没有问题,但是由于CCS811内部集成的MCU需要一定的时间转换模式,即当我们发送测量转换指令后,必须等待至少180us时间,才能够对ccs811进行读写操作,假如提前读写便导致CCS811跑飞。
解决办法,当发送转换指令时必须等待180us,代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//测量数据前必须开启
void app_Start(void)
{
nWAKE=0;
delay_us(50);
IIC_Start();
IIC_Send_Byte(WRIT); //发送写命令
if(IIC_Wait_Ack()){
IIC_Stop();return;}
IIC_Send_Byte(0xF4);
delay_us(180); //必须等待180us以上才能够收到应答
if(IIC_Wait_Ack()){IIC_Stop();return;}
IIC_Stop();
nWAKE=1;

}

问题三:进入测量模式但无法读取环境参数

这个问题也是CCS811内部集成的MCU的锅,当进入测量模式后,CCS811的IIC通讯就变慢了,也就是说,IIC通讯必须变慢,否则CCS811反应不过来。
解决办法是调整IIC读写速度,读写延迟至少50us。
代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
//测量数据前必须开启
void IIC_Send_Byte(u8 txd)
{
u8 t;
SDA_OUT();
IIC_SCL=0;//拉低时钟开始数据传输
for(t=0;t<8;t++)
{
if((txd&0x80)>>7)
IIC_SDA=1;
else
IIC_SDA=0;
txd<<=1;
delay_us(50); //对TEA5767这三个延时都是必须的
IIC_SCL=1;
delay_us(50);
IIC_SCL=0;
delay_us(50);

}

}
//读1个字节,ack=1时,发送ACK,ack=0,发送nACK
u8 IIC_Read_Byte(unsigned char ack)
{
unsigned char i,receive=0;
SDA_IN();//SDA设置为输入
for(i=0;i<8;i++ )
{
IIC_SCL=0;
delay_us(50);
IIC_SCL=1;
receive<<=1;
if(READ_SDA)receive++;
delay_us(50);
}
if (!ack)
IIC_NAck();//发送nACK
else
IIC_Ack(); //发送ACK
return receive;
}

其他问题

按照器件手册上的介绍都可以解决

结束语

调试一块板子真的很不容易,尤其是官方文档写的奇奇怪怪的。一开始以为IIC有问题,调了两三天,后面才明白怎么回事,如果有一块逻辑分析仪应该不用这么久吧。附上我写的库,祝大家能够早日调出来。
点击下载

×

纯属好玩

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

文章目录
  1. 1. 前言
  2. 2. 问题一:无法正常读取硬件id及状态
  3. 3. 问题二:从boot模式转换到测量模式失败
  4. 4. 问题三:进入测量模式但无法读取环境参数
  5. 5. 其他问题
  6. 6. 结束语
,