前言
最近使用CCS811这一款集成环境参数测量芯片,由于CCS811本身的原因,导致调试颇为不顺利。现在已经调试出来,把自己的经验分享给大家。主控芯片stm32f103。
问题一:无法正常读取硬件id及状态
这个问题有可能是:
1.进行了某些误操作,导致CCS811芯片本身跑飞,所以怎么复位都不能读取。解决办法是对芯片复位,即INT脚接地
2.IIC通讯本身有问题,讲IIC通讯的读和写里的延迟加大,至少5us
问题二:从boot模式转换到测量模式失败
当上面的参数能读取出来的时候,其实通讯本身已经没有问题,但是由于CCS811内部集成的MCU需要一定的时间转换模式,即当我们发送测量转换指令后,必须等待至少180us时间,才能够对ccs811进行读写操作,假如提前读写便导致CCS811跑飞。
解决办法,当发送转换指令时必须等待180us,代码如下
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有问题,调了两三天,后面才明白怎么回事,如果有一块逻辑分析仪应该不用这么久吧。附上我写的库,祝大家能够早日调出来。
点击下载