日語網(wǎng)站建設(shè)需要注意什么seo快速排名網(wǎng)站優(yōu)化
在用正點(diǎn)原子STM32F4開發(fā)板,搭配對應(yīng)的button歷程時(shí),發(fā)現(xiàn)運(yùn)行一會(huì),button都無法使用了,以為是emwin死機(jī)了,但是看到Led還在閃爍,排除系統(tǒng)死機(jī)問題。那就是emwin的任務(wù)沒有運(yùn)行起來,但是打斷點(diǎn)后,仍然可以進(jìn)入,說明任務(wù)也沒問題。接著又添加了txt控件,不停的更新顯示。這才發(fā)現(xiàn),button不可以可能是觸摸屏有問題。在出現(xiàn)問題時(shí),觸摸屏那里讀取的mode都是0和ff。正常的應(yīng)該是0x80之類的。 所以基本判定是觸摸驅(qū)動(dòng)的問題。然后處理結(jié)果如下:
我發(fā)現(xiàn)GT9147_RD_Reg(GT_GSTID_REG,&mode,1),沒有觸點(diǎn)時(shí),多次能讀到0xFF(當(dāng)然還有別的異常值)。用示波器跟蹤發(fā)現(xiàn)STM32F407發(fā)送0x28,GT9147竟然沒有ACK。整個(gè)波形全是亂的。在CTIIC.C中,優(yōu)化了三個(gè)函數(shù),測試OK(無觸點(diǎn)或者數(shù)據(jù)沒有準(zhǔn)備oK,GT9147_RD_Reg(GT_GSTID_REG,&mode,1); mode=0;松手,可以觀察到3次mode=0x80,我不是太明白為何有3次;有一個(gè)觸點(diǎn),mode=0x81,多個(gè)mode=0x8*)
應(yīng)該是從側(cè)先ACK,后有主側(cè)SCL變高電平,優(yōu)化之
u8 CT_IIC_Wait_Ack(void)
{
? ? u8 ucErrTime=0;
? ? CT_SDA_IN();? ?? ?//SDA設(shè)置為輸入??
? ? CT_IIC_SCL=0;
? ? delay_us(2);
? ? while(CT_READ_SDA)
? ? {
? ?? ???ucErrTime++;
? ?? ???delay_us(2);? ?
? ?? ???if(ucErrTime>250)
? ?? ???{
? ?? ?? ?? ?CT_IIC_Stop();
? ?? ?? ?? ?return 1;
? ?? ???}
? ? }
? ? delay_us(2);
? ? CT_IIC_SCL=1;
? ? delay_us(2);? ?
? ? CT_IIC_SCL=0;
??delay_us(3);? ?
? ? return 0;??
}
增加SDA到SCL之間的延時(shí),解決發(fā)地址沒有ACK問題
void CT_IIC_Send_Byte(u8 txd)
{? ?? ?? ?? ?? ?? ?? ?? ?
? ? u8 t;? ?
? ? CT_SDA_OUT();? ?? ?? ?
? ? CT_IIC_SCL=0;//拉低時(shí)鐘開始數(shù)據(jù)傳輸
? ? CT_Delay();
? ? for(t=0;t<8;t++)
? ? {? ?? ?? ?? ???
? ?? ???CT_IIC_SDA=(txd&0x80)>>7;
? ?? ???txd<<=1;
? ? delay_us(2);//pnhhit? ?? ?? ?? ?
? ?? ???CT_IIC_SCL=1;
? ?? ???CT_Delay();
? ?? ???CT_IIC_SCL=0;? ?
? ?? ???CT_Delay();
? ? }? ???
}? ?
讀數(shù)據(jù)延時(shí)放大,100us,是我大致放大,可以在細(xì)化 ,比如50us? ?? ?
u8 CT_IIC_Read_Byte(unsigned char ack)
{
? ? u8 i,receive=0;
? ???CT_SDA_IN();//SDA設(shè)置為輸入
? ? //delay_us(30);//pnhhit??這個(gè)相對myiic.c文件是正點(diǎn)原子他們自己加的,但是我測試還是不夠長
? ? delay_us(100);
? ? for(i=0;i<8;i++ )
? ? {
? ?? ???CT_IIC_SCL=0;? ?? ?? ?? ?? ?
? ?? ???CT_Delay();
? ?? ???CT_IIC_SCL=1;? ???
? ?? ???receive<<=1;
? ?? ???if(CT_READ_SDA)receive++;
? ? delay_us(1);//pnhhit? ?? ???
? ? }? ?? ?? ?? ?? ?? ?? ???
? ? if (!ack)CT_IIC_NAck();//發(fā)送nACK
? ? else CT_IIC_Ack(); //發(fā)送ACK? ?
? ???return receive;
}
GPIO模擬I2C,有點(diǎn)問題,這里隨便說說:
1)SDA,SCL最好設(shè)置成OD門,否則當(dāng)CPU驅(qū)動(dòng)SDA為高,IC應(yīng)答ACK為低,SDA信號上出現(xiàn)半高電平。
2)不同的IC存放數(shù)據(jù)和準(zhǔn)備數(shù)據(jù)的物理時(shí)間可能不同,比如GT9147和TI流量計(jì)芯片QB27520就不同
3)GPIO模擬時(shí)沒有對SDA和SCL的狀態(tài)裁決,不管IC的狀態(tài),強(qiáng)行控制,是很簡單粗暴的
哎,正點(diǎn)原子的例程不能隨意放到項(xiàng)目中用,問題太多,不穩(wěn)定。