面向物聯(lián)網(wǎng)的嵌入式系統(tǒng)開發(fā)25STM32I2C通信技術(shù)應(yīng)用開發(fā)課件_第1頁
面向物聯(lián)網(wǎng)的嵌入式系統(tǒng)開發(fā)25STM32I2C通信技術(shù)應(yīng)用開發(fā)課件_第2頁
面向物聯(lián)網(wǎng)的嵌入式系統(tǒng)開發(fā)25STM32I2C通信技術(shù)應(yīng)用開發(fā)課件_第3頁
面向物聯(lián)網(wǎng)的嵌入式系統(tǒng)開發(fā)25STM32I2C通信技術(shù)應(yīng)用開發(fā)課件_第4頁
面向物聯(lián)網(wǎng)的嵌入式系統(tǒng)開發(fā)25STM32I2C通信技術(shù)應(yīng)用開發(fā)課件_第5頁
已閱讀5頁,還剩29頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、CC2530和STM32嵌入式接口技術(shù)開發(fā)6.2 STM32 I2C通信技術(shù)應(yīng)用開發(fā)I2C總線STM32的I2C原理STM32 IIC庫函數(shù)的使用溫濕度傳感器項(xiàng)目實(shí)踐IIC總線協(xié)議介紹IIC(InterIntegrated Circuit)總線是一種由PHILIPS公司開發(fā)的兩線式串行總線(通常稱I2C),用于連接微控制器及其外圍設(shè)備。它是由數(shù)據(jù)線SDA和時(shí)鐘SCL構(gòu)成的串行總線,可發(fā)送和接收數(shù)據(jù)。IIC物理層IIC支持多個(gè)設(shè)備連接總線電容需小于400pFIIC的控制線較少只有SDA和SCL兩根信號(hào)線IIC設(shè)備都有獨(dú)立地址總線通過設(shè)備地址識(shí)別設(shè)備IIC需設(shè)置上拉電阻確認(rèn)總線電平狀態(tài)IIC的數(shù)據(jù)

2、傳輸靈活速度從100到400kbit/sIIC協(xié)議層讀寫指令段IIC讀寫指令I(lǐng)IC啟停信號(hào)IIC數(shù)據(jù)有效性IIC從機(jī)地址IIC響應(yīng)與非響應(yīng)信號(hào)STM32的IIC原理1. 通訊引腳SDA數(shù)據(jù)總線和SCL時(shí)鐘總線。2. 時(shí)鐘控制邏輯通過時(shí)鐘可以控制IIC總線的通信速率。3. 數(shù)據(jù)控制邏輯對(duì)數(shù)據(jù)和地址進(jìn)行控制和識(shí)別4. 整體控制邏輯負(fù)責(zé)協(xié)調(diào)整個(gè)I2C外設(shè)STM32的IIC主發(fā)送器STM32的IIC主接收器STM32的IIC的使用typedefstructuint32_t I2C_ClockSpeed;/設(shè)置SCL時(shí)鐘頻率,此值要低于400000uint16_t I2C_Mode;/指定工作模式,可選

3、I2C模式及SMBUS模式uint16_t I2C_DutyCycle;/指定時(shí)鐘占空比,可選low/high=2:1及16:9模式uint16_t I2C_OwnAddress1;/指定自身的I2C設(shè)備地址uint16_t I2C_Ack;/使能或關(guān)閉響應(yīng)(一般都要使能)uint16_t I2C_AcknowledgedAddress;/指定地址的長(zhǎng)度,可為7位及10位I2C_InitTypeDef;STM32集成的IIC庫比較精簡(jiǎn),只需要配置相關(guān)參數(shù)即可使用。HTU21D溫濕度傳感器Humirel公司HTU21D溫濕度傳感器,傳感器輸出經(jīng)過標(biāo)定的數(shù)字信號(hào),標(biāo)準(zhǔn)I2C格式。HTU21D的分辨

4、率可以通過輸入命令進(jìn)行改變(8/12bit乃至12/14bit的RH/T),傳感器可以檢測(cè)到電池低電量狀態(tài),并且輸出校驗(yàn)和,有助于提高通信的可靠性。項(xiàng)目場(chǎng)景庫房?jī)?nèi)安裝一定數(shù)量的環(huán)境檢測(cè)傳感器來實(shí)現(xiàn)對(duì)內(nèi)部環(huán)境無死角的實(shí)時(shí)檢測(cè)。這些傳感器不光數(shù)量眾多而且種類也眾多。如何在盡量少使用嵌入式處理芯片的情況下而獲得更多的數(shù)據(jù),最有效的方法就是采用總線連接,通過使用IIC總線可以實(shí)現(xiàn)一條總線連接多個(gè)IIC設(shè)備,從而達(dá)到高效數(shù)據(jù)采集。任務(wù)目標(biāo)庫房環(huán)境監(jiān)控系統(tǒng)生產(chǎn)企業(yè)要設(shè)計(jì)一套集成了環(huán)境采集系統(tǒng)和庫房?jī)?nèi)部環(huán)境干預(yù)系統(tǒng)的綜合環(huán)境維持系統(tǒng),要求使用STM32處理器I2C接口采集溫濕度傳感器的數(shù)據(jù),數(shù)據(jù)可通過顯示屏

5、實(shí)時(shí)顯示。項(xiàng)目實(shí)踐本項(xiàng)目設(shè)計(jì)采用STM32F407的GPIO模擬IIC總線接口,將模擬總線與Plus節(jié)點(diǎn)板載的溫濕度傳感器相連接,使用IIC總線協(xié)議實(shí)現(xiàn)對(duì)溫濕度傳感器的數(shù)據(jù)獲取,通過串口將采集的溫濕度傳感器數(shù)據(jù)打印在PC上以顯示獲取的信息。項(xiàng)目硬件連接圖溫濕度傳感器原理圖項(xiàng)目程序邏輯框圖項(xiàng)目實(shí)現(xiàn)void iic_init(void)GPIO_InitTypeDef GPIO_InitStructure;RCC_AHB1PeriphClockCmd(I2C_CLK, ENABLE);GPIO_InitStructure.GPIO_Pin = PIN_SCL | PIN_SDA;GPIO_Init

6、Structure.GPIO_Mode = GPIO_Mode_OUT;GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;GPIO_Init(I2C_GPIO, &GPIO_InitStructure); I2C初始化函數(shù)項(xiàng)目實(shí)現(xiàn)void sda_out(void)GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure

7、.GPIO_Pin = PIN_SDA;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;GPIO_Init(I2C_GPIO, &GPIO_InitStructure); 設(shè)置SDA為輸出項(xiàng)目實(shí)現(xiàn)void sda_in(void)GPIO_InitTypeDef GPIO_Init

8、Structure;GPIO_InitStructure.GPIO_Pin = PIN_SDA;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;GPIO_Init(I2C_GPIO, &GPIO_InitStructure); 設(shè)置SDA為輸入項(xiàng)目實(shí)現(xiàn)void iic_start(v

9、oid)sda_out();GPIO_SetBits(I2C_GPIO,PIN_SDA); /拉高數(shù)據(jù)線GPIO_SetBits(I2C_GPIO,PIN_SCL); /拉高時(shí)鐘線delay_us(5); /延時(shí)GPIO_ResetBits(I2C_GPIO,PIN_SDA); /產(chǎn)生下降沿delay_us(5); /延時(shí)GPIO_ResetBits(I2C_GPIO,PIN_SCL); /拉低時(shí)鐘線I2C初始信號(hào)項(xiàng)目實(shí)現(xiàn)void iic_stop(void)sda_out();GPIO_ResetBits(I2C_GPIO,PIN_SDA); /拉低數(shù)據(jù)線GPIO_SetBits(I2C_G

10、PIO,PIN_SCL); /拉高時(shí)鐘線delay_us(5); /延時(shí)5usGPIO_SetBits(I2C_GPIO,PIN_SDA); /產(chǎn)生上升沿delay_us(5); /延時(shí)5usI2C停止信號(hào)項(xiàng)目實(shí)現(xiàn)void iic_send_ack(int ack)sda_out();if(ack)GPIO_SetBits(I2C_GPIO,PIN_SDA); /寫應(yīng)答信號(hào)elseGPIO_ResetBits(I2C_GPIO,PIN_SCL); GPIO_SetBits(I2C_GPIO,PIN_SCL); /拉高時(shí)鐘線delay_us(5); /延時(shí)GPIO_ResetBits(I2C_G

11、PIO,PIN_SCL); /拉低時(shí)鐘線delay_us(5); /延時(shí)I2C應(yīng)答信號(hào)項(xiàng)目實(shí)現(xiàn)int iic_recv_ack(void)int CY = 0;sda_in();GPIO_SetBits(I2C_GPIO,PIN_SCL); /拉高時(shí)鐘線delay_us(5); /延時(shí)CY = SDA_R; /讀應(yīng)答信號(hào)GPIO_ResetBits(I2C_GPIO,PIN_SDA); /拉低時(shí)鐘線delay_us(5); /延時(shí)return CY;I2C接收應(yīng)答信號(hào)項(xiàng)目實(shí)現(xiàn)unsigned char iic_write_byte(unsigned char data)unsigned cha

12、r i;sda_out();GPIO_ResetBits(I2C_GPIO,PIN_SCL); /拉低時(shí)鐘線for(i = 0;i 8;i+) if(data & 0 x80) /判斷數(shù)據(jù)最高位是否為1GPIO_SetBits(I2C_GPIO,PIN_SDA); elseGPIO_ResetBits(I2C_GPIO,PIN_SDA); delay_us(5); /延時(shí)5usI2C寫一個(gè)字節(jié)數(shù)據(jù)項(xiàng)目實(shí)現(xiàn)GPIO_SetBits(I2C_GPIO,PIN_SCL); /輸出SDA穩(wěn)定后,拉高SCL給出上升沿,從機(jī)檢測(cè)到后進(jìn)行數(shù)據(jù)采樣delay_us(5); /延時(shí)5usGPIO_ResetBi

13、ts(I2C_GPIO,PIN_SCL); /拉低時(shí)鐘線delay_us(5); /延時(shí)5usdata = 1; /數(shù)組左移一位 delay_us(5); /延時(shí)2ussda_in();I2C寫一個(gè)字節(jié)數(shù)據(jù)項(xiàng)目實(shí)現(xiàn)GPIO_SetBits(I2C_GPIO,PIN_SDA); /拉高數(shù)據(jù)線GPIO_SetBits(I2C_GPIO,PIN_SCL); /拉高時(shí)鐘線delay_us(5); /延時(shí)2us,等待從機(jī)應(yīng)答if(SDA_R) /SDA為高,收到NACKreturn 1;else /SDA為低,收到ACKGPIO_ResetBits(I2C_GPIO,PIN_SCL); /釋放總線 de

14、lay_us(5); /延時(shí)2us,等待從機(jī)應(yīng)答return 0;I2C寫一個(gè)字節(jié)數(shù)據(jù)項(xiàng)目實(shí)現(xiàn)unsigned char iic_read_byte(unsigned char ack)unsigned char i,data = 0;sda_in();GPIO_ResetBits(I2C_GPIO,PIN_SCL); GPIO_SetBits(I2C_GPIO,PIN_SDA); /釋放總線for(i = 0;i 8;i+)GPIO_SetBits(I2C_GPIO,PIN_SCL); /給出上升沿delay_us(30); /延時(shí)等待信號(hào)穩(wěn)定data = 1;I2C讀一個(gè)字節(jié)數(shù)據(jù)項(xiàng)目實(shí)現(xiàn)if(SDA_R) /采樣獲取數(shù)據(jù)data |= 0 x01;elsedata &= 0 xfe;delay_us(10);GPIO_ResetBits(I2C_GPIO,PIN_SCL); /下降沿,從機(jī)給出下一位值delay_us(20);sda_out();if(ack)GPIO_SetBits(I2C_GPIO,PIN_SDA); /應(yīng)答狀態(tài)elseGPIO_Reset

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論