| SCL=1 SDA=1 //起始前都是高電平 //延時,起始條件建立時間 SDA=0//SDA變低,產生起始條件 //延時,起始條件的保持時間 SCL=0//一個周期的結束 |
| SCL=1 SDA=0//低 //延時,停止條件建立時間 SDA=1//SDA變高 產生停止條件 //延時,本次停止條件到下一個起始條件的時間間隔 |
| SCL=0//主機拉低時鐘線 SDA=0/1//主機在總線上準備數據 //延時,讓數據穩定在數據線上 SCL=1//主機拉高時鐘線 從機在時鐘上升沿從總線上采集數據 //延時,給時間從機采集數據 |
| SCL=0//主機拉低時鐘線 從機在總線上準備數據(從機自動進行,主機不動作) //延時,讓數據穩定在數據線上 SCL=1//主機拉高時鐘線 主機讀取SDA//主機在時鐘上升沿從總線上采集數據 //延時,給時間主機機采集數據 |
| SCL=0//主機拉低時鐘線 (還是拉低給數據,拉高采集數據) 從機根據自己接受的情況,給不給主機應答信號 //延時,讓數據穩定在數據線上 SCL=1//主機拉高時鐘線 主機讀取SDA//主機在時鐘上升沿從總線上采集應答信號 //延時,給時間主機機采集數據 如果采集到的0,表示有應答,如果采集到的是1,表示非應答 |
| SCL=0//主機拉低時鐘線 SDA=0/1//主機根據自己的情況,決定給不給應答從機 //延時,讓數據穩定在數據線上 SCL=1//主機拉高時鐘線 從機在時鐘上升沿從總線上采集應答位 //延時,給時間從機采集數據 |
| void IIC_Start(void) { IIC_SCL=1; IIC_SDA_OUT=1; Systick_Delay_us(1);//延時,起始條件建立時間 IIC_SDA_OUT=0;//產生起始條件 Systick_Delay_us(2);//延時,起始條件的保持時間 IIC_SCL=0;//一個周期的結束 } |
| void IIC_Stop(void) { IIC_SCL=1; IIC_SDA_OUT=0; Systick_Delay_us(1);//延時,停止條件建立時間 IIC_SDA_OUT=1;//產生停止條件 Systick_Delay_us(1);//延時,本次停止條件到下一個起始條件的時間間隔 } |
| void IIC_Send_ACK(u8 ack) { IIC_SCL=0;//主機拉低時鐘線 if(ack)//主機根據自己的情況,決定給不給應答從機 { IIC_SDA_OUT=1; } else { IIC_SDA_OUT=0; } Systick_Delay_us(2);//延時,讓數據穩定在數據線上 IIC_SCL=1;//主機拉高時鐘線,從機在時鐘上升沿從總線上采集應答位 Systick_Delay_us(1);//延時,給時間從機采集數據 } |
| u8 IIC_Revice_Ack(void) { u8 ack=0; IIC_SCL=0;//主機拉低時鐘線 IIC_SDA_OUT=1;//切換成讀模式---讓輸出電路從IO口斷開************************* //從機根據自己接受的情況,給不給主機應答信號 Systick_Delay_us(2);//延時,讓數據穩定在數據線上 IIC_SCL=1;//主機拉高時鐘線 if(IIC_SDA_IN)//主機在時鐘上升沿從總線上采集應答信號 { ack=1; } Systick_Delay_us(1);//延時,給時間主機機采集數據 IIC_SCL=0;//完整周期 return ack; } |
| u8 IIC_Send_Byte(u8 data) { u8 i; for(i=0;i<8;i++) { IIC_SCL=0;//主機拉低時鐘線 //主機在總線上準備數據 if(data&0x80) IIC_SDA_OUT=1; else IIC_SDA_OUT=0; Systick_Delay_us(2);//延時,讓數據穩定在數據線上 IIC_SCL=1;//主機拉高時鐘線 //從機在時鐘上升沿從總線上采集數據 Systick_Delay_us(1);//延時,給時間從機采集數據 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;//主機拉低時鐘線 IIC_SDA_OUT=1;//切換成讀模式---讓輸出電路從IO口中斷開*************************** //從機在總線上準備數據 Systick_Delay_us(2);//延時,讓數據穩定在數據線上 IIC_SCL=1;//主機拉高時鐘線 data<<=1;//空出最低位來接受數據 //主機在時鐘上升沿從總線上采集數據 if(IIC_SDA_IN) { data |=1; } Systick_Delay_us(1);//延時,給時間主機機采集數據 } IIC_Send_ACK(ack); return data; } |
| float Read_SHT20_Data(u8 cmd) { u8 ack; u16 data=0; float DATA; IIC_Start( );//起始信號 ack = IIC_Send_Byte(SHT20_ADDR&0XFE);//發送器件地址+寫方向 if(ack)//沒有應答 { IIC_Stop( ); return -1; } ack = IIC_Send_Byte(cmd);//發送測量命令 if(ack)//沒有應答,等待從機應答 { IIC_Stop( ); return -1; } do { Delay_ms(10);//給時間測量 IIC_Start( ); //開始信號,測量中 ack = IIC_Send_Byte(SHT20_ADDR | 0x01);//發送器件地址+讀方向 }while(ack);//沒有應答則繼續詢問,知道有應答,表明測量結束 data |= IIC_Revice_Byte(0) <<8;//高位結果 data |= IIC_Revice_Byte(1) ; //低位結果 IIC_Stop( ); //------數字信號轉換成模擬信號 data &=0xFFFC;//清除兩位狀態位 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; } |
拓撲圖.png (55.77 KB, 下載次數: 79)
966.81 KB, 下載次數: 45, 下載積分: 黑幣 -5
密碼:20181027
| 歡迎光臨 (http://m.raoushi.com/bbs/) | Powered by Discuz! X3.1 |