2021-09-12 16:21:12 索煒達電子 1014
項目編號:E1119
文件大小:6K
源碼說明:帶中文注釋
開發(fā)環(huán)境:C編譯器
簡要概述:
前言
最近使用CCS811這一款集成環(huán)境參數(shù)測量芯片,由于CCS811本身的原因,導(dǎo)致調(diào)試頗為不順利?,F(xiàn)在已經(jīng)調(diào)試出來,把自己的經(jīng)驗分享給大家。主控芯片stm32f103。
問題一:無法正常讀取硬件id及狀態(tài)
這個問題有可能是:
1.進行了某些誤操作,導(dǎo)致CCS811芯片本身跑飛,所以怎么復(fù)位都不能讀取。解決辦法是對芯片復(fù)位,即INT腳接地
2.IIC通訊本身有問題,講IIC通訊的讀和寫里的延遲加大,至少5us
問題二:從boot模式轉(zhuǎn)換到測量模式失敗
當上面的參數(shù)能讀取出來的時候,其實通訊本身已經(jīng)沒有問題,但是由于CCS811內(nèi)部集成的MCU需要一定的時間轉(zhuǎn)換模式,即當我們發(fā)送測量轉(zhuǎn)換指令后,必須等待至少180us時間,才能夠?qū)cs811進行讀寫操作,假如提前讀寫便導(dǎo)致CCS811跑飛。
解決辦法,當發(fā)送轉(zhuǎn)換指令時必須等待180us,代碼如下
//測量數(shù)據(jù)前必須開啟
void app_Start(void)
{
nWAKE=0;
delay_us(50);
IIC_Start();
IIC_Send_Byte(WRIT); //發(fā)送寫命令
if(IIC_Wait_Ack()){
IIC_Stop();return;}
IIC_Send_Byte(0xF4);
delay_us(180); //必須等待180us以上才能夠收到應(yīng)答
if(IIC_Wait_Ack()){IIC_Stop();return;}
IIC_Stop();
nWAKE=1;
}
問題三:進入測量模式但無法讀取環(huán)境參數(shù)
這個問題也是CCS811內(nèi)部集成的MCU的鍋,當進入測量模式后,CCS811的IIC通訊就變慢了,也就是說,IIC通訊必須變慢,否則CCS811反應(yīng)不過來。
解決辦法是調(diào)整IIC讀寫速度,讀寫延遲至少50us。
代碼如下:
//測量數(shù)據(jù)前必須開啟
void IIC_Send_Byte(u8 txd)
{
u8 t;
SDA_OUT();
IIC_SCL=0;//拉低時鐘開始數(shù)據(jù)傳輸
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個字節(jié),ack=1時,發(fā)送ACK,ack=0,發(fā)送nACK
u8 IIC_Read_Byte(unsigned char ack)
{
unsigned char i,receive=0;
SDA_IN();//SDA設(shè)置為輸入
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();//發(fā)送nACK
else
IIC_Ack(); //發(fā)送ACK
return receive;
}
其他問題
按照器件手冊上的介紹都可以解決
結(jié)束語
調(diào)試一塊板子真的很不容易,尤其是官方文檔寫的奇奇怪怪的。一開始以為IIC有問題,調(diào)了兩三天,后面才明白怎么回事,如果有一塊邏輯分析儀應(yīng)該不用這么久吧。附上我寫的庫,祝大家能夠早日調(diào)出來。
目錄│文件列表:
└ HARDWARE.zip