首先跟一樣新入手單片機開發的小夥伴分享一點I2C通訊的知識。我估計大部分入手開發板的小夥伴都有必定程序開發的能力,可是底層開發多是新接觸,我看有的小夥伴配置開發環境都有障礙,其實並非多複雜,只是首次接觸很陌生罷了,大膽試,多搞幾次就輕鬆應對了。ide
通訊開發是單片機主要開發內容,通訊方式和協議有不少種,針對應用場景和模塊的狀況選用合適的協議。各類協議大同小異,開始瞭解通透一種,理解其思想,其餘協議也就很容易理解了。函數
若是是第一次看到這種圖是否是有點懵。post
大概過程就是:學習
1. 發送一段模塊地址信息 + 讀/寫。spa
等待…翻譯
模塊若是收到,會給你個回覆 ACK指針
2. 你看到ACK響應,進行下一步orm
再發送一段,讀/寫寄存器地址信息。blog
模塊收到,再給你回覆ACK接口
3. 若是是寫,就再發送寫的內容信息。
若是是讀,就接收模塊發送來的返回信息。
換個現實場景理解一下,假設你喊你室友幫你取快遞:
你:三胖子!(發送模塊地址)
三胖子:幹啥。(接聽ACK)
你:給我取份快遞。(發送寄存器地址)
三胖子:好的。(接聽ACK)
你:接收室友給你送來的快遞。(接收信息)
整個通訊過程就是一問一答,雙方不能同時問答,一方說話一方只能接聽。固然具體過程還要複雜一些,好比接收信息也要給模塊回覆應答,可是主體過程就是這樣的。這個過程大概瞭解一下就行,全部通訊的細節部分都已經被鴻蒙下的函數封裝好了,具體過程交由鴻蒙作就好,你只須要考慮要說什麼作什麼就好了。這個過程真的好簡單。
看一下鴻蒙真對WifiIoT智能設備提供的I2C相關函數:
將數據寫入I2C設備。
unsigned int I2cWrite(WifiIotI2cIdx id, unsigned short deviceAddr, const WifiIotI2cData *i2cData);
在i2c.h文件裏有詳細的說明,這裏複製過來一一對照看一下每一個參數的意義。
將數據寫入I2C設備。
id表示I2C設備id。
deviceAddr表示I2C設備地址。
i2cData表示指向要寫入的數據描述符的指針。
若是操做成功,返回WIFI_IOT_ SUCCESS;
不然返回在wifiiot_errno.h中定義的錯誤代碼。
(百度翻譯仍是很準確的哦!哈)
從I2C設備讀取數據。
unsigned int I2cRead(WifiIotI2cIdx id, unsigned short deviceAddr, const WifiIotI2cData *i2cData);
讀取的數據將保存到i2cData指定的地址。
id表示I2C設備id。
deviceAddr表示I2C設備地址。
i2cData表示指向要讀取的數據描述符的指針。
若是操做成功,返回WIFI_IOT_ SUCCESS;
不然返回在wifiiot_errno.h中定義的錯誤代碼。
鴻蒙把I2C所使用的數據封裝在一個結構體中。咱們只須要把數據寫入到這個結構體中,而後讓函數本身處理就能夠了。
typedef struct { /** Pointer to the buffer storing data to send */ unsigned char *sendBuf; /** Length of data to send */ unsigned int sendLen; /** Pointer to the buffer for storing data to receive */ unsigned char *receiveBuf; /** Length of data received */ unsigned int receiveLen; } WifiIotI2cData;
定義I2C數據傳輸屬性。
指向存儲要發送的數據的緩衝區的指針
unsigned char *sendBuf;
要發送的數據長度
unsigned int sendLen;
指向用於存儲要接收的數據的緩衝區的指針
unsigned char *receiveBuf;
接收數據的長度
unsigned int receiveLen;
具體用的時候,咱們能夠根據實際狀況再封裝一下。這是主要根據使用場景和模塊所提供的功能。我針對我要使用PCF8563模塊把I2C過程作了一點包裝。能夠看看我寫的代碼,也許能給你一點啓發。參看個人代碼。
在此次開發過程當中還用到了GPIO管腳中斷
不少老師都專門寫了按鍵的中斷觸發,我也是仔細研讀而後作了我這個程序的觸發控制,老師的文章寫的太詳細了,實在沒什麼好再說明的,我在使用中也沒有遇到什麼問題,最多就是,要關閉看門狗功能,否者會重啓,再就是當暫中斷髮的時候用到這個方法。
GpioSetIsrMask(WIFI_IOT_IO_NAME_GPIO_8, 0); 正常
GpioSetIsrMask(WIFI_IOT_IO_NAME_GPIO_8, 1); 暫停
ADC模數轉換
用到OLED模塊上的按鍵的時候碰到了ADC功能,這裏先作個伏筆,主要是還沒把鴻蒙下的ADC方法研究明白,並且數模轉換應用場景很是多,之後用到專門的模塊再仔細寫寫心得吧。暫時看老師們的代碼照貓畫虎也能運行,有時候會不穩定。
PCF8563是個比價經常使用的模塊。
PCF8563 是PHILIPS 公司推出的一款工業級內含I2C 總線接口功能的具備極低功耗的多功能時鐘/日曆芯片。PCF8563 的多種報警功能、定時器功能、時鐘輸出功能以及中斷輸出功能能完成各類複雜的定時服務,甚至可爲單片機提供看門狗功能。是一款性價比極高的時鐘芯片,它已被普遍用於電錶、水錶、氣表、電話、傳真機、便攜式儀器以及電池供電的儀器儀表等產品領域。
PCF8563並非咱們套件裏所帶的模塊,只是趕巧我手上恰好有這麼個模塊。官方套件提供的模塊有限,可是涵蓋了單片開發的全部應用場景,若是每一個模塊都認真走一遍,那麼基本解鎖了鴻蒙單片機開發的全部知識了。在實際應用中,咱們仍是要使用各類功能的電子模塊來實現更有趣的功能的。因此之後仍是要更多嘗試新模塊的使用,也能提升鴻蒙系統的應用範圍。
文章後續內容和相關附件能夠點擊下面的原文連接前往學習
原文連接:https://harmonyos.51cto.com/posts/2962#bkwz