柚子快報(bào)邀請(qǐng)碼778899分享:筆記 3.25號(hào)arm
柚子快報(bào)邀請(qǐng)碼778899分享:筆記 3.25號(hào)arm
1. I2C總線
1.1?i2c概述
I2C總線是PHLIPS公司在八十年代初推出的一種串行的半雙工總線,主要用于連接整體電路。
I2C總線為兩線制,只有兩根雙向信號(hào)線。一根是數(shù)據(jù)線SDA,另一根是時(shí)鐘線SCL。
I2C硬件結(jié)構(gòu)簡(jiǎn)單,接口連接方便,成本較低。因此在各個(gè)領(lǐng)域得到了廣泛的應(yīng)用。
I2C:同步半雙工串行總線
i2c支持一主機(jī)多從機(jī)通信,每個(gè)接到I2C總線上的器件都有唯一的地址。主機(jī)如果想和哪一個(gè)從機(jī)進(jìn)行通信需要先發(fā)送一個(gè)從機(jī)地址到I2C總線上,每一個(gè)從機(jī)都會(huì)將這個(gè)從機(jī)地址和自己的地址進(jìn)行匹配,匹配成功的從機(jī)會(huì)往數(shù)據(jù)線上發(fā)送一個(gè)應(yīng)答信號(hào),主機(jī)確認(rèn)從機(jī)應(yīng)答后開始進(jìn)行通信
主機(jī)與其它器件進(jìn)行數(shù)據(jù)傳送時(shí)總線上發(fā)送數(shù)據(jù)的器件為發(fā)送器,總線上接收數(shù)據(jù)的器件則為接收器。
1.2 I2C的尋址
I2C總線上傳輸?shù)臄?shù)據(jù)信號(hào)既有地址信號(hào),也有數(shù)據(jù)信號(hào)
主機(jī)在起始信號(hào)之后必須要傳輸一個(gè)從機(jī)的地址信號(hào)(7位),第八位是數(shù)據(jù)的傳送方向位,0表示主機(jī)發(fā)送數(shù)據(jù)(W),1表示主機(jī)接收數(shù)據(jù)(R)。從機(jī)上每個(gè)器件都會(huì)將七位地址碼進(jìn)行比較,如果相同則認(rèn)為被主機(jī)尋址,并根據(jù)R/W位確定是接收器還是發(fā)送器
1.3?i2c總線的信號(hào)
在I2C總線數(shù)據(jù)傳輸過程中存在四種信號(hào):起始信號(hào)、終止信號(hào)、應(yīng)答信號(hào)、非應(yīng)答信號(hào)
起始信號(hào):i2c總線傳輸數(shù)據(jù)的開始
SCL線為高電平期間,SDA線由高電平向低電平的變化表示起始信號(hào)
終止信號(hào):i2c總線一次數(shù)據(jù)傳輸?shù)慕Y(jié)束標(biāo)志
SCL線為高電平期間,SDA線由低電平向高電平的變化表示終止信號(hào)
應(yīng)答信號(hào)和非應(yīng)答信號(hào)
每一個(gè)字節(jié)必須保證是8位長(zhǎng)度。數(shù)據(jù)傳送時(shí),先傳送最高位(MSB),每一個(gè)被傳送的字節(jié)后面都必須跟隨一位應(yīng)答位(即一幀共有9位)。
應(yīng)答信號(hào):第九個(gè)時(shí)鐘周期,接收方往數(shù)據(jù)線上發(fā)送了一個(gè)低電平,就是應(yīng)答信號(hào)
非應(yīng)答信號(hào):第九個(gè)時(shí)鐘周期,接收方往數(shù)據(jù)線上發(fā)送了一個(gè)高電平,就是非應(yīng)答信號(hào)
當(dāng)接收方接收到數(shù)據(jù)后不想再接收數(shù)據(jù),此時(shí)會(huì)回應(yīng)發(fā)送方一個(gè)非應(yīng)答信號(hào)
當(dāng)接收方接收到數(shù)據(jù)后還想再接收數(shù)據(jù),此時(shí)會(huì)回應(yīng)發(fā)送方一個(gè)應(yīng)答信號(hào)
1.4?I2C總線上數(shù)據(jù)讀寫的時(shí)機(jī)
當(dāng)時(shí)鐘線為高電平時(shí),接收方可以讀取數(shù)據(jù)
當(dāng)時(shí)鐘線為低電平時(shí),發(fā)送方可以寫入數(shù)據(jù)
1.5?i2c主機(jī)的讀寫時(shí)序(重點(diǎn))
主機(jī)向從機(jī)發(fā)送一個(gè)字節(jié)數(shù)據(jù)
主機(jī)發(fā)起起始信號(hào)
主機(jī)發(fā)送7bit從機(jī)地址+1bit寫標(biāo)志位
從機(jī)回應(yīng)應(yīng)答信號(hào)
主機(jī)發(fā)送8bit寄存器地址
從機(jī)回應(yīng)應(yīng)答信號(hào)
主機(jī)發(fā)送8bit數(shù)據(jù)
從機(jī)回應(yīng)應(yīng)答信號(hào)
主機(jī)發(fā)起終止信號(hào)
主機(jī)向從機(jī)發(fā)送多個(gè)字節(jié)數(shù)據(jù)
主機(jī)發(fā)起起始信號(hào)
主機(jī)發(fā)送7bit從機(jī)地址+1bit寫標(biāo)志位
從機(jī)回應(yīng)應(yīng)答信號(hào)
主機(jī)發(fā)送8bit寄存器地址
從機(jī)回應(yīng)應(yīng)答信號(hào)
主機(jī)發(fā)送8bit數(shù)據(jù)
從機(jī)回應(yīng)應(yīng)答信號(hào)
.。。。。。
主機(jī)發(fā)起終止信號(hào)
主機(jī)讀取從機(jī)一個(gè)字節(jié)數(shù)據(jù)
主機(jī)發(fā)起起始信號(hào)
主機(jī)發(fā)送7bit從機(jī)地址+1bit寫標(biāo)志
從機(jī)回應(yīng)一個(gè)應(yīng)答信號(hào)
主機(jī)發(fā)送8bit寄存器地址
從機(jī)回應(yīng)一個(gè)應(yīng)答信號(hào)
主機(jī)發(fā)起一個(gè)重復(fù)起始信號(hào)
主機(jī)發(fā)送7bit從機(jī)地址+1bit讀標(biāo)志位
從機(jī)回應(yīng)應(yīng)答信號(hào)
從機(jī)發(fā)送一個(gè)字節(jié)數(shù)據(jù)
主機(jī)回應(yīng)非應(yīng)答信號(hào)
主機(jī)發(fā)起終止信號(hào)
主機(jī)讀取多個(gè)字節(jié)的時(shí)序
主機(jī)發(fā)起起始信號(hào)
主機(jī)發(fā)送7bit從機(jī)地址+1bit寫標(biāo)志
從機(jī)回應(yīng)一個(gè)應(yīng)答信號(hào)
主機(jī)發(fā)送8bit寄存器地址
從機(jī)回應(yīng)一個(gè)應(yīng)答信號(hào)
主機(jī)發(fā)起一個(gè)重復(fù)起始信號(hào)
主機(jī)發(fā)送7bit從機(jī)地址+1bit讀標(biāo)志位
從機(jī)回應(yīng)應(yīng)答信號(hào)
從機(jī)發(fā)送一個(gè)字節(jié)數(shù)據(jù)
主機(jī)回應(yīng)回應(yīng)應(yīng)答信號(hào)
只要主機(jī)回應(yīng)應(yīng)答信號(hào),從機(jī)就一直發(fā),直到主機(jī)回應(yīng)非應(yīng)答信號(hào)
主機(jī)回應(yīng)非應(yīng)答信號(hào)
主機(jī)發(fā)起終止信號(hào)
2. I2C總線讀取溫濕度傳感器數(shù)據(jù)實(shí)驗(yàn)
STM32MP157AAA讀取SI7006數(shù)據(jù)框圖
2.1查詢SI7006數(shù)據(jù)手冊(cè)
1.SI7006的從機(jī)地址
2.確定讀取溫度和濕度的對(duì)應(yīng)寄存器地址
3.確定溫度數(shù)據(jù)和濕度數(shù)據(jù)的字節(jié)數(shù)
4.如何初始化si7006芯片
5.如何將讀取到的溫濕度數(shù)據(jù)轉(zhuǎn)換成標(biāo)準(zhǔn)溫濕度形式
從機(jī)地址
讀取溫度和濕度數(shù)據(jù)的寄存器地址
讀取濕度的寄存器地址是0XE5 讀取溫度的寄存器地址是0XE3 讀取上一次測(cè)量的溫度的寄存器地址是0XE0 完成SI7006芯片的初始化需要向用戶寫寄存器中寫入一個(gè)數(shù)值,用戶寫寄存器地址是0XE6
主機(jī)保持模式下讀取溫濕度數(shù)據(jù)的時(shí)序
關(guān)于SI7006的初始化
完成SI7006的初始化,需要向用戶寫寄存器(0XE6)中寫入一個(gè)0X3A
溫濕度數(shù)據(jù)的計(jì)算公式
作業(yè)
設(shè)置溫度濕度閾值,當(dāng)溫度過高時(shí),打開風(fēng)扇,蜂鳴器報(bào)警
當(dāng)濕度比較高時(shí),打開LED1燈,蜂鳴器報(bào)警
main.c
#include "uart4.h"
#include "led.h"
#include "key_in.h"
#include "iic.h"
#include "si7006.h"
int main()
{
i2c_init();
si7006_init();
all_led_init();
while(1)
{
short tem;
unsigned short hum;
tem=si7006_read_tem();
hum=si7006_read_hum();
hum=125*hum/65536-6;
tem=175.72*tem/65536-46.85;
printf("hum:%d\n",hum);
printf("tem:%d\n",tem);
if(tem>30)
{
fan_on();
}else
{
fan_off();
}
if(hum>44)
{
bee_on();
}else
{
bee_off();
}
delay(1000);
bee_off();
}
return 0;
}
si7600.c
#include "si7006.h"
void delay(int ms)
{
int i,j;
for(i=0;i { for(j=0;j<2000;j++) { } } } void si7006_init() { i2c_start(); i2c_write_byte(0x40<<1|0); i2c_wait_ack(); i2c_write_byte(0xe6); i2c_wait_ack(); i2c_write_byte(0x3a); i2c_wait_ack(); i2c_stop(); } short si7006_read_tem() { short tem; char tem_l,tem_h; i2c_start(); i2c_write_byte(0x40<<1|0); i2c_wait_ack(); i2c_write_byte(0xe3); i2c_wait_ack(); i2c_start(); i2c_write_byte(0x40<<1|1); i2c_wait_ack(); delay(100); tem_h=i2c_read_byte(0); tem_l=i2c_read_byte(1); tem=tem_h<<8|tem_l; return tem; } unsigned short si7006_read_hum() { short hum; char hum_l,hum_h; i2c_start(); i2c_write_byte(0x40<<1|0); i2c_wait_ack(); i2c_write_byte(0xe5); i2c_wait_ack(); i2c_start(); i2c_write_byte(0x40<<1|1); i2c_wait_ack(); delay(100); hum_h=i2c_read_byte(0); hum_l=i2c_read_byte(1); hum=hum_h<<8|hum_l; return hum; } led.c #include "led.h" void all_led_init() { RCC->MP_AHB4ENSETR |= (0x3<<4); //pe10 設(shè)置輸出 GPIOE->MODER &= (~(0x3 <<20)); GPIOE->MODER |= (0x1 <<20); //pf10設(shè)置輸出 GPIOF->MODER &= (~(0x3 <<20)); GPIOF->MODER |= (0x1 <<20); //pe8設(shè)置輸出 GPIOE->MODER &= (~(0x3 <<16)); GPIOE->MODER |= (0x1 <<16); //蜂鳴器設(shè)置輸出 GPIOB->MODER &= (~(0x3 <<12)); GPIOB->MODER |= (0x1 <<12); //風(fēng)扇設(shè)置輸出 GPIOE->MODER &= (~(0x3 <<18)); GPIOE->MODER |= (0x1 <<18); //馬達(dá)設(shè)置輸出 GPIOF->MODER &= (~(0x3 <<12)); GPIOF->MODER |= (0x1 <<12); //設(shè)置推挽 GPIOE->OTYPER &= (~(0x1 <<10)); GPIOF->OTYPER &= (~(0x1 <<10)); GPIOE->OTYPER &= (~(0x1 <<8)); //設(shè)置低速 GPIOE->OSPEEDR &= (~(0x3 <<20)); GPIOF->OSPEEDR &= (~(0x3 <<20)); GPIOE->OSPEEDR &= (~(0x3 <<16)); //設(shè)置無上拉下拉 GPIOE->PUPDR &= (~(0x3 <<20)); GPIOF->PUPDR &= (~(0x3 <<20)); GPIOE->PUPDR &= (~(0x3 <<16)); //默認(rèn)輸出低電平 GPIOE->ODR &=(~(0x1 <<10)); GPIOF->ODR &=(~(0x1 <<10)); GPIOE->ODR &=(~(0x1 <<8)); } void LED1_ON() { GPIOE->ODR |=(0x1 <<10); } void LED2_ON() { GPIOF->ODR |= (0x1 <<10); } void LED3_ON() { GPIOE->ODR |=(0x1 <<8); } void LED1_OFF() { GPIOE->ODR &=(~(0x1 <<10)); } void LED2_OFF() { GPIOF->ODR &=(~(0x1 <<10)); } void LED3_OFF() { GPIOE->ODR &=(~(0x1 <<8)); } void bee_on() { GPIOB->ODR |=(0x1 <<6); } void bee_off() { GPIOB->ODR &=(~(0x1 <<6)); } void fan_on() { GPIOE->ODR |=(0x1 <<9); } void fan_off() { GPIOE->ODR &=(~(0x1 <<9)); } void motor_on() { GPIOF->ODR |=(0x1 <<6); } void motor_off() { GPIOF->ODR &=(~(0x1 <<6)); } 柚子快報(bào)邀請(qǐng)碼778899分享:筆記 3.25號(hào)arm 文章來源
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場(chǎng)。
轉(zhuǎn)載請(qǐng)注明,如有侵權(quán),聯(lián)系刪除。