SCL=1 SDA=1 //起始前都是高電平 //延時(shí),起始條件建立時(shí)間 SDA=0//SDA變低,產(chǎn)生起始條件 //延時(shí),起始條件的保持時(shí)間 SCL=0//一個(gè)周期的結(jié)束 |
SCL=1 SDA=0//低 //延時(shí),停止條件建立時(shí)間 SDA=1//SDA變高 產(chǎn)生停止條件 //延時(shí),本次停止條件到下一個(gè)起始條件的時(shí)間間隔 |
SCL=0//主機(jī)拉低時(shí)鐘線 SDA=0/1//主機(jī)在總線上準(zhǔn)備數(shù)據(jù) //延時(shí),讓數(shù)據(jù)穩(wěn)定在數(shù)據(jù)線上 SCL=1//主機(jī)拉高時(shí)鐘線 從機(jī)在時(shí)鐘上升沿從總線上采集數(shù)據(jù) //延時(shí),給時(shí)間從機(jī)采集數(shù)據(jù) |
SCL=0//主機(jī)拉低時(shí)鐘線 從機(jī)在總線上準(zhǔn)備數(shù)據(jù)(從機(jī)自動(dòng)進(jìn)行,主機(jī)不動(dòng)作) //延時(shí),讓數(shù)據(jù)穩(wěn)定在數(shù)據(jù)線上 SCL=1//主機(jī)拉高時(shí)鐘線 主機(jī)讀取SDA//主機(jī)在時(shí)鐘上升沿從總線上采集數(shù)據(jù) //延時(shí),給時(shí)間主機(jī)機(jī)采集數(shù)據(jù) |
SCL=0//主機(jī)拉低時(shí)鐘線 (還是拉低給數(shù)據(jù),拉高采集數(shù)據(jù)) 從機(jī)根據(jù)自己接受的情況,給不給主機(jī)應(yīng)答信號(hào) //延時(shí),讓數(shù)據(jù)穩(wěn)定在數(shù)據(jù)線上 SCL=1//主機(jī)拉高時(shí)鐘線 主機(jī)讀取SDA//主機(jī)在時(shí)鐘上升沿從總線上采集應(yīng)答信號(hào) //延時(shí),給時(shí)間主機(jī)機(jī)采集數(shù)據(jù) 如果采集到的0,表示有應(yīng)答,如果采集到的是1,表示非應(yīng)答 |
SCL=0//主機(jī)拉低時(shí)鐘線 SDA=0/1//主機(jī)根據(jù)自己的情況,決定給不給應(yīng)答從機(jī) //延時(shí),讓數(shù)據(jù)穩(wěn)定在數(shù)據(jù)線上 SCL=1//主機(jī)拉高時(shí)鐘線 從機(jī)在時(shí)鐘上升沿從總線上采集應(yīng)答位 //延時(shí),給時(shí)間從機(jī)采集數(shù)據(jù) |
void IIC_Start(void) { IIC_SCL=1; IIC_SDA_OUT=1; Systick_Delay_us(1);//延時(shí),起始條件建立時(shí)間 IIC_SDA_OUT=0;//產(chǎn)生起始條件 Systick_Delay_us(2);//延時(shí),起始條件的保持時(shí)間 IIC_SCL=0;//一個(gè)周期的結(jié)束 } |
void IIC_Stop(void) { IIC_SCL=1; IIC_SDA_OUT=0; Systick_Delay_us(1);//延時(shí),停止條件建立時(shí)間 IIC_SDA_OUT=1;//產(chǎn)生停止條件 Systick_Delay_us(1);//延時(shí),本次停止條件到下一個(gè)起始條件的時(shí)間間隔 } |
void IIC_Send_ACK(u8 ack) { IIC_SCL=0;//主機(jī)拉低時(shí)鐘線 if(ack)//主機(jī)根據(jù)自己的情況,決定給不給應(yīng)答從機(jī) { IIC_SDA_OUT=1; } else { IIC_SDA_OUT=0; } Systick_Delay_us(2);//延時(shí),讓數(shù)據(jù)穩(wěn)定在數(shù)據(jù)線上 IIC_SCL=1;//主機(jī)拉高時(shí)鐘線,從機(jī)在時(shí)鐘上升沿從總線上采集應(yīng)答位 Systick_Delay_us(1);//延時(shí),給時(shí)間從機(jī)采集數(shù)據(jù) } |
u8 IIC_Revice_Ack(void) { u8 ack=0; IIC_SCL=0;//主機(jī)拉低時(shí)鐘線 IIC_SDA_OUT=1;//切換成讀模式---讓輸出電路從IO口斷開(kāi)************************* //從機(jī)根據(jù)自己接受的情況,給不給主機(jī)應(yīng)答信號(hào) Systick_Delay_us(2);//延時(shí),讓數(shù)據(jù)穩(wěn)定在數(shù)據(jù)線上 IIC_SCL=1;//主機(jī)拉高時(shí)鐘線 if(IIC_SDA_IN)//主機(jī)在時(shí)鐘上升沿從總線上采集應(yīng)答信號(hào) { ack=1; } Systick_Delay_us(1);//延時(shí),給時(shí)間主機(jī)機(jī)采集數(shù)據(jù) IIC_SCL=0;//完整周期 return ack; } |
u8 IIC_Send_Byte(u8 data) { u8 i; for(i=0;i<8;i++) { IIC_SCL=0;//主機(jī)拉低時(shí)鐘線 //主機(jī)在總線上準(zhǔn)備數(shù)據(jù) if(data&0x80) IIC_SDA_OUT=1; else IIC_SDA_OUT=0; Systick_Delay_us(2);//延時(shí),讓數(shù)據(jù)穩(wěn)定在數(shù)據(jù)線上 IIC_SCL=1;//主機(jī)拉高時(shí)鐘線 //從機(jī)在時(shí)鐘上升沿從總線上采集數(shù)據(jù) Systick_Delay_us(1);//延時(shí),給時(shí)間從機(jī)采集數(shù)據(jù) data<<=1;//讓次高位成為最高位 } return IIC_Revice_Ack( ); } |
u8 IIC_Revice_Byte(u8 ack) { u8 i; u8 data=0; for(i=0;i<8;i++) { IIC_SCL=0;//主機(jī)拉低時(shí)鐘線 IIC_SDA_OUT=1;//切換成讀模式---讓輸出電路從IO口中斷開(kāi)*************************** //從機(jī)在總線上準(zhǔn)備數(shù)據(jù) Systick_Delay_us(2);//延時(shí),讓數(shù)據(jù)穩(wěn)定在數(shù)據(jù)線上 IIC_SCL=1;//主機(jī)拉高時(shí)鐘線 data<<=1;//空出最低位來(lái)接受數(shù)據(jù) //主機(jī)在時(shí)鐘上升沿從總線上采集數(shù)據(jù) if(IIC_SDA_IN) { data |=1; } Systick_Delay_us(1);//延時(shí),給時(shí)間主機(jī)機(jī)采集數(shù)據(jù) } IIC_Send_ACK(ack); return data; } |
float Read_SHT20_Data(u8 cmd) { u8 ack; u16 data=0; float DATA; IIC_Start( );//起始信號(hào) ack = IIC_Send_Byte(SHT20_ADDR&0XFE);//發(fā)送器件地址+寫(xiě)方向 if(ack)//沒(méi)有應(yīng)答 { IIC_Stop( ); return -1; } ack = IIC_Send_Byte(cmd);//發(fā)送測(cè)量命令 if(ack)//沒(méi)有應(yīng)答,等待從機(jī)應(yīng)答 { IIC_Stop( ); return -1; } do { Delay_ms(10);//給時(shí)間測(cè)量 IIC_Start( ); //開(kāi)始信號(hào),測(cè)量中 ack = IIC_Send_Byte(SHT20_ADDR | 0x01);//發(fā)送器件地址+讀方向 }while(ack);//沒(méi)有應(yīng)答則繼續(xù)詢問(wèn),知道有應(yīng)答,表明測(cè)量結(jié)束 data |= IIC_Revice_Byte(0) <<8;//高位結(jié)果 data |= IIC_Revice_Byte(1) ; //低位結(jié)果 IIC_Stop( ); //------數(shù)字信號(hào)轉(zhuǎn)換成模擬信號(hào) data &=0xFFFC;//清除兩位狀態(tài)位 if(cmd==T_MEASURE) { DATA=-46.85+175.72*data/65536.0; } else if(cmd==RH_MEASURE) { DATA=-6.0+125.0*data/65536.0; } return DATA; } |
拓?fù)鋱D.png (55.77 KB, 下載次數(shù): 79)
966.81 KB, 下載次數(shù): 45, 下載積分: 黑幣 -5
密碼:20181027
歡迎光臨 (http://www.torrancerestoration.com/bbs/) | Powered by Discuz! X3.1 |