中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當(dāng)前位置: 首頁 > news >正文

wordpress 破解賬號seo學(xué)校培訓(xùn)課程

wordpress 破解賬號,seo學(xué)校培訓(xùn)課程,人民法院公告網(wǎng)失信人名單,微信營銷策劃方案1.概念 I2C總線是PHLIPS公司在八十年代初推出的一種串行的半雙工同步總線,主要用于連接整體電路2.IIC總線硬件連接 1.IIC總線支持多主機多從機,但是在實際開發(fā)過程中,大多數(shù)采用單主機多從機模式 2.掛接到IIC總線上,每個從機設(shè)備都…

1.概念

	I2C總線是PHLIPS公司在八十年代初推出的一種串行的半雙工同步總線,主要用于連接整體電路

2.IIC總線硬件連接

在這里插入圖片描述

1.IIC總線支持多主機多從機,但是在實際開發(fā)過程中,大多數(shù)采用單主機多從機模式
2.掛接到IIC總線上,每個從機設(shè)備都有自己的7bit從機地址
3.在總線上,發(fā)送數(shù)據(jù)的叫做發(fā)送器,接收數(shù)據(jù)叫做接收器
4.主動發(fā)起數(shù)據(jù)的叫做主機,只能被動接收數(shù)據(jù)的叫做從機
5.時鐘信號由主機產(chǎn)生,作用:給從機,為了IIC總線上傳輸數(shù)據(jù)同步

3.IIC總線時序

3.1起始信號

在這里插入圖片描述

在SCL為高電平期間,SDA從高到低的變化(下降沿),屬于起始信號
起始信號由主機產(chǎn)生,起始信號產(chǎn)生之后,總線占用狀態(tài)

3.2停止信號

在這里插入圖片描述

在SCL為高電平期間,SDA從低到高的變化(上升沿),屬于終止信號
停止信號由主機產(chǎn)生,停止信號產(chǎn)生之后,總線空閑狀態(tài)

3.3數(shù)據(jù)傳輸信號(讀寫)

在這里插入圖片描述

1.在SCL為高電平期間,數(shù)據(jù)線上的數(shù)據(jù)保持穩(wěn)定,接收器從數(shù)據(jù)線上讀取數(shù)據(jù)
2.在SCL為低電平期間,數(shù)據(jù)線上的數(shù)據(jù)允許變化,發(fā)送器向數(shù)據(jù)線上寫入數(shù)據(jù)

3.4應(yīng)答信號

在這里插入圖片描述

1.每一個字節(jié)必須保證是8位長度。數(shù)據(jù)傳送時,先傳送高位,在發(fā)送低位,每一個被傳送的字節(jié)后面都必須跟隨一位應(yīng)答位(即一幀共有9位)
2.發(fā)送器在發(fā)送完8位數(shù)據(jù)位之后,接收器在第9個時鐘周期,返回一個應(yīng)答信號(0),或者非應(yīng)答信號(1)在第9個時鐘周期,接收器向數(shù)據(jù)線上寫入數(shù)據(jù)在第9個時鐘周期,發(fā)送器從數(shù)據(jù)線上讀取數(shù)據(jù)如果讀取到0,代表應(yīng)答信號如果讀取到1,代表非應(yīng)答信號

3.5尋址

在這里插入圖片描述

1.IIC總線上傳輸數(shù)據(jù)是廣義的,可以傳輸?shù)刂沸盘?#xff0c;也可以傳輸數(shù)據(jù)信號
2.主機在產(chǎn)生起始信號之后,必須傳送7位從機地址,加上讀寫位
3.用0表示寫,用1表示讀

4.IIC框圖

在這里插入圖片描述

5.IIC總線協(xié)議

5.1主機給從機發(fā)送一個字節(jié)

在這里插入圖片描述

5.2主機給從機發(fā)送多個連續(xù)字節(jié)

在這里插入圖片描述

5.3主機從從機讀一個字節(jié)

在這里插入圖片描述

5.4主機從從機讀多個連續(xù)字節(jié)

在這里插入圖片描述

6.GPIO模擬IIC協(xié)議

在這里插入圖片描述

7.分析SI7006芯片手冊

7.1思路

1.分析SI7006芯片手冊內(nèi)部實現(xiàn)框圖
2.分析SI7006從機地址
3.分析SI7006芯片通信協(xié)議
4.分析找到采集溫濕度傳感器命令碼
5.找到將采集的模擬量轉(zhuǎn)換為數(shù)字量的公式
6.分析SI7006初始化的值

7.2從機地址

在這里插入圖片描述

通過以上分析可知,si7006芯片從機地址0x40
從機地址 + 讀:0x40 << 1 | 1
從機地址 + 寫:0x40 << 1 | 0

7.3分析命令碼

在這里插入圖片描述

7.4協(xié)議

在這里插入圖片描述

7.5公式

在這里插入圖片描述
在這里插入圖片描述

7.6初始化值

在這里插入圖片描述

8.代碼

// si7006.h
#ifndef __SI7006_H__
#define __SI7006_H__#include "iic.h"
#define SI7006_SLAVE 0x40void si7006_init(void);unsigned short si7006_read_hum_data(unsigned char slave_addr, unsigned char cmd_code);
short si7006_read_temp_data(unsigned char slave_addr, unsigned char cmd_code);#endif //__SI7006_H__
// si7006.c
#include "iic.h"
#include "si7006.h"
/** 函數(shù)名:si7006_init* 函數(shù)功能:SI7006芯片的初始化* 函數(shù)參數(shù):無* 函數(shù)返回值:無*/
extern void delay(int ms);
// 往SI7006芯片0XE6寫入0X3A
void si7006_init(void)
{// I2初始化i2c_init();// 發(fā)送起始信號i2c_start();// 主機發(fā)送7位從機地址+1位寫位i2c_write_byte(0X40 << 1 | 0);// 等待從機回應(yīng)i2c_wait_ack();// 發(fā)送寄存器地址i2c_write_byte(0XE6);// 等待從機回應(yīng)i2c_wait_ack();// 發(fā)送要寫的數(shù)據(jù)i2c_write_byte(0X3A);// 等待從機回應(yīng)i2c_wait_ack();// 發(fā)送終止信號i2c_stop();
}
/** 函數(shù)名:si7006_read_hum_data* 函數(shù)功能:讀取SI7006的濕度轉(zhuǎn)換結(jié)果* 函數(shù)參數(shù):*     slave_addr : 從機地址*     cmd_code : 命令碼* 函數(shù)返回值:濕度測量的數(shù)字量*/
unsigned short si7006_read_hum_data(unsigned char slave_addr,unsigned char cmd_code)
{unsigned short dat;			// 保存讀取到的濕度數(shù)據(jù)unsigned char dat_h, dat_l; // 保存讀取到的數(shù)據(jù)的高八位和低八位// 發(fā)送起始信號i2c_start();// 主機發(fā)送7位從機地址+1位寫位i2c_write_byte(slave_addr << 1 | 0);// 等待從機回應(yīng)i2c_wait_ack();// 發(fā)送寄存器地址i2c_write_byte(cmd_code);// 等待從機回應(yīng)i2c_wait_ack();// 發(fā)送第二次起始信號i2c_start();// 主機發(fā)送7位從機地址+1位寫位i2c_write_byte(slave_addr << 1 | 1);// 等待從機回應(yīng)i2c_wait_ack();// 延時等待從機測量數(shù)據(jù)delay(100);// 讀取數(shù)據(jù)的高8位dat_h = i2c_read_byte(0); // 讀取完畢發(fā)送應(yīng)答信號// 讀取數(shù)據(jù)的低8位dat_l = i2c_read_byte(1); // 讀取完畢發(fā)送非應(yīng)答信號// 發(fā)送停止信號i2c_stop();// 將讀取到的數(shù)據(jù)整合到一起dat = (dat_h << 8) | dat_l;return dat;
}
/** 函數(shù)名:si7006_read_temp_data* 函數(shù)功能:讀取SI7006的溫度轉(zhuǎn)換結(jié)果* 函數(shù)參數(shù):*     slave_addr : 從機地址*     cmd_code : 命令碼* 函數(shù)返回值:溫度測量的數(shù)字量*/
short si7006_read_temp_data(unsigned char slave_addr,unsigned char cmd_code)
{short dat;		   // 保存讀取到的溫度數(shù)據(jù)char dat_h, dat_l; // 保存讀取到的數(shù)據(jù)的高八位和低八位// 發(fā)送起始信號i2c_start();// 主機發(fā)送7位從機地址+1位寫位i2c_write_byte(slave_addr << 1 | 0);// 等待從機回應(yīng)i2c_wait_ack();// 發(fā)送寄存器地址i2c_write_byte(cmd_code);// 等待從機回應(yīng)i2c_wait_ack();// 發(fā)送第二次起始信號i2c_start();// 主機發(fā)送7位從機地址+1位寫位i2c_write_byte(slave_addr << 1 | 1);// 等待從機回應(yīng)i2c_wait_ack();// 延時等待從機測量數(shù)據(jù)delay(100);// 讀取數(shù)據(jù)的高8位dat_h = i2c_read_byte(0); // 讀取完畢發(fā)送應(yīng)答信號// 讀取數(shù)據(jù)的低8位dat_l = i2c_read_byte(1); // 讀取完畢發(fā)送非應(yīng)答信號// 發(fā)送停止信號i2c_stop();// 將讀取到的數(shù)據(jù)整合到一起dat = (dat_h << 8) | dat_l;return dat;
}
// iic.h
#ifndef __IIC_H__
#define __IIC_H__
#include "stm32mp1xx_gpio.h"
#include "stm32mp1xx_rcc.h"
// #include "gpio.h"
/* 通過程序模擬實現(xiàn)I2C總線的時序和協(xié)議* GPIOF ---> AHB4* I2C1_SCL ---> PF14* I2C1_SDA ---> PF15** */#define SET_SDA_OUT                     \do                                  \{                                   \GPIOF->MODER &= (~(0x3 << 30)); \GPIOF->MODER |= (0x1 << 30);    \} while (0)
#define SET_SDA_IN                      \do                                  \{                                   \GPIOF->MODER &= (~(0x3 << 30)); \} while (0)#define I2C_SCL_H                   \do                              \{                               \GPIOF->BSRR |= (0x1 << 14); \} while (0)
#define I2C_SCL_L                  \do                             \{                              \GPIOF->BRR |= (0x1 << 14); \} while (0)#define I2C_SDA_H                   \do                              \{                               \GPIOF->BSRR |= (0x1 << 15); \} while (0)
#define I2C_SDA_L                  \do                             \{                              \GPIOF->BRR |= (0x1 << 15); \} while (0)#define I2C_SDA_READ (GPIOF->IDR & (0x1 << 15))void delay_us(void);
void i2c_init(void);
void i2c_start(void);
void i2c_stop(void);
void i2c_write_byte(unsigned char dat);
unsigned char i2c_read_byte(unsigned char ack);
unsigned char i2c_wait_ack(void);
void i2c_ack(void);
void i2c_nack(void);#endif
// icc.h
#include "iic.h"extern void printf(const char *fmt, ...);
/** 函數(shù)名 : delay_us* 函數(shù)功能:延時函數(shù)* 函數(shù)參數(shù):無* 函數(shù)返回值:無* */
void delay_us(void)
{unsigned int i = 2000;while (i--);
}
/** 函數(shù)名 : i2c_init* 函數(shù)功能: i2C總線引腳的初始化, 通用輸出,推挽輸出,輸出速度,* 函數(shù)參數(shù):無* 函數(shù)返回值:無* */
void i2c_init(void)
{// 使能GPIOF端口的時鐘RCC->MP_AHB4ENSETR |= (0x1 << 5);// 設(shè)置PF14,PF15引腳為通用的輸出功能GPIOF->MODER &= (~(0xF << 28));GPIOF->MODER |= (0x5 << 28);// 設(shè)置PF14, PF15引腳為推挽輸出GPIOF->OTYPER &= (~(0x3 << 14));// 設(shè)置PF14, PF15引腳為高速輸出GPIOF->OSPEEDR |= (0xF << 28);// 設(shè)置PF14, PF15引腳的禁止上拉和下拉GPIOF->PUPDR &= (~(0xF << 28));// 空閑狀態(tài)SDA和SCL拉高I2C_SCL_H;I2C_SDA_H;
}/** 函數(shù)名:i2c_start* 函數(shù)功能:模擬i2c開始信號的時序* 函數(shù)參數(shù):無* 函數(shù)返回值:無* */
void i2c_start(void)
{/** 開始信號:時鐘在高電平期間,數(shù)據(jù)線從高到低的變化*     --------* SCL         \*              --------*     ----* SDA     \*          --------* */// 確保SDA是輸出狀態(tài) PF15輸出SET_SDA_OUT;// 空閑狀態(tài)SDA和SCL拉高I2C_SCL_H;I2C_SDA_H;delay_us(); // 延時等待一段時間I2C_SDA_L;	// 數(shù)據(jù)線拉低delay_us(); // 延時等待一段時間I2C_SCL_L;	// 時鐘線拉低,讓總線處于占用狀態(tài)
}/** 函數(shù)名:i2c_stop* 函數(shù)功能:模擬i2c停止信號的時序* 函數(shù)參數(shù):無* 函數(shù)返回值:無* */void i2c_stop(void)
{/** 停止信號 : 時鐘在高電平期間,數(shù)據(jù)線從低到高的變化*             ----------* SCL        /*    --------*    ---         -------* SDA   X       /*    --- -------* */// 確保SDA是輸出狀態(tài) PF15輸出SET_SDA_OUT;// 時鐘線拉低I2C_SCL_L;delay_us(); // 延時等待一段時間I2C_SDA_L;	// 數(shù)據(jù)線拉低delay_us(); // 延時等待一段時間// 時鐘線拉高I2C_SCL_H;delay_us(); // 延時等待一段時間I2C_SDA_H;	// 數(shù)據(jù)線拉高
}/** 函數(shù)名: i2c_write_byte* 函數(shù)功能:主機向i2c總線上的從設(shè)備寫8bits數(shù)據(jù)* 函數(shù)參數(shù):dat : 等待發(fā)送的字節(jié)數(shù)據(jù)* 函數(shù)返回值: 無* */void i2c_write_byte(unsigned char dat)
{/** 數(shù)據(jù)信號:時鐘在低電平期間,發(fā)送器向數(shù)據(jù)線上寫入數(shù)據(jù)*          時鐘在高電平期間,接收器從數(shù)據(jù)線上讀取數(shù)據(jù)*      ----          --------*  SCL     \        /        \*           --------          --------*      -------- ------------------ ---*  SDA         X                  X*      -------- ------------------ ---**      先發(fā)送高位在發(fā)送低位* */// 確保SDA是輸出狀態(tài) PF15輸出SET_SDA_OUT;unsigned int i;for (i = 0; i < 8; i++){// 時鐘線拉低I2C_SCL_L;delay_us(); // 延時// 0X3A->0011 1010   0X80->10000000if (dat & 0X80) // 最高位為1{// 發(fā)送1I2C_SDA_H;}else // 最高位為0{I2C_SDA_L; // 發(fā)送0}delay_us(); // 延時// 時鐘線拉高,接收器接收I2C_SCL_H;delay_us(); // 延時,用于等待接收器接收數(shù)據(jù)delay_us(); // 延時// 將數(shù)據(jù)左移一位,讓原來第6位變?yōu)榈?位dat = dat << 1;}
}/** 函數(shù)名:i2c_read_byte* 函數(shù)功能: 主機從i2c總線上的從設(shè)備讀8bits數(shù)據(jù),*          主機發(fā)送一個應(yīng)答或者非應(yīng)答信號* 函數(shù)參數(shù): 0 : 應(yīng)答信號   1 : 非應(yīng)答信號* 函數(shù)返回值:讀到的有效數(shù)據(jù)** */
unsigned char i2c_read_byte(unsigned char ack)
{/** 數(shù)據(jù)信號:時鐘在低電平期間,發(fā)送器向數(shù)據(jù)線上寫入數(shù)據(jù)*          時鐘在高電平期間,接收器從數(shù)據(jù)線上讀取數(shù)據(jù)*      ----          --------*  SCL     \        /        \*           --------          --------*      -------- ------------------ ---*  SDA         X                  X*      -------- ------------------ ---**      先接收高位, 在接收低位* */unsigned int i;unsigned char dat; // 保存接受的數(shù)據(jù)// 將數(shù)據(jù)線設(shè)置為輸入SET_SDA_IN;for (i = 0; i < 8; i++){// 先把時鐘線拉低,等一段時間,保證發(fā)送器發(fā)送完畢數(shù)據(jù)I2C_SCL_L;delay_us();delay_us(); // 保證發(fā)送器發(fā)送完數(shù)據(jù)// 時鐘線拉高,讀取數(shù)據(jù)I2C_SCL_H;delay_us();dat = dat << 1;	  // 數(shù)值左移  0000 0000if (I2C_SDA_READ) // pf15管腳得到了一個高電平輸入{dat |= 1; // 0000 0110}else{dat &= (~0X1);}delay_us();}if (ack){i2c_nack(); // 發(fā)送非應(yīng)答信號,不再接收下一次數(shù)據(jù)}else{i2c_ack(); // 發(fā)送應(yīng)答信號}return dat;
}
/** 函數(shù)名: i2c_wait_ack* 函數(shù)功能: 主機作為發(fā)送器時,等待接收器返回的應(yīng)答信號* 函數(shù)參數(shù):無* 函數(shù)返回值:*                  0:接收到的應(yīng)答信號*                  1:接收到的非應(yīng)答信號* */
unsigned char i2c_wait_ack(void)
{/** 主機發(fā)送一個字節(jié)之后,從機給主機返回一個應(yīng)答信號**                   -----------* SCL              /   M:讀    \*     -------------             --------*     --- ---- --------------------* SDA    X    X*     ---      --------------------*     主  釋   從機    主機*     機  放   向數(shù)據(jù)  讀數(shù)據(jù)線*         總   線寫    上的數(shù)據(jù)*         線   數(shù)據(jù)* */// 時鐘線拉低,接收器可以發(fā)送信號I2C_SCL_L;I2C_SDA_H; // 先把數(shù)據(jù)線拉高,當(dāng)接收器回應(yīng)應(yīng)答信號時,數(shù)據(jù)線會拉低delay_us();SET_SDA_IN; // 設(shè)置數(shù)據(jù)線為輸入delay_us();delay_us();I2C_SCL_H;		  // 用于讀取數(shù)據(jù)線數(shù)據(jù)if (I2C_SDA_READ) // PF15得到一個高電平輸入,收到非應(yīng)答信號return 1;I2C_SCL_L; // 時鐘線拉低,讓數(shù)據(jù)線處于占用狀態(tài)return 0;
}
/** 函數(shù)名: iic_ack* 函數(shù)功能: 主機作為接收器時,給發(fā)送器發(fā)送應(yīng)答信號* 函數(shù)參數(shù):無* 函數(shù)返回值:無* */
void i2c_ack(void)
{/*            --------* SCL       /        \*    -------          ------*    ---* SDA   X*    --- -------------* */// 保證數(shù)據(jù)線是輸出SET_SDA_OUT;I2C_SCL_L; // 拉低時鐘線delay_us();I2C_SDA_L; // 數(shù)據(jù)線拉低,表示應(yīng)答信號delay_us();I2C_SCL_H; // 時鐘線拉高,等待發(fā)送器讀取應(yīng)答信號delay_us();delay_us();I2C_SCL_L; // 數(shù)據(jù)線處于占用狀態(tài),發(fā)送器發(fā)送下一次數(shù)據(jù)
}
/** 函數(shù)名: iic_nack* 函數(shù)功能: 主機作為接收器時,給發(fā)送器發(fā)送非應(yīng)答信號* 函數(shù)參數(shù):無* 函數(shù)返回值:無* */
void i2c_nack(void)
{/*            --------* SCL       /        \*    -------          ------*    --- ---------------* SDA   X*    ---* */// 保證數(shù)據(jù)線是輸出SET_SDA_OUT;I2C_SCL_L; // 拉低時鐘線delay_us();I2C_SDA_H; // 數(shù)據(jù)線拉高,表示非應(yīng)答信號delay_us();I2C_SCL_H; // 時鐘線拉高,等待發(fā)送器讀取應(yīng)答信號delay_us();delay_us();I2C_SCL_L; // 數(shù)據(jù)線處于占用狀態(tài),發(fā)送器發(fā)送下一次數(shù)據(jù)
}
// main.c
#include "si7006.h"void delay(int ms)
{int i, j;for (i = 0; i < ms; i++){for (j = 0; j < 2000; j++);}
}
int main()
{unsigned short hum;short tem;// 進(jìn)行si7006的初始化si7006_init();while (1){// 讀取濕度hum = si7006_read_hum_data(0X40, 0XE5);// 讀取溫度tem = si7006_read_temp_data(0X40, 0XE3);// 將溫度數(shù)據(jù)和濕度數(shù)據(jù)按照轉(zhuǎn)換公式進(jìn)行轉(zhuǎn)換hum = 125 * hum / 65536 - 6;tem = 175.72 * tem / 65536 - 46.85;delay(1000); // 延時打印// 將獲取到的數(shù)據(jù)打印到串口printf("hum:%d\n", hum);printf("tem:%d\n", tem);}return 0;
}
http://m.risenshineclean.com/news/58276.html

相關(guān)文章:

  • 自己做網(wǎng)站的流程谷歌seo網(wǎng)站優(yōu)化
  • 國際網(wǎng)站推廣專員招聘做推廣app賺錢的項目
  • 視頻 收費 網(wǎng)站怎么做全國網(wǎng)站排名
  • 沈陽網(wǎng)站建設(shè)技術(shù)公司百度客戶服務(wù)電話是多少
  • 怎么用vscode做網(wǎng)站網(wǎng)站排名優(yōu)化培訓(xùn)
  • 上海網(wǎng)站備案北京發(fā)生大事了
  • 怎么設(shè)計頁面只顯示一頁說說seo論壇
  • 病毒推廣網(wǎng)站網(wǎng)絡(luò)營銷怎么做
  • wordpress 全景插件軟件排名優(yōu)化
  • 手機網(wǎng)站模板更換方法sem網(wǎng)站推廣怎么做
  • 辦公用品網(wǎng)站建設(shè)網(wǎng)絡(luò)推廣企業(yè)
  • 有了php源碼怎么做網(wǎng)站公司網(wǎng)絡(luò)推廣排名定制
  • 網(wǎng)站的競價怎么做軟件培訓(xùn)機構(gòu)排名
  • 怎么用ngrok做網(wǎng)站百度品牌廣告收費標(biāo)準(zhǔn)
  • 網(wǎng)站開發(fā)的就業(yè)前景如何沈陽網(wǎng)站制作公司
  • 做茶評的網(wǎng)站谷歌seo排名優(yōu)化服務(wù)
  • 哪些購物網(wǎng)站做的比較簡潔有品質(zhì)手機端網(wǎng)站優(yōu)化
  • 設(shè)計業(yè)務(wù)網(wǎng)站競價是什么意思
  • 網(wǎng)站建設(shè)推廣新聞成都疫情最新情況
  • 安徽服飾網(wǎng)站建設(shè)萬網(wǎng)域名官網(wǎng)
  • 淘寶網(wǎng)網(wǎng)站開發(fā)今日頭條新聞軍事
  • wordpress 怎么上傳文件到根目錄網(wǎng)站優(yōu)化培訓(xùn)班
  • 免費網(wǎng)站建設(shè)信息搜狐綜合小時報2022113011
  • 做網(wǎng)站app免費的行情軟件app網(wǎng)站
  • 品牌網(wǎng)站怎么做一網(wǎng)信息一個簡單便捷的新聞網(wǎng)站
  • 網(wǎng)站數(shù)據(jù)庫5g北京百度網(wǎng)站排名優(yōu)化
  • 吉林網(wǎng)站建設(shè)業(yè)務(wù)日本shopify獨立站
  • 微信公眾號 視頻網(wǎng)站開發(fā)網(wǎng)絡(luò)營銷推廣流程
  • 搬瓦工vps做網(wǎng)站速度怎么樣營銷方案怎么寫
  • 超級簡歷模板官網(wǎng)北京seo公司公司