01
物聯(lián)網(wǎng)系統(tǒng)中為什么要使用IIC I/O擴(kuò)展芯片
在物聯(lián)網(wǎng)系統(tǒng)中使用IIC(也稱(chēng)為I2C)I/O擴(kuò)展芯片的原因主要可以歸結(jié)為以下幾點(diǎn):
1、擴(kuò)大I/O端口數(shù)量
硬件資源限制:許多微控制器(MCU)自帶的I/O端口數(shù)量有限,但物聯(lián)網(wǎng)項(xiàng)目往往需要連接大量的傳感器、執(zhí)行器和其他外設(shè)。I2C I/O擴(kuò)展芯片能夠通過(guò)I2C接口提供額外的I/O端口,從而滿(mǎn)足項(xiàng)目需求。
靈活性:通過(guò)擴(kuò)展芯片,設(shè)計(jì)者可以根據(jù)項(xiàng)目需求靈活增加或減少外設(shè)連接,而無(wú)需更換主控制器。
2、簡(jiǎn)化布線和連接
減少引腳需求:I2C總線僅需要兩根線(SCL時(shí)鐘線和SDA數(shù)據(jù)線)即可實(shí)現(xiàn)多個(gè)設(shè)備之間的通信,這大大減少了系統(tǒng)布線的復(fù)雜性和成本。
便于管理:通過(guò)I2C總線連接的設(shè)備可以使用統(tǒng)一的通信協(xié)議進(jìn)行通信,簡(jiǎn)化了系統(tǒng)的維護(hù)和管理工作。
3、提高系統(tǒng)性能
高效通信:I2C協(xié)議具有高效的通信機(jī)制,能夠支持高速數(shù)據(jù)傳輸,提高系統(tǒng)的整體性能。
時(shí)鐘控制:I2C I/O擴(kuò)展芯片可以控制外部設(shè)備的時(shí)鐘,有助于優(yōu)化系統(tǒng)的時(shí)序控制,提高系統(tǒng)的穩(wěn)定性和可靠性。
4、降低成本和功耗
減少元件數(shù)量:使用I2C I/O擴(kuò)展芯片可以減少系統(tǒng)中其他類(lèi)型擴(kuò)展元件的使用,從而降低整體成本。
低功耗:I2C總線支持低功耗模式,有助于降低系統(tǒng)的整體功耗,延長(zhǎng)電池壽命(在便攜式或無(wú)線物聯(lián)網(wǎng)設(shè)備中尤為重要)。
5、廣泛應(yīng)用場(chǎng)景
傳感器網(wǎng)絡(luò):在物聯(lián)網(wǎng)系統(tǒng)中,傳感器是不可或缺的組成部分。I2C I/O擴(kuò)展芯片可以方便地連接各種類(lèi)型的傳感器(如溫度、濕度、加速度計(jì)等),實(shí)現(xiàn)數(shù)據(jù)的采集和傳輸。
工業(yè)自動(dòng)化:在工業(yè)自動(dòng)化領(lǐng)域,PLC等控制系統(tǒng)需要與大量外設(shè)進(jìn)行通信。I2C I/O擴(kuò)展芯片能夠滿(mǎn)足這一需求,提高工業(yè)自動(dòng)化系統(tǒng)的集成度和可靠性。
智能家居:智能家居系統(tǒng)需要連接和控制各種智能家電和設(shè)備。I2C I/O擴(kuò)展芯片可以擴(kuò)展智能家居系統(tǒng)的控制能力,實(shí)現(xiàn)更多樣化的功能。
工業(yè)自動(dòng)化和控制:在工業(yè)自動(dòng)化系統(tǒng)中,經(jīng)常需要連接和控制大量的傳感器、執(zhí)行器和其他設(shè)備。IIC IO擴(kuò)展芯片可以提供更多的IO端口,以便與這些設(shè)備進(jìn)行通信和控制。例如,它們可以用于讀取傳感器的數(shù)據(jù)、控制執(zhí)行器的動(dòng)作或與其他工業(yè)設(shè)備進(jìn)行交互。
消費(fèi)電子產(chǎn)品:在消費(fèi)電子產(chǎn)品中,如智能家居設(shè)備、智能音箱、智能手環(huán)等,IIC IO擴(kuò)展芯片也發(fā)揮著重要作用。它們可以用于擴(kuò)展設(shè)備的IO接口,以便連接更多的外部設(shè)備或傳感器。例如,智能音箱可以通過(guò)IIC IO擴(kuò)展芯片連接更多的麥克風(fēng)或揚(yáng)聲器,提高音頻處理的性能和質(zhì)量。
嵌入式系統(tǒng):在嵌入式系統(tǒng)中,由于資源限制和成本考慮,微控制器的IO端口數(shù)量往往有限。IIC IO擴(kuò)展芯片可以有效地解決這個(gè)問(wèn)題,為嵌入式系統(tǒng)提供額外的IO端口。這些端口可以用于連接外部設(shè)備、擴(kuò)展系統(tǒng)功能或?qū)崿F(xiàn)與其他系統(tǒng)的通信。
測(cè)試與測(cè)量設(shè)備:在測(cè)試和測(cè)量領(lǐng)域,IIC IO擴(kuò)展芯片可以用于連接各種測(cè)試設(shè)備和傳感器。通過(guò)擴(kuò)展IO端口,測(cè)試設(shè)備可以獲取更多的數(shù)據(jù)輸入,提高測(cè)試的準(zhǔn)確性和效率。同時(shí),IIC IO擴(kuò)展芯片還可以用于控制測(cè)試過(guò)程中的各種設(shè)備和參數(shù)。
醫(yī)療設(shè)備:在醫(yī)療設(shè)備中,IIC IO擴(kuò)展芯片可以用于連接各種醫(yī)療傳感器和執(zhí)行器。例如,在監(jiān)護(hù)儀中,IIC IO擴(kuò)展芯片可以連接多個(gè)生命體征傳感器,實(shí)時(shí)監(jiān)測(cè)患者的血壓、心率等生理參數(shù)。在醫(yī)療機(jī)器人中,IIC IO擴(kuò)展芯片可以控制機(jī)器人的運(yùn)動(dòng)和操作。
綜上所述,IIC(I2C)I/O擴(kuò)展芯片在物聯(lián)網(wǎng)系統(tǒng)中扮演著重要角色,它們通過(guò)提供額外的I/O端口、簡(jiǎn)化布線和連接、提高系統(tǒng)性能、降低成本和功耗以及支持廣泛應(yīng)用場(chǎng)景等方式,為物聯(lián)網(wǎng)系統(tǒng)的設(shè)計(jì)和實(shí)現(xiàn)帶來(lái)了諸多便利和優(yōu)勢(shì)。
02
IIC I/O擴(kuò)展芯片的行業(yè)知識(shí)介紹
IIC I/O擴(kuò)展芯片定義
IIc接口IO擴(kuò)展芯片是一種可以為電子設(shè)備添加輸入輸出功能的集成電路,它可以有效提高設(shè)備的性能。
IIC 原理
I2C通信協(xié)議:I2C是一種串行通信協(xié)議,用于連接微控制器及其外圍設(shè)備。它只需要兩根線(SDA數(shù)據(jù)線和SCL時(shí)鐘線)即可實(shí)現(xiàn)全雙工通信,同時(shí)還可以連接多個(gè)設(shè)備到同一總線上。
設(shè)備尋址:每個(gè)I2C設(shè)備都有一個(gè)唯一的地址,主控制器通過(guò)發(fā)送設(shè)備的地址來(lái)選中并與之通信。I2C擴(kuò)展IO芯片也具備一個(gè)或多個(gè)可設(shè)置的地址,以便主控制器能夠識(shí)別并與之通信。
數(shù)據(jù)傳輸:在選中特定的I2C設(shè)備后,主控制器可以通過(guò)I2C總線發(fā)送數(shù)據(jù)到該設(shè)備,或者從該設(shè)備讀取數(shù)據(jù)。對(duì)于I2C擴(kuò)展IO芯片,主控制器可以發(fā)送命令來(lái)設(shè)置或讀取IO端口的電平狀態(tài),從而實(shí)現(xiàn)對(duì)外圍設(shè)備的控制或監(jiān)測(cè)。
中斷機(jī)制:許多I2C擴(kuò)展IO芯片還具備中斷功能。當(dāng)IO端口的電平狀態(tài)發(fā)生變化時(shí),芯片可以產(chǎn)生一個(gè)中斷信號(hào),通知主控制器進(jìn)行相應(yīng)的處理。這樣,主控制器可以更加高效地響應(yīng)外部事件,而無(wú)需持續(xù)輪詢(xún)IO端口的狀態(tài)。
內(nèi)部寄存器:I2C擴(kuò)展IO芯片內(nèi)部通常包含多個(gè)寄存器,用于存儲(chǔ)IO端口的配置信息、數(shù)據(jù)等。主控制器可以通過(guò)I2C總線訪問(wèn)這些寄存器,以實(shí)現(xiàn)對(duì)IO端口的控制和管理。
IIC I/O擴(kuò)展芯片的參數(shù)選型
電源電壓:確保你的系統(tǒng)電源電壓與IO擴(kuò)展芯片的電源電壓兼容。常見(jiàn)的電源電壓范圍包括1.8V、3.3V、5V等。
IO口數(shù)量:根據(jù)你的應(yīng)用需求確定所需的IO口數(shù)量。有些IO擴(kuò)展芯片提供8個(gè)、16個(gè)或更多的IO口。
IO口類(lèi)型:考慮你需要的IO口類(lèi)型,如準(zhǔn)雙向口、開(kāi)漏輸出等。準(zhǔn)雙向口既可以作為輸入也可以作為輸出,而開(kāi)漏輸出則可以用于驅(qū)動(dòng)LED等外部設(shè)備。
通信接口:確保IO擴(kuò)展芯片支持你的主控制器所使用的通信接口,如I2C、SPI等。I2C接口通常使用兩根線(SDA和SCL)進(jìn)行通信,具有簡(jiǎn)單易用、支持多設(shè)備連接等優(yōu)點(diǎn)。
中斷功能:如果你的應(yīng)用需要實(shí)時(shí)監(jiān)測(cè)外部設(shè)備狀態(tài)的變化,那么選擇具有中斷功能的IO擴(kuò)展芯片將非常有用。當(dāng)中斷引腳被觸發(fā)時(shí),主控制器可以立即響應(yīng)并處理相應(yīng)的事件。
封裝和尺寸:根據(jù)你的應(yīng)用需求和電路板空間限制選擇合適的封裝和尺寸。常見(jiàn)的封裝類(lèi)型包括TSSOP、QFN、SSOP等,尺寸范圍也有所不同。
工作溫度和功耗:考慮你的應(yīng)用所在的環(huán)境溫度和功耗要求。選擇具有適當(dāng)工作溫度和低功耗的IO擴(kuò)展芯片將有助于提高系統(tǒng)的穩(wěn)定性和可靠性。
其他特性:根據(jù)你的應(yīng)用需求,還可以考慮其他特性,如驅(qū)動(dòng)能力(最大輸出電流)、輸入/輸出電平范圍、可編程性(是否支持通過(guò)編程來(lái)配置IO口)等。
IIC I/O擴(kuò)展芯片的廠商
NXP Semiconductors(恩智浦半導(dǎo)體):NXP是全球領(lǐng)先的半導(dǎo)體公司之一,提供廣泛的IIC IO擴(kuò)展芯片產(chǎn)品。其產(chǎn)品線包括PCF8574、PCA9555等,這些芯片具有高性能、低功耗和易用性等特點(diǎn),廣泛應(yīng)用于各種領(lǐng)域。
Microchip Technology(微芯科技):Microchip是一家專(zhuān)注于嵌入式控制和混合信號(hào)半導(dǎo)體解決方案的供應(yīng)商。其IIC IO擴(kuò)展芯片產(chǎn)品包括MCP23017、MCP23S17等,這些芯片具有高集成度、高可靠性和低功耗等特點(diǎn),適用于工業(yè)自動(dòng)化、消費(fèi)電子和汽車(chē)電子等領(lǐng)域。
Texas Instruments(德州儀器):德州儀器是一家全球性的半導(dǎo)體設(shè)計(jì)和制造公司,其IIC IO擴(kuò)展芯片產(chǎn)品包括TPS2113、TPS2296等。這些芯片具有高性能、高精度和低功耗等特點(diǎn),廣泛應(yīng)用于電源管理、電機(jī)控制和工業(yè)自動(dòng)化等領(lǐng)域。
STMicroelectronics(意法半導(dǎo)體):意法半導(dǎo)體是一家全球領(lǐng)先的半導(dǎo)體公司,提供廣泛的IIC IO擴(kuò)展芯片產(chǎn)品。其產(chǎn)品線包括VLSI Solution的82C55A等,這些芯片具有高速、高可靠性和低功耗等特點(diǎn),適用于各種嵌入式系統(tǒng)和工業(yè)自動(dòng)化應(yīng)用。
此外,還有其他一些廠商也提供IIC IO擴(kuò)展芯片產(chǎn)品,如Maxim Integrated、Renesas Electronics等。在選擇IIC IO擴(kuò)展芯片時(shí),需要根據(jù)具體的應(yīng)用需求和性能要求來(lái)選擇合適的廠商和產(chǎn)品。國(guó)內(nèi)也有一些知名的IIC(實(shí)際上是I2C,即Inter-Integrated Circuit)IO擴(kuò)展芯片廠商,以下是一些例子:
中微愛(ài)芯:作為中國(guó)領(lǐng)先的半導(dǎo)體公司之一,中微愛(ài)芯專(zhuān)注于消費(fèi)電子芯片和小家電芯片的研發(fā)。他們的產(chǎn)品可能包括IIC IO擴(kuò)展芯片,但具體型號(hào)和規(guī)格可能需要查詢(xún)其官方渠道。
紫光展銳:紫光展銳是中國(guó)集成電路設(shè)計(jì)和解決方案供應(yīng)商,他們?cè)谝苿?dòng)通信、數(shù)字多媒體等領(lǐng)域積累了豐富的經(jīng)驗(yàn)。雖然他們主要以手機(jī)芯片聞名,但他們的產(chǎn)品線可能也涵蓋IIC IO擴(kuò)展芯片。
華大半導(dǎo)體:華大半導(dǎo)體是中國(guó)電子信息產(chǎn)業(yè)集團(tuán)有限公司(CEC)旗下的核心企業(yè),是中國(guó)“909”工程集成電路項(xiàng)目的重點(diǎn)承擔(dān)單位。他們提供多種類(lèi)型的半導(dǎo)體產(chǎn)品,包括可能包含IIC IO擴(kuò)展芯片的產(chǎn)品。
03
IIC I/O擴(kuò)展芯片的硬件設(shè)計(jì)方案
本文主要采用了信路達(dá)的XL9535做為驅(qū)動(dòng)芯片。
1、XL9535概述
XL9535是一款24引腳CMOS器件,通過(guò)I2C總線/SMBus接口 串行時(shí)鐘線(SCL)、串行數(shù)據(jù)(SDA)為大多數(shù)微控制器系列提供16位通用并行輸入/輸出(GPIO)擴(kuò)展。這些設(shè)備設(shè)計(jì)用于2.3-V至5.5-V Vcc操作。這些改進(jìn)包括更高的驅(qū)動(dòng)能力、5V I/O容差、更低的電源電流、單獨(dú)的I/O配置和更小的封裝。 通電時(shí),I/O被配置為輸入。系統(tǒng)主機(jī)可以通過(guò)寫(xiě)入I/O配置位來(lái)啟用I/O作為輸入或輸出。每個(gè)輸入或輸出的數(shù)據(jù)都保存在相應(yīng)的輸入或輸出寄存器中。輸入端口寄存器的極性可以用極性反轉(zhuǎn)寄存器反轉(zhuǎn)。所有寄存器均可由系統(tǒng)主控器讀取。 當(dāng)任何輸入狀態(tài)與其對(duì)應(yīng)的輸入端口寄存器狀態(tài)不同時(shí),這些設(shè)備開(kāi)漏中斷(/INT)輸出被激活,并用于向系統(tǒng)主機(jī)指示輸入狀態(tài)已改變。在超時(shí)或其他不當(dāng)操作的情況下,系統(tǒng)主設(shè)備可以利用上電重置功能重置這些設(shè)備。通電重置將寄存器設(shè)置為默認(rèn)值,并初始化I2C/SMBus狀態(tài)機(jī)。三個(gè)硬件引腳(A0、A1和A2)改變固定的I2C總線地址,并允許多達(dá)八個(gè)設(shè)備共享同一I2C總線/SMBus。
2、 XL9535特性
I2C總線至16位GPIO擴(kuò)展器
工作電源電壓范圍為2.3 V至5.5 V
低待機(jī)電流消耗
5 V容錯(cuò)I/O端口
400 kHz快速模式I2C總線時(shí)鐘頻率
SCL/SDA輸入上的噪聲濾波器
內(nèi)部通電復(fù)位
通電時(shí)無(wú)故障
極性反轉(zhuǎn)寄存器
開(kāi)漏有源低中斷輸出
16個(gè)I/O引腳,默認(rèn)為16個(gè)輸入
3、XL9535引腳配置和功能
4、XL9535功能框圖和參考設(shè)計(jì)
04
IIC I/O擴(kuò)展芯片的軟件設(shè)計(jì)方案
本文采用了奇跡物聯(lián)的紅豆版開(kāi)源技術(shù)平臺(tái)為主控單元,一步步手把手教會(huì)讀者如何使用紅豆版開(kāi)源平臺(tái)編寫(xiě)XL9535驅(qū)動(dòng)。這里對(duì)代碼就不多詳解,如果需要詳細(xì)了解,請(qǐng)到奇跡物聯(lián)的紅豆版開(kāi)源平臺(tái)了解詳細(xì)代碼講解。
1 Gitee鏈接地址
Demo位于amaziot_bloom_os_sdksample3rd1.0_XL9535
Gitee源碼地址:https://gitee.com/ning./hongdou
Github源碼地址:https://github.com/ayumid/hongdou
編譯指令:.build.bat -l .amaziot_bloom_os_sdksample3rd1.0_XL9535
2 組件功能介紹
驅(qū)動(dòng)XL9535芯片,實(shí)現(xiàn)輸入IO檢測(cè)。
3 代碼講解
1 drv_xl9535_i2c_init
功能:該函數(shù)用于,將發(fā)送數(shù)據(jù)長(zhǎng)度寫(xiě)入xl9535寄存器。
參數(shù):五
返回值:無(wú)
示例:
//初始化i2c總線 ret = drv_xl9535_i2c_init();
2 drv_xl9535_i2c_read
功能:該函數(shù)用于,讀取I2C從機(jī)。
參數(shù):五
返回值:無(wú)
示例:
RegAddr = 0x00; ret = drv_xl9535_i2c_read(&RegAddr, &RegReadValue0); sample_xl9535_catstudio_printf("read reg 00 i2c value=0x%x, ret=%dn", RegReadValue0, ret);
3 drv_xl9535_i2c_write
功能:該函數(shù)用于,發(fā)送數(shù)據(jù)到I2C從機(jī)。
參數(shù):五
返回值:無(wú)
示例:
RegAddr = 0x06; RegWriteValue = 0xFF; ret = drv_xl9535_i2c_write(&RegAddr, &RegReadValue0); sample_xl9535_catstudio_printf("write i2c value=0x%x, ret=%dn", RegWriteValue, ret);
4 Demo實(shí)戰(zhàn)
4.1 概述
上電后,按下按鍵,串口會(huì)打印出按下了哪一個(gè)按鍵
4.2 測(cè)試
測(cè)試步驟:
參考編譯教程,和文檔開(kāi)頭的編譯指令,進(jìn)行編譯
按照編譯教程選擇對(duì)應(yīng)的選項(xiàng)
燒錄
4.3 宏定義介紹
sample_xl9535_uart_printf
輸出日志到DEBUG 串口,日志比較少,可以輸出到這個(gè)串口,如果日志比較多,需要輸出到usb口,以免不必要的問(wèn)題出現(xiàn)
sample_xl9535_catstudio_printf
輸出日志到USB 串口,使用catstudio查看,catstudio查看日志需要更新對(duì)應(yīng)版本mdb.txt文件,軟件打開(kāi)filtter過(guò)濾日志,只查看用戶(hù)輸出的日志
SAMPLE_XL9535_STACK_SIZE
棧空間宏定義
4.4 全局變量介紹
sample_xl9535_int_detect_stack_ptr
任務(wù)棧空間,本例使用數(shù)組實(shí)現(xiàn),用戶(hù)在做項(xiàng)目時(shí),可以預(yù)先估算下當(dāng)先任務(wù)需要的大致棧空間,OS沒(méi)有提供可以查看棧空間使用情況的API
sample_xl9535_int_detect_task_ref
任務(wù)指針
4.5 函數(shù)介紹
Phase1Inits_enter
底層初始化,本例空
Phase1Inits_exit
底層初始化,本例空
Phase2Inits_enter
底層初始化,本例空
Phase2Inits_exit
創(chuàng)建主任務(wù),初始化INT 引腳
代碼片段:
int ret = 0; GPIOConfiguration config = {0}; //創(chuàng)建定時(shí)器 OSATimerCreate(&sample_xl9535_int_detect_timer_ref); //創(chuàng)建中斷事件 OSAFlagCreate( &sample_xl9535_int_detect_flg_ref); Os_Create_HISR(&sample_xl9535_int_detect_hisr, "sample_xl9535_int_detect_hisr", sample_xl9535_detect_handler, 2); //創(chuàng)建中斷處理任務(wù) OSATaskCreate(&sample_xl9535_int_detect_task_ref, sample_xl9535_int_detect_stack_ptr, SAMPLE_XL9535_STACK_SIZE, 100, "detect_task", sample_xl9535_detect_task, NULL); //初始化int引腳,這里使用70腳 gpio126 config.pinDir = GPIO_IN_PIN; config.pinEd = GPIO_RISE_EDGE; config.pinPull = GPIO_PULLUP_ENABLE; config.isr = sample_xl9535_irq_handler; GpioInitConfiguration(SAMPLE_GPIO_ISR_PIN_NUM, config);
sample_xl9535_detect_task
主任務(wù),代碼發(fā)分為兩部分,一部分是發(fā)送不定長(zhǎng)數(shù)據(jù);另一部分是上電后等待其它模塊發(fā)送的數(shù)據(jù),收到后打印到串口。
代碼片段:
void sample_xl9535_detect_task(void *param) { GPIO_ReturnCode ret = 0; UINT32 value = 0; OSA_STATUS status = OS_SUCCESS; UINT32 flag_value = 0; unsigned char RegAddr = 0; unsigned char RegWriteValue = 0; unsigned char RegReadValue0 = 0; unsigned char RegReadValue1 = 0; UINT8 down_en = 0; UINT8 up_en = 0; UINT8 sig_en = 0; UINT8 mul_en = 0; UINT8 read_en = 0; UINT8 de_en = 0; UINT8 ck_en = 0; UINT8 sim_en = 0; UINT8 gnss_en = 0; UINT8 nb_en = 0; UINT8 fourg_en = 0; //初始化i2c總線 ret = drv_xl9535_i2c_init(); sample_xl9535_catstudio_printf("ql_i2c_init ret %d", ret); //上電后,讀xl9535 io擴(kuò)展芯片的8個(gè)寄存器,測(cè)試用 RegAddr = 0x00; ret = drv_xl9535_i2c_read(&RegAddr, &RegReadValue0); sample_xl9535_catstudio_printf("read reg 00 i2c value=0x%x, ret=%dn", RegReadValue0, ret); RegAddr = 0x01; ret = drv_xl9535_i2c_read(&RegAddr, &RegReadValue0); sample_xl9535_catstudio_printf("read reg 01 i2c value=0x%x, ret=%dn", RegReadValue0, ret); RegAddr = 0x02; ret = drv_xl9535_i2c_read(&RegAddr, &RegReadValue0); sample_xl9535_catstudio_printf("read reg 02 i2c value=0x%x, ret=%dn", RegReadValue0, ret); RegAddr = 0x03; ret = drv_xl9535_i2c_read(&RegAddr, &RegReadValue0); sample_xl9535_catstudio_printf("read reg 03 i2c value=0x%x, ret=%dn", RegReadValue0, ret); RegAddr = 0x04; ret = drv_xl9535_i2c_read(&RegAddr, &RegReadValue0); sample_xl9535_catstudio_printf("read reg 04 i2c value=0x%x, ret=%dn", RegReadValue0, ret); RegAddr = 0x05; ret = drv_xl9535_i2c_read(&RegAddr, &RegReadValue0); sample_xl9535_catstudio_printf("read reg 05 i2c value=0x%x, ret=%dn", RegReadValue0, ret); RegAddr = 0x06; ret = drv_xl9535_i2c_read(&RegAddr, &RegReadValue0); sample_xl9535_catstudio_printf("read reg 06 i2c value=0x%x, ret=%dn", RegReadValue0, ret); RegAddr = 0x07; ret = drv_xl9535_i2c_read(&RegAddr, &RegReadValue0); sample_xl9535_catstudio_printf("read reg 07 i2c value=0x%x, ret=%dn", RegReadValue0, ret); //等1s OSATaskSleep(1 * 200); //初始化xl0535 io擴(kuò)展芯片的06 07寄存器,設(shè)置所有的io都是輸入 RegAddr = 0x06; RegWriteValue = 0xFF; ret = drv_xl9535_i2c_write(&RegAddr, &RegReadValue0); sample_xl9535_catstudio_printf("write i2c value=0x%x, ret=%dn", RegWriteValue, ret); RegAddr = 0x07; RegWriteValue = 0xFF; ret = drv_xl9535_i2c_write(&RegAddr, &RegReadValue0); sample_xl9535_catstudio_printf("write i2c value=0x%x, ret=%dn", RegWriteValue, ret); while(1) { // sample_xl9535_catstudio_printf("sample_xl9535_detect_taskrn"); status = OSAFlagWait(sample_xl9535_int_detect_flg_ref, 0x01, OSA_FLAG_OR_CLEAR, &flag_value, OSA_SUSPEND); //紅豆版,設(shè)置了邊沿,但是還是會(huì)上升沿,下降沿都觸發(fā),所以會(huì)執(zhí)行兩次 if(flag_value & 0x01) { RegAddr = 0x00; //ret = ql_i2c_read(i2c_no, SAMPLE_I2C_SLAVE_ADDR, RegAddr, &RegReadValue0, 1); ret = drv_xl9535_i2c_read(&RegAddr, &RegReadValue0); // sample_xl9535_catstudio_printf("read reg 00 i2c value=0x%x, ret=%dn", RegReadValue0, ret); RegAddr = 0x01; //ret = ql_i2c_read(i2c_no, SAMPLE_I2C_SLAVE_ADDR, RegAddr, &RegReadValue0, 1); ret = drv_xl9535_i2c_read(&RegAddr, &RegReadValue1); // sample_xl9535_catstudio_printf("read reg 01 i2c value=0x%x, ret=%dn", RegReadValue1, ret); //寄存器值非默認(rèn)值,表示有io輸入,否則表示是上升沿中斷 if(RegReadValue0 != 0xff || RegReadValue1 != 0x07) { event_ticks = OSAGetTicks(); int_status = 0; //判斷是那個(gè)IO這里使用寄存器值判斷,后續(xù)可以改為根據(jù)位判斷 if(RegReadValue1 == DRV_XL9535_BUTTON_DOWN_EN) { // sample_xl9535_catstudio_printf("down int"); down_en = 1; } else if(RegReadValue1 == DRV_XL9535_BUTTON_UP_EN) { // sample_xl9535_catstudio_printf("up int"); up_en = 1; } else if(RegReadValue1 == DRV_XL9535_BUTTON_SIG_EN) { // sample_xl9535_catstudio_printf("sig int"); sig_en = 1; } else if(RegReadValue0 == DRV_XL9535_BUTTON_MUL_EN) { // sample_xl9535_catstudio_printf("mul int"); mul_en = 1; } else if(RegReadValue0 == DRV_XL9535_BUTTON_READ_EN) { // sample_xl9535_catstudio_printf("read int"); read_en = 1; } else if(RegReadValue0 == DRV_XL9535_BUTTON_DE_EN) { // sample_xl9535_catstudio_printf("de int"); de_en = 1; } else if(RegReadValue0 == DRV_XL9535_BUTTON_CK_EN) { // sample_xl9535_catstudio_printf("ck int"); ck_en = 1; } else if(RegReadValue0 == DRV_XL9535_BUTTON_SIM_EN) { // sample_xl9535_catstudio_printf("sim int"); sim_en = 1; } else if(RegReadValue0 == DRV_XL9535_BUTTON_GNSS_EN) { // sample_xl9535_catstudio_printf("gnss int"); gnss_en = 1; } else if(RegReadValue0 == DRV_XL9535_BUTTON_NB_EN) { // sample_xl9535_catstudio_printf("nb int"); nb_en = 1; } else if(RegReadValue0 == DRV_XL9535_BUTTON_4G_EN) { // sample_xl9535_catstudio_printf("4g int"); fourg_en = 1; } } else { if(int_status == 0) { UINT32 keep_ticks = OSAGetTicks() - event_ticks; if(keep_ticks > 20) { //檢測(cè)到某個(gè)IO被按下后,可以在這里,或者發(fā)送信號(hào),消息等去其它任務(wù)執(zhí)行相應(yīng)操作 // sample_xl9535_catstudio_printf("keep_ticks:%d, event_ticks:%d", keep_ticks, event_ticks); if(down_en == 1) { sample_xl9535_catstudio_printf("down en"); } else if(up_en == 1) { sample_xl9535_catstudio_printf("up en"); } else if(sig_en == 1) { sample_xl9535_catstudio_printf("sig en"); } else if(mul_en == 1) { sample_xl9535_catstudio_printf("mul en"); } else if(read_en == 1) { sample_xl9535_catstudio_printf("read en"); } else if(de_en == 1) { sample_xl9535_catstudio_printf("de en"); } else if(ck_en == 1) { sample_xl9535_catstudio_printf("ck en"); } else if(sim_en == 1) { sample_xl9535_catstudio_printf("sim en"); } else if(gnss_en == 1) { sample_xl9535_catstudio_printf("gnss en"); } else if(nb_en == 1) { sample_xl9535_catstudio_printf("nb en"); } else if(fourg_en == 1) { sample_xl9535_catstudio_printf("4g en"); } } down_en = 0; up_en = 0; sig_en = 0; mul_en = 0; read_en = 0; de_en = 0; ck_en = 0; sim_en = 0; gnss_en = 0; nb_en = 0; fourg_en = 0; } int_status = 1; } } } }
4.6 固件
上電后,按下按鍵,串口會(huì)打印出按下了哪一個(gè)按鍵
本文章源自奇跡物聯(lián)開(kāi)源的物聯(lián)網(wǎng)應(yīng)用知識(shí)庫(kù)Cellular IoT Wiki,更多技術(shù)干貨歡迎關(guān)注收藏Wiki:Cellular IoT Wiki 知識(shí)庫(kù)(https://rckrv97mzx.feishu.cn/wiki/wikcnBvAC9WOkEYG5CLqGwm6PHf)
歡迎同學(xué)們走進(jìn)AmazIOT知識(shí)庫(kù)的世界!
這里是為物聯(lián)網(wǎng)人構(gòu)建的技術(shù)應(yīng)用百科,以便幫助你更快更簡(jiǎn)單的開(kāi)發(fā)物聯(lián)網(wǎng)產(chǎn)品。
Cellular IoT Wiki初心:
在我們長(zhǎng)期投身于蜂窩物聯(lián)網(wǎng) ODM/OEM 解決方案的實(shí)踐過(guò)程中,一直被物聯(lián)網(wǎng)技術(shù)碎片化與產(chǎn)業(yè)資源碎片化的問(wèn)題所困擾。從產(chǎn)品定義、芯片選型,到軟硬件研發(fā)和測(cè)試,物聯(lián)網(wǎng)技術(shù)的碎片化以及產(chǎn)業(yè)資源的碎片化,始終對(duì)團(tuán)隊(duì)的產(chǎn)品開(kāi)發(fā)交付質(zhì)量和效率形成制約。為了減少因物聯(lián)網(wǎng)碎片化而帶來(lái)的重復(fù)開(kāi)發(fā)工作,我們著手對(duì)物聯(lián)網(wǎng)開(kāi)發(fā)中高頻應(yīng)用的技術(shù)知識(shí)進(jìn)行沉淀管理,并基于 Bloom OS 搭建了不同平臺(tái)的 RTOS 應(yīng)用生態(tài)。后來(lái)我們發(fā)現(xiàn),很多物聯(lián)網(wǎng)產(chǎn)品開(kāi)發(fā)團(tuán)隊(duì)都面臨著相似的困擾,于是,我們決定向全體物聯(lián)網(wǎng)行業(yè)開(kāi)發(fā)者開(kāi)放奇跡物聯(lián)內(nèi)部沉淀的應(yīng)用技術(shù)知識(shí)庫(kù) Wiki,期望能為更多物聯(lián)網(wǎng)產(chǎn)品開(kāi)發(fā)者減輕一些重復(fù)造輪子的負(fù)擔(dān)。
Cellular IoT Wiki沉淀的技術(shù)內(nèi)容方向如下:
奇跡物聯(lián)的業(yè)務(wù)服務(wù)范圍:基于自研的NB-IoT、Cat1、Cat4等物聯(lián)網(wǎng)模組,為客戶(hù)物聯(lián)網(wǎng)ODM/OEM解決方案服務(wù)。我們的研發(fā)技術(shù)中心在石家莊,PCBA生產(chǎn)基地分布在深圳、石家莊、北京三個(gè)工廠,滿(mǎn)足不同區(qū)域&不同量產(chǎn)規(guī)模&不同產(chǎn)品開(kāi)發(fā)階段的生產(chǎn)制造任務(wù)。跟傳統(tǒng)PCBA工廠最大的區(qū)別是我們只服務(wù)物聯(lián)網(wǎng)行業(yè)客戶(hù)。
連接我們,和10000+物聯(lián)網(wǎng)開(kāi)發(fā)者一起 降低技術(shù)和成本門(mén)檻
讓蜂窩物聯(lián)網(wǎng)應(yīng)用更簡(jiǎn)單~~
哈哈你終于滑到最重要的模塊了,
千萬(wàn)不!要!劃!走!忍住沖動(dòng)!~
歡迎加入飛書(shū)“開(kāi)源技術(shù)交流群”,隨時(shí)找到我們哦~
點(diǎn)擊鏈接如何加入奇跡物聯(lián)技術(shù)話題群(https://rckrv97mzx.feishu.cn/docx/Xskpd1cFQo7hu9x5EuicbsjTnTf)可以獲取加入技術(shù)話題群攻略
Hey 物聯(lián)網(wǎng)從業(yè)者,
你是否有了解過(guò)奇跡物聯(lián)的官方公眾號(hào)“eSIM物聯(lián)工場(chǎng)”呢?
這里是奇跡物聯(lián)的物聯(lián)網(wǎng)應(yīng)用技術(shù)開(kāi)源wiki主陣地,歡迎關(guān)注公眾號(hào),不迷路~
及時(shí)獲得最新物聯(lián)網(wǎng)應(yīng)用技術(shù)沉淀發(fā)布
注:本文部分內(nèi)容來(lái)源于網(wǎng)絡(luò),如有侵權(quán),請(qǐng)及時(shí)聯(lián)系我們。
審核編輯 黃宇
-
物聯(lián)網(wǎng)
+關(guān)注
關(guān)注
2904文章
44304瀏覽量
371447 -
IIC
+關(guān)注
關(guān)注
11文章
300瀏覽量
38277 -
開(kāi)源
+關(guān)注
關(guān)注
3文章
3256瀏覽量
42419
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論