0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

RT-Thread設(shè)備框架使用指南——I2C總線設(shè)備簡(jiǎn)介

RTThread物聯(lián)網(wǎng)操作系統(tǒng) ? 來(lái)源:lq ? 2019-01-22 11:50 ? 次閱讀

I2C 簡(jiǎn)介

I2C(Inter Integrated Circuit)總線是 PHILIPS 公司開(kāi)發(fā)的一種半雙工、雙向二線制同步串行總線。I2C 總線傳輸數(shù)據(jù)時(shí)只需兩根信號(hào)線,一根是雙向數(shù)據(jù)線 SDA(serial data),另一根是雙向時(shí)鐘線 SCL(serial clock)。SPI 總線有兩根線分別用于主從設(shè)備之間接收數(shù)據(jù)和發(fā)送數(shù)據(jù),而 I2C 總線只使用一根線進(jìn)行數(shù)據(jù)收發(fā)。

I2C 和 SPI 一樣以主從的方式工作,不同于 SPI 一主多從的結(jié)構(gòu),它允許同時(shí)有多個(gè)主設(shè)備存在,每個(gè)連接到總線上的器件都有唯一的地址,主設(shè)備啟動(dòng)數(shù)據(jù)傳輸并產(chǎn)生時(shí)鐘信號(hào),從設(shè)備被主設(shè)備尋址,同一時(shí)刻只允許有一個(gè)主設(shè)備。如下圖所示:

I2C 總線主從設(shè)備連接方式

如下圖所示為 I2C 總線主要的數(shù)據(jù)傳輸格式:

I2C 總線數(shù)據(jù)傳輸格式

當(dāng)總線空閑時(shí),SDA 和 SCL 都處于高電平狀態(tài),當(dāng)主機(jī)要和某個(gè)從機(jī)通訊時(shí),會(huì)先發(fā)送一個(gè)開(kāi)始信號(hào),然后發(fā)送從機(jī)地址和讀寫(xiě)控制位,接下來(lái)傳輸數(shù)據(jù)(主機(jī)發(fā)送或者接收數(shù)據(jù)),數(shù)據(jù)傳輸結(jié)束時(shí)主機(jī)會(huì)發(fā)送結(jié)束信號(hào)。傳輸?shù)拿總€(gè)字節(jié)為8位,高位在前,低位在后。數(shù)據(jù)傳輸過(guò)程中的不同名詞詳解如下所示:

開(kāi)始條件:SCL 為高電平時(shí),主機(jī)將 SDA 拉低,表示數(shù)據(jù)傳輸即將開(kāi)始。

從機(jī)地址:主機(jī)發(fā)送的第一個(gè)字節(jié)為從機(jī)地址,高 7 位為地址,最低位為 R/W 讀寫(xiě)控制位,1 表示讀操作,0 表示寫(xiě)操作。一般從機(jī)地址有 7 位地址模式和 10 位地址模式兩種,如果是 10 位地址模式,第一個(gè)字節(jié)的頭 7 位 是 11110XX 的組合,其中最后兩位(XX)是 10 位地址的兩個(gè)最高位,第二個(gè)字節(jié)為 10 位從機(jī)地址的剩下8位,如下圖所示:

7 位地址和 10 位地址格式

應(yīng)答信號(hào):每傳輸完成一個(gè)字節(jié)的數(shù)據(jù),接收方就需要回復(fù)一個(gè) ACK(acknowledge)。寫(xiě)數(shù)據(jù)時(shí)由從機(jī)發(fā)送 ACK,讀數(shù)據(jù)時(shí)由主機(jī)發(fā)送 ACK。當(dāng)主機(jī)讀到最后一個(gè)字節(jié)數(shù)據(jù)時(shí),可發(fā)送 NACK(Negative Acknowledgement)然后跟停止條件。

數(shù)據(jù):地址幀發(fā)送完后可能會(huì)發(fā)送一些指令,依從機(jī)而定,然后開(kāi)始傳輸數(shù)據(jù),由主機(jī)或者從機(jī)發(fā)送,每個(gè)數(shù)據(jù)為 8 位,數(shù)據(jù)的字節(jié)數(shù)沒(méi)有限制。

重復(fù)開(kāi)始條件:在一次通信過(guò)程中,主機(jī)可能需要和不同的從機(jī)傳輸數(shù)據(jù)或者需要切換讀寫(xiě)操作時(shí),主機(jī)可以再發(fā)送一個(gè)開(kāi)始條件。

停止條件:在 SDA 為低電平時(shí),主機(jī)將 SCL 拉高并保持高電平,然后在將 SDA 拉高,表示傳輸結(jié)束。

訪問(wèn) I2C 總線設(shè)備

一般情況下 MCU 的 I2C 器件都是作為主機(jī)和從機(jī)通訊,在 RT-Thread 中將 I2C 主機(jī)虛擬為 I2C總線設(shè)備,I2C 從機(jī)通過(guò) I2C 設(shè)備接口和 I2C 總線通訊,相關(guān)接口如下所示:

查找 I2C 總線設(shè)備

在使用 I2C 總線設(shè)備前需要根據(jù) I2C 總線設(shè)備名稱獲取設(shè)備句柄,進(jìn)而才可以操作 I2C 總線設(shè)備,查找設(shè)備函數(shù)如下所示,

1rt_device_trt_device_find(constchar*name);


1#defineAHT10_I2C_BUS_NAME"i2c1"/*傳感器連接的I2C總線設(shè)備名稱*/2structrt_i2c_bus_device*i2c_bus;/*I2C總線設(shè)備句柄*/34/*查找I2C總線設(shè)備,獲取I2C總線設(shè)備句柄*/5i2c_bus=(structrt_i2c_bus_device*)rt_device_find(name);一般情況下,注冊(cè)到系統(tǒng)的 I2C 設(shè)備名稱為 i2c0 ,i2c1等,使用示例如下所示:

數(shù)據(jù)傳輸

獲取到 I2C 總線設(shè)備句柄就可以使用 rt_i2c_transfer() 進(jìn)行數(shù)據(jù)傳輸。函數(shù)原型如下所示:

1rt_size_trt_i2c_transfer(structrt_i2c_bus_device*bus,2structrt_i2c_msgmsgs[],3rt_uint32_tnum);

和 SPI 總線的自定義傳輸接口一樣,I2C 總線的自定義傳輸接口傳輸?shù)臄?shù)據(jù)也是以一個(gè)消息為單位。參數(shù) msgs[] 指向待傳輸?shù)南?shù)組,用戶可以自定義每條消息的內(nèi)容,實(shí)現(xiàn) I2C 總線所支持的 2 種不同的數(shù)據(jù)傳輸模式。如果主設(shè)備需要發(fā)送重復(fù)開(kāi)始信號(hào),則需要發(fā)送 2 個(gè)消息。

I2C 消息數(shù)據(jù)結(jié)構(gòu)原型如下:

1structrt_i2c_msg2{3rt_uint16_taddr;/*從機(jī)地址*/4rt_uint16_tflags;/*讀、寫(xiě)標(biāo)志等*/5rt_uint16_tlen;/*讀寫(xiě)數(shù)據(jù)字節(jié)數(shù)*/6rt_uint8_t*buf;/*讀寫(xiě)數(shù)據(jù)緩沖區(qū)指針*/7}

從機(jī)地址 addr:支持 7 位和 10 位二進(jìn)制地址,需查看不同設(shè)備的數(shù)據(jù)手冊(cè) 。RT-Thread I2C 設(shè)備接口使用的從機(jī)地址均為不包含讀寫(xiě)位的地址,讀寫(xiě)位控制需修改標(biāo)志 flags。

標(biāo)志 flags 可取值為以下宏定義,根據(jù)需要可以與其他宏使用位運(yùn)算 “|” 組合起來(lái)使用。

1#defineRT_I2C_WR0x0000/*寫(xiě)標(biāo)志*/2#defineRT_I2C_RD(1u<

使用示例如下所示:

1#defineAHT10_I2C_BUS_NAME"i2c1"/*傳感器連接的I2C總線設(shè)備名稱*/ 2#defineAHT10_ADDR0x38/*從機(jī)地址*/ 3structrt_i2c_bus_device*i2c_bus;/*I2C總線設(shè)備句柄*/ 4 5/*查找I2C總線設(shè)備,獲取I2C總線設(shè)備句柄*/ 6i2c_bus=(structrt_i2c_bus_device*)rt_device_find(name); 7 8/*讀傳感器寄存器數(shù)據(jù)*/ 9staticrt_err_tread_regs(structrt_i2c_bus_device*bus,rt_uint8_tlen,rt_uint8_t*buf)10{11structrt_i2c_msgmsgs;1213msgs.addr=AHT10_ADDR;/*從機(jī)地址*/14msgs.flags=RT_I2C_RD;/*讀標(biāo)志*/15msgs.buf=buf;/*讀寫(xiě)數(shù)據(jù)緩沖區(qū)指針*/16msgs.len=len;/*讀寫(xiě)數(shù)據(jù)字節(jié)數(shù)*/1718/*調(diào)用I2C設(shè)備接口傳輸數(shù)據(jù)*/19if(rt_i2c_transfer(bus,&msgs,1)==1)20{21returnRT_EOK;22}23else24{25return-RT_ERROR;26}27}

I2C 總線設(shè)備使用示例

I2C 設(shè)備的具體使用方式可以參考如下示例代碼,示例代碼的主要步驟如下:

首先根據(jù) I2C 設(shè)備名稱查找 I2C 名稱,獲取設(shè)備句柄,然后初始化 aht10 傳感器。

控制傳感器的 2 的函數(shù)為寫(xiě)傳感器寄存器 write_reg() 和讀傳感器寄存器 read_regs(),這兩個(gè)函數(shù)分別調(diào)用了 rt_i2c_transfer() 傳輸數(shù)據(jù)。讀取溫濕度信息的函數(shù) read_temp_humi() 則是調(diào)用這兩個(gè)函數(shù)完成功能。

1/* 2*程序清單:這是一個(gè)I2C設(shè)備使用例程 3*例程導(dǎo)出了i2c_aht10_sample命令到控制終端 4*命令調(diào)用格式:i2c_aht10_samplei2c1 5*命令解釋:命令第二個(gè)參數(shù)是要使用的I2C總線設(shè)備名稱,為空則使用默認(rèn)的I2C總線設(shè)備 6*程序功能:通過(guò)I2C設(shè)備讀取溫濕度傳感器aht10的溫濕度數(shù)據(jù)并打印 7*/ 8 9#include 10#include 11 12#defineAHT10_I2C_BUS_NAME"i2c1"/*傳感器連接的I2C總線設(shè)備名稱*/ 13#defineAHT10_ADDR0x38/*從機(jī)地址*/ 14#defineAHT10_CALIBRATION_CMD0xE1/*校準(zhǔn)命令*/ 15#defineAHT10_NORMAL_CMD0xA8/*一般命令*/ 16#defineAHT10_GET_DATA0xAC/*獲取數(shù)據(jù)命令*/ 17 18staticstructrt_i2c_bus_device*i2c_bus=RT_NULL;/*I2C總線設(shè)備句柄*/ 19staticrt_bool_tinitialized=RT_FALSE;/*傳感器初始化狀態(tài)*/ 20 21/*寫(xiě)傳感器寄存器*/ 22staticrt_err_twrite_reg(structrt_i2c_bus_device*bus,rt_uint8_treg,rt_uint8_t*data) 23{ 24rt_uint8_tbuf[3]; 25structrt_i2c_msgmsgs; 26 27buf[0]=reg;//cmd 28buf[1]=data[0]; 29buf[2]=data[1]; 30 31msgs.addr=AHT10_ADDR; 32msgs.flags=RT_I2C_WR; 33msgs.buf=buf; 34msgs.len=3; 35 36/*調(diào)用I2C設(shè)備接口傳輸數(shù)據(jù)*/ 37if(rt_i2c_transfer(bus,&msgs,1)==1) 38{ 39returnRT_EOK; 40} 41else 42{ 43return-RT_ERROR; 44} 45} 46 47/*讀傳感器寄存器數(shù)據(jù)*/ 48staticrt_err_tread_regs(structrt_i2c_bus_device*bus,rt_uint8_tlen,rt_uint8_t*buf) 49{ 50structrt_i2c_msgmsgs; 51 52msgs.addr=AHT10_ADDR; 53msgs.flags=RT_I2C_RD; 54msgs.buf=buf; 55msgs.len=len; 56 57/*調(diào)用I2C設(shè)備接口傳輸數(shù)據(jù)*/ 58if(rt_i2c_transfer(bus,&msgs,1)==1) 59{ 60returnRT_EOK; 61} 62else 63{ 64return-RT_ERROR; 65} 66} 67 68staticvoidread_temp_humi(float*cur_temp,float*cur_humi) 69{ 70rt_uint8_ttemp[6]; 71 72write_reg(i2c_bus,AHT10_GET_DATA,0);/*發(fā)送命令*/ 73read_regs(i2c_bus,6,temp);/*獲取傳感器數(shù)據(jù)*/ 74 75/*濕度數(shù)據(jù)轉(zhuǎn)換*/ 76*cur_humi=(temp[1]<>4)*100.0/(1<

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • SPI
    SPI
    +關(guān)注

    關(guān)注

    17

    文章

    1706

    瀏覽量

    91598
  • 總線
    +關(guān)注

    關(guān)注

    10

    文章

    2881

    瀏覽量

    88095
  • I2C
    I2C
    +關(guān)注

    關(guān)注

    28

    文章

    1487

    瀏覽量

    123786

原文標(biāo)題:RT-Thread設(shè)備框架使用指南——I2C 總線設(shè)備

文章出處:【微信號(hào):RTThread,微信公眾號(hào):RTThread物聯(lián)網(wǎng)操作系統(tǒng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    RT-Thread記錄(十四、I/O 設(shè)備模型之ADC設(shè)備

    我曾經(jīng)考慮過(guò)把 RT-Thread 常用的設(shè)備都寫(xiě)完,其實(shí)通過(guò)前面的《全面認(rèn)識(shí) RT-Thread I/O 設(shè)備模型》文章學(xué)習(xí),以及 UAR
    的頭像 發(fā)表于 07-04 12:28 ?4420次閱讀
    <b class='flag-5'>RT-Thread</b>記錄(十四、<b class='flag-5'>I</b>/O <b class='flag-5'>設(shè)備</b>模型之ADC<b class='flag-5'>設(shè)備</b>)

    【先楫HPM5361EVK開(kāi)發(fā)板試用體驗(yàn)】RT-Thread I2C使用

    RT-ThreadI2C簡(jiǎn)介 I2C(Inter Integrated Circuit)總線是 PHILIPS 公司開(kāi)發(fā)的一種半雙工、
    發(fā)表于 12-25 23:57

    分析rt-threadI2C設(shè)備驅(qū)動(dòng)框架

    簡(jiǎn)要上一篇分析了RTT的PIN驅(qū)動(dòng),得到了很多網(wǎng)友的認(rèn)可,很開(kāi)心。很多人跟我反映寫(xiě)一些u***,wlan等框架,這個(gè)一步一步來(lái),從淺到深。這一篇文章我們來(lái)分析rt-threadI2C設(shè)備
    發(fā)表于 01-12 06:23

    【資料】RT-Thread設(shè)備框架使用指南

    是合并進(jìn)行的,如采樣和保持,量化和編碼在轉(zhuǎn)換過(guò)程中是同時(shí)實(shí)現(xiàn)的。3、RT-Thread設(shè)備框架使用指南——I2C
    發(fā)表于 03-22 16:07

    基于RT-Thread設(shè)備框架實(shí)現(xiàn)的tca9534軟件包

    游戲機(jī))工業(yè)自動(dòng)化gpio有限的處理器產(chǎn)品3 支持情況4 使用說(shuō)明4.1 依賴RT-Thread 3.0.0+I2C 驅(qū)動(dòng),tca9534設(shè)備使用 I2C 進(jìn)行數(shù)據(jù)通訊,需要系統(tǒng)
    發(fā)表于 05-16 16:21

    RT-ThreadI2C設(shè)備的驅(qū)動(dòng)框架對(duì)接如何實(shí)現(xiàn)

    。RT-Thread中引入了I2C設(shè)備設(shè)備驅(qū)動(dòng)框架,該驅(qū)動(dòng)框架提供了基于芯片GPIO進(jìn)行模擬的
    發(fā)表于 05-19 17:11

    如何使用I2C設(shè)備驅(qū)動(dòng)接口開(kāi)發(fā)應(yīng)用程序

    2 個(gè) GPIO 自行編寫(xiě)程序模擬 I2C 總線協(xié)議實(shí)現(xiàn)同樣的功能。RT-Thread 提供了一套 I/O
    發(fā)表于 08-18 10:54

    詳解RT-Thread I2C設(shè)備驅(qū)動(dòng)框架及相關(guān)函數(shù)

    2 個(gè) GPIO 自行編寫(xiě)程序模擬 I2C 總線協(xié)議實(shí)現(xiàn)同樣的功能。RT-Thread 提供了一套 I/O
    發(fā)表于 10-25 12:02

    詳細(xì)講解RT-Thread I2C設(shè)備驅(qū)動(dòng)框架及相關(guān)函數(shù)

    本應(yīng)用筆記以驅(qū)動(dòng)I2C接口的6軸傳感器MPU6050為例,說(shuō)明了如何使用I2C設(shè)備驅(qū)動(dòng)接口開(kāi)發(fā)應(yīng)用程序,并詳細(xì)講解了RT-Thread I2C
    的頭像 發(fā)表于 03-29 10:52 ?2.1w次閱讀
    詳細(xì)講解<b class='flag-5'>RT-Thread</b> <b class='flag-5'>I2C</b><b class='flag-5'>設(shè)備</b>驅(qū)動(dòng)<b class='flag-5'>框架</b>及相關(guān)函數(shù)

    RT-Thread設(shè)備模型框架及創(chuàng)建注冊(cè)設(shè)備的實(shí)現(xiàn)

    RT-Thread設(shè)備模型框架及創(chuàng)建注冊(cè)設(shè)備的實(shí)現(xiàn)方式介紹如下:
    的頭像 發(fā)表于 05-28 10:38 ?2188次閱讀
    <b class='flag-5'>RT-Thread</b><b class='flag-5'>設(shè)備</b>模型<b class='flag-5'>框架</b>及創(chuàng)建注冊(cè)<b class='flag-5'>設(shè)備</b>的實(shí)現(xiàn)

    RT-Thread文檔_RT-Thread 簡(jiǎn)介

    RT-Thread文檔_RT-Thread 簡(jiǎn)介
    發(fā)表于 02-22 18:22 ?5次下載
    <b class='flag-5'>RT-Thread</b>文檔_<b class='flag-5'>RT-Thread</b> <b class='flag-5'>簡(jiǎn)介</b>

    RT-Thread文檔_I/O 設(shè)備模型

    RT-Thread文檔_I/O 設(shè)備模型
    發(fā)表于 02-22 18:31 ?0次下載
    <b class='flag-5'>RT-Thread</b>文檔_<b class='flag-5'>I</b>/O <b class='flag-5'>設(shè)備</b>模型

    RT-Thread文檔_I2C 總線設(shè)備

    RT-Thread文檔_I2C 總線設(shè)備
    發(fā)表于 02-22 18:35 ?0次下載
    <b class='flag-5'>RT-Thread</b>文檔_<b class='flag-5'>I2C</b> <b class='flag-5'>總線</b><b class='flag-5'>設(shè)備</b>

    淺析RT-Thread設(shè)備驅(qū)動(dòng)框架

    RT-Thread 設(shè)備框架屬于組件和服務(wù)層,是基于 RT-Thread 內(nèi)核之上的上層軟件。設(shè)備框架
    的頭像 發(fā)表于 08-07 15:39 ?1982次閱讀

    RT-Thread設(shè)備驅(qū)動(dòng)開(kāi)發(fā)指南》基礎(chǔ)篇--以先楫bsp的hwtimer設(shè)備為例

    一、概述(一)RT-Thread設(shè)備驅(qū)動(dòng)《RT-Thread設(shè)備驅(qū)動(dòng)開(kāi)發(fā)指南》書(shū)籍是RT-thread
    的頭像 發(fā)表于 02-24 08:16 ?1667次閱讀
    《<b class='flag-5'>RT-Thread</b><b class='flag-5'>設(shè)備</b>驅(qū)動(dòng)開(kāi)發(fā)<b class='flag-5'>指南</b>》基礎(chǔ)篇--以先楫bsp的hwtimer<b class='flag-5'>設(shè)備</b>為例