99精品伊人亚洲|最近国产中文炮友|九草在线视频支援|AV网站大全最新|美女黄片免费观看|国产精品资源视频|精彩无码视频一区|91大神在线后入|伊人终合在线播放|久草综合久久中文

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

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

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

【有那么點(diǎn)詳細(xì)的CW32學(xué)習(xí)筆記】IIC接口-OLED驅(qū)動

CW32生態(tài)社區(qū) ? 來源:CW32生態(tài)社區(qū) ? 作者:CW32生態(tài)社區(qū) ? 2024-01-11 09:49 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

上一章我們講解了IIC的通信流程以及通信代碼,這一章就以市面上常見的IIC接口模塊——OLED屏為例教學(xué)一下IIC接口的驅(qū)動怎么寫。

第一步當(dāng)然是搞清楚自己使用的OLED屏幕用的是什么驅(qū)動,說是屏幕,實(shí)際上就是密集LED點(diǎn)陣,所以必定有用于控制大量LED燈的驅(qū)動器,本教學(xué)使用的OLED驅(qū)動是SSD1306,該驅(qū)動器有多種通信接口,這里使用IIC接口(具體使用什么接口,數(shù)據(jù)手冊上會有詳細(xì)介紹)

根據(jù)SSD1306數(shù)據(jù)手冊的描述,該設(shè)備的從機(jī)地址取決于SA0的電平,但是我翻遍了商家給我的資料也沒找到整個模塊的硬件原理圖(也有可能遺漏了),無奈只能打開例程查看從機(jī)地址是0x78。

圖片

數(shù)據(jù)手冊詳細(xì)描述了1306的IIC接口規(guī)則,7bit的地址位+1bit的讀寫位,數(shù)據(jù)線和時鐘線描述的就是標(biāo)準(zhǔn)的IIC協(xié)議,不必過多糾結(jié)。

下面的內(nèi)容是重點(diǎn),需要注意的是,編寫任何一個外設(shè)的驅(qū)動,基本上都逃不開指令和數(shù)據(jù),驅(qū)動方式可能多種多樣,但最多也就是指令與數(shù)據(jù)的排列組合,稍微復(fù)雜一些的會加上寄存器操作(也就是用單片機(jī)1號通過某種通信接口控制單片機(jī)二號),抓住本質(zhì)之后,思路就能打開。

先來看看數(shù)據(jù)手冊是怎么描述的:

圖片

對閱讀比較吃力的小伙伴,我撿重點(diǎn)說一說:

第2條描述的就是從機(jī)地址的設(shè)置,這在前面以及提到了;

第3條說的是IIC讀寫位的定義;

第4條說的是IIC協(xié)議中應(yīng)答信號的規(guī)則,這里說明了1306會對一切IIC數(shù)據(jù)(包括地址|讀寫字節(jié))作出回應(yīng);

第5條說的是一旦主機(jī)和1306建立通訊(發(fā)送地址|讀寫字節(jié)之后),后續(xù)發(fā)送到IIC總線上的數(shù)據(jù)就會被識別成“控制字節(jié)”或“數(shù)據(jù)字節(jié)”,具體什么是控制字節(jié)和數(shù)據(jù)字節(jié),后文會詳細(xì)說明;

第6條說的是每個控制字節(jié)和數(shù)據(jù)字節(jié)都會被回應(yīng);

第7條說的是IIC協(xié)議停止位的規(guī)則;

現(xiàn)在來說明一下什么是控制字節(jié)和數(shù)據(jù)字節(jié)。對于屏幕,我們的操作他的目的是在屏幕上面顯示內(nèi)容,“顯示”是一個動作、行為,也可以叫他命令,“內(nèi)容”就是一個數(shù)據(jù)。所以操控設(shè)備的時候,至少會包含一個指令和一個數(shù)據(jù),但是指令和數(shù)據(jù)在各種通信協(xié)議中,都只是一個8bit的數(shù),如何區(qū)分他們就成了一個很關(guān)鍵的點(diǎn)。

1306使用這么一種方式來區(qū)分他們:一旦通過IIC接口建立通訊,隨后接收的第0個字節(jié)(byte0)一定是用來說明下一個字節(jié)(byte1)的類型的,它用2個字節(jié)來表達(dá)一個完整的數(shù)據(jù)傳輸。數(shù)據(jù)手冊中貼出了1306使用IIC通信的幀結(jié)構(gòu)圖:

圖片

控制字節(jié)區(qū)分?jǐn)?shù)據(jù)字節(jié)類型的方式,就是通過其最高的2個bit位:Co和D/C#。先說DC位,D就是data,C就是command,這個bit位為0就代表緊跟著的下一個字節(jié)是命令,如果bit位是1,那下一個緊跟著的字節(jié)就是數(shù)據(jù)。實(shí)際上只要有這么一個bit位就已經(jīng)可以完成對1306的控制了,那么現(xiàn)在思考一個問題,如果我需要連續(xù)寫入大量的命令(比如100個),為了完成這100個命令的傳輸,我需要傳輸200個字節(jié),因為每個命令都需要綁定一個控制字節(jié)。為了提高傳輸效率,Co位應(yīng)運(yùn)而生,如果Co位是0,且DC位也是0,那么1306就會把該控制字節(jié)之后傳入的所有數(shù)據(jù)都認(rèn)定為命令,這樣一來如果要寫入100個命令,實(shí)際上只需要發(fā)送101個字節(jié)就能實(shí)現(xiàn)目的,效率幾乎是翻倍了。對于傳輸數(shù)據(jù),也是一樣的,只需要把Co位設(shè)置為0,DC位設(shè)置為1,后續(xù)傳入的字節(jié)就全是數(shù)據(jù)了。如果沒有這種連續(xù)寫入大量同類型數(shù)據(jù)(命令/數(shù)據(jù),括號里的數(shù)據(jù)是對屏幕顯示而言的,這個括號之前的數(shù)據(jù)是對IIC總線而言的)的需求,也可以把Co位置1以采用 “控制字節(jié)+數(shù)據(jù)字節(jié)(DC byte)”的方式實(shí)現(xiàn)功能。

下面就是代碼的編寫,我們使用聯(lián)合體直接列出需要發(fā)送的幀結(jié)構(gòu),需要發(fā)送時只需要賦值對應(yīng)的位再發(fā)送value這個數(shù)組就可以了,這么寫就不需要在發(fā)送的時候進(jìn)行位操作,大幅度提高代碼可讀性:

圖片

再貼一個發(fā)指令的函數(shù),這個函數(shù)使用的是單次寫入的方式,效率不高但是方便使用,需要注意的是這個函數(shù)不具備建立IIC通信的能力,他只負(fù)責(zé)在已建立通信的情況下發(fā)出一個完整的指令。

圖片

現(xiàn)在我們擁有了建立IIC通信和發(fā)送指令的函數(shù),實(shí)際上就已經(jīng)可以用這些函數(shù)看看效果了,1306有一個指令是A5H,他的作用是強(qiáng)制點(diǎn)亮屏幕上所有的像素點(diǎn),正確初始化OLED之后,再發(fā)送A5H即可。

圖片

關(guān)于OLED的初始化,模塊的資料提供了一套完整的初始化指令,簡單來說就是上電之后需要先把這一堆指令發(fā)給OLED驅(qū)動,之后屏幕才會正常工作,具體到每個指令的詳細(xì)功能,還請讀者查看1306數(shù)據(jù)手冊的指令表章節(jié),或者直接搜索1306指令的相關(guān)資料。

話題拉回屏幕顯示這一塊,我們的目標(biāo)肯定不只是把整個屏幕擦亮這么簡單,屏幕要么拿來畫畫,要么拿來寫字,他至少要能夠?qū)懽植判小,F(xiàn)在已經(jīng)知道的是,屏幕就是一個LED陣,那只要控制一批像素點(diǎn)按照固定的規(guī)則點(diǎn)亮就能顯示我們想要的內(nèi)容,實(shí)現(xiàn)這個目的的過程也叫取字模,售賣屏幕的商家打包的資料都會有取字模的軟件,如果沒有也可以直接去網(wǎng)上下一個。將字模數(shù)據(jù)預(yù)置存儲在單片機(jī)里面,需要的時候直接發(fā)出去就能顯示,這種辦法簡單而有效。

很好,現(xiàn)在我們寫字的目標(biāo)已經(jīng)轉(zhuǎn)變成“在合適的位置點(diǎn)亮合適的像素點(diǎn)”,那怎么確定位置呢?屏幕有那么多像素點(diǎn),現(xiàn)在空有數(shù)據(jù),卻沒有位置。這個時候就需要簡單說明一下OLED的顯示邏輯了,整個屏幕被劃分成了多個頁,每一頁都有128列像素點(diǎn),屏幕的分辨率是128x64,橫向128像素,縱向64像素,我們每次寫入的數(shù)據(jù)都是8bit的,這個8bit數(shù)據(jù)指示了某個像素頁內(nèi)某一列的像素狀態(tài)。形象地說就是:8個點(diǎn)排一列,橫向排128列就組成了一個頁,整個屏幕一共有8個頁,這8個頁再縱向排列,最終形成了一個128*64的屏幕。

想要在正確的位置顯示內(nèi)容,就得選擇正確的頁(后文直接稱page),page0-page7一共8個,每個page都有自己的物理地址,從B0H到B7H,所以我們可以以此寫一個確定光標(biāo)位置的函數(shù),這個函數(shù)可以在我們需要寫字的時候錨定一個正確的顯示位置。

圖片

前文提到字模,其實(shí)就是一批8bit數(shù)據(jù),再結(jié)合剛剛說明的屏幕顯示原理,就不得不再次思考一個問題,像素得精細(xì)到什么程度才能看起來像一個字,在像的情況下,還要符合OLED這種一頁8行像素的特點(diǎn)(因為這樣會更好操作)。答案是使用8n個像素寬度的正方形來顯示字符,目前來看16*16大小的字符正好符合要求,這也是大部分小屏顯示會選擇的大小。如此一來想要顯示一個字符就需要寫2個page的若干列數(shù)據(jù),于是就有了寫字函數(shù),具體代碼如下圖:

圖片

該函數(shù)首先建立IIC通信,與從機(jī)建立通信后設(shè)置顯示字符的坐標(biāo),隨后直接按順序發(fā)出上半部分和下半部分的像素數(shù)據(jù)即可,這個函數(shù)可以獨(dú)立完成對字符的顯示,后續(xù)演示代碼中顯示字符串的函數(shù)基于此函數(shù)實(shí)現(xiàn),雖然對于字符串的顯示,最佳方案是建立一次通信就完成所有數(shù)據(jù)的傳輸,但那樣的代碼會把各種功能雜糅在一起,層次不夠分明,這里這么規(guī)劃也是為了內(nèi)容更好理解,關(guān)于IIC與OLED的代碼文件會附在文章最后。

圖片

所有用于像素顯示的數(shù)據(jù)都會被存到Graphic Display Data RAM(GGDRAM)中,既然是RAM,理論上在上電的時候,其存儲的數(shù)據(jù)應(yīng)該都是0才對,但為了避免不必要的干擾可能造成的影響,我們還需要一個清屏函數(shù),該函數(shù)其實(shí)就是對所有page的所有數(shù)據(jù)進(jìn)行置0操作。

圖片

具備所有的前提條件,我們就可以在main函數(shù)中顯示內(nèi)容了,在設(shè)備初始化中加入IIC初始化和OLED初始化,再加上字符串顯示就大功告成了。

圖片

最后貼一個圖來看看成品效果

圖片

文章末尾說一些題外話,互聯(lián)網(wǎng)上有很多軟件模擬IIC和OLED驅(qū)動的相關(guān)資料,除去寫字部分的應(yīng)用層代碼,數(shù)據(jù)鏈路層部分的代碼建議還是自己寫,這些開源代碼的IIC總線效率實(shí)際上很低,而且容易造成誤解,編者在研究商家給的例程時,一直不理解為什么例程發(fā)0x00作為控制字節(jié)的時候能初始化成功,而我卻不行,后來仔細(xì)思考了一番是因為他們的IIC,每次建立通訊都只會發(fā)送2個字節(jié)的內(nèi)容,也就是說,如果要發(fā)送20個命令,就需要建立20次IIC通信,每次都要重新發(fā)送從機(jī)地址,發(fā)送這20個命令實(shí)際上要發(fā)送60個字節(jié)(包括IIC地址字節(jié)的話),功能當(dāng)然可以實(shí)現(xiàn),但是效率很低,而且這種代碼注釋并不詳細(xì)(甚至是挪用代碼還不改注釋),如果作為學(xué)習(xí)使用但不加說明的話很容易造成誤解(至少我被誤解了),讀者如果真的有學(xué)習(xí)需求而不是單純的挪用需求,最好還是以手冊描述的內(nèi)容為準(zhǔn)。

審核編輯 黃宇

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

    關(guān)注

    6067

    文章

    44997

    瀏覽量

    650730
  • OLED
    +關(guān)注

    關(guān)注

    120

    文章

    6286

    瀏覽量

    228132
  • 驅(qū)動
    +關(guān)注

    關(guān)注

    12

    文章

    1918

    瀏覽量

    86966
  • IIC
    IIC
    +關(guān)注

    關(guān)注

    11

    文章

    306

    瀏覽量

    39520
  • CW32
    +關(guān)注

    關(guān)注

    1

    文章

    255

    瀏覽量

    1256
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點(diǎn)推薦

    那么點(diǎn)詳細(xì)CW32學(xué)習(xí)筆記】單片機(jī)啟動\庫函數(shù)構(gòu)成

    此篇文章是CW32F030C8T6的參考資料,很詳細(xì),適合初學(xué)者。
    的頭像 發(fā)表于 08-10 11:13 ?1509次閱讀
    【<b class='flag-5'>有</b><b class='flag-5'>那么點(diǎn)</b><b class='flag-5'>詳細(xì)</b>的<b class='flag-5'>CW32</b><b class='flag-5'>學(xué)習(xí)</b><b class='flag-5'>筆記</b>】單片機(jī)啟動\庫函數(shù)構(gòu)成

    那么點(diǎn)詳細(xì)CW32學(xué)習(xí)筆記】通用定時器——輸出比較

    本章以CW32通用定時器為例介紹單片機(jī)定時器的用法。 定時器是單片機(jī)中一個非常傳統(tǒng)且重要的外設(shè),定時器的 本質(zhì)其實(shí)就是一個計數(shù)器 ,只不過被計數(shù)的對象是定時器的時鐘源。定時器要正常工作,需要這幾
    的頭像 發(fā)表于 12-28 11:24 ?1822次閱讀
    【<b class='flag-5'>有</b><b class='flag-5'>那么點(diǎn)</b><b class='flag-5'>詳細(xì)</b>的<b class='flag-5'>CW32</b><b class='flag-5'>學(xué)習(xí)</b><b class='flag-5'>筆記</b>】通用定時器——輸出比較

    CW32移植Free-RTOS】CW32開發(fā)者扶持計劃

    CW32配置Free-RTOS全過程,CW32開發(fā)者扶持計劃
    的頭像 發(fā)表于 04-18 09:38 ?6667次閱讀
    【<b class='flag-5'>CW32</b>移植Free-RTOS】<b class='flag-5'>CW32</b>開發(fā)者扶持計劃

    那么點(diǎn)詳細(xì)CW32學(xué)習(xí)筆記】看手冊配置時鐘樹

    本章針對CW32F030C8T6的時鐘樹進(jìn)行詳細(xì)解析,續(xù)第一章啟動文件的相關(guān)講解。
    的頭像 發(fā)表于 08-17 14:54 ?1491次閱讀
    【<b class='flag-5'>有</b><b class='flag-5'>那么點(diǎn)</b><b class='flag-5'>詳細(xì)</b>的<b class='flag-5'>CW32</b><b class='flag-5'>學(xué)習(xí)</b><b class='flag-5'>筆記</b>】看手冊配置時鐘樹

    那么點(diǎn)詳細(xì)CW32學(xué)習(xí)筆記】模數(shù)轉(zhuǎn)換器

    來說,想要判斷大小就需要有對比,因此該數(shù)字指示的電壓大小實(shí)際上是一個比較的結(jié)果。 ADC將需要測量的電壓信號Ut與已知電壓的信號U作比較,并最終輸出一個數(shù)字表示Ut相當(dāng)于多少比例的U。 接下來就可以看看CW32的ADC外設(shè)結(jié)構(gòu)框圖了,
    的頭像 發(fā)表于 02-29 09:41 ?1139次閱讀
    【<b class='flag-5'>有</b><b class='flag-5'>那么點(diǎn)</b><b class='flag-5'>詳細(xì)</b>的<b class='flag-5'>CW32</b><b class='flag-5'>學(xué)習(xí)</b><b class='flag-5'>筆記</b>】模數(shù)轉(zhuǎn)換器

    【應(yīng)用筆記CW32 自舉程序中使用的 ISP 協(xié)議

    提供的 ISP 模式,通過 UART 串口方便地實(shí)現(xiàn)對 CW32 微控制器片上 FLASH主存儲器的擦除和燒寫。本應(yīng)用筆記將介紹如何進(jìn)入 CW32 微控制器 ISP 模式,以及所使用的 ISP 協(xié)議,并
    發(fā)表于 06-06 13:26

    CW32飯盒派開發(fā)板試用體驗】+初識CW32飯盒派開發(fā)板

    接口,幾乎涉及了我們?nèi)粘TO(shè)計中的常用模塊。是一款不可多得的開發(fā)板。也方便我們調(diào)試其他芯片時,只需要畫個 小藍(lán)板 就可以了。 4、吐點(diǎn)槽。 個人意見,不要求大多數(shù)人同意。 CW32飯盒派開發(fā)板的底板
    發(fā)表于 05-29 15:51

    應(yīng)用筆記(二)| 武漢芯源CW32自舉程序中使用的ISP協(xié)議

    CW32微控制器片上FLASH主存儲器的擦除和燒寫。本應(yīng)用筆記將介紹如何進(jìn)入CW32微控制器ISP模式,以及所使用的ISP協(xié)議,并詳細(xì)介紹支持的每個命令。01目標(biāo)芯片進(jìn)入ISP模式的
    的頭像 發(fā)表于 07-11 16:08 ?1926次閱讀
    應(yīng)用<b class='flag-5'>筆記</b>(二)| 武漢芯源<b class='flag-5'>CW32</b>自舉程序中使用的ISP協(xié)議

    cw32和gd32的區(qū)別

    cw32和gd32的區(qū)別 CW32和GD32是兩種不同的芯片系列,分別由WCH和GigaDevice公司推出,兩者很多不同之處,下面我們來詳細(xì)介紹。 首先從
    的頭像 發(fā)表于 08-16 11:15 ?2601次閱讀

    應(yīng)用筆記-CW32 自舉程序中使用的 ISP 協(xié)議

    ,通過UART串口方便地實(shí)現(xiàn)對CW32微控制器片上FLASH主存儲器的擦除和燒寫。本應(yīng)用筆記將介紹如何進(jìn)入CW32微控制器ISP模式,以及所使用的ISP協(xié)議,并詳細(xì)介紹支持的每個命令。
    發(fā)表于 06-06 13:37 ?7次下載

    基于CW32的物聯(lián)網(wǎng)應(yīng)用

    CW32】基于CW32的物聯(lián)網(wǎng)應(yīng)用
    的頭像 發(fā)表于 11-02 15:55 ?1234次閱讀
    基于<b class='flag-5'>CW32</b>的物聯(lián)網(wǎng)應(yīng)用

    那么點(diǎn)詳細(xì)CW32學(xué)習(xí)筆記】通用異步收發(fā)器—發(fā)送篇

    本章介紹CW32通用異步收發(fā)器的使用。 雖然大部分時候會被簡單稱為“串口”,但實(shí)際上 用“串口”來指代UART并不正確 。串口對應(yīng)并口的概念,在串口通信中,數(shù)據(jù)被以二進(jìn)制形式發(fā)送,并且每次發(fā)送都只
    的頭像 發(fā)表于 11-17 17:30 ?1260次閱讀
    【<b class='flag-5'>有</b><b class='flag-5'>那么點(diǎn)</b><b class='flag-5'>詳細(xì)</b>的<b class='flag-5'>CW32</b><b class='flag-5'>學(xué)習(xí)</b><b class='flag-5'>筆記</b>】通用異步收發(fā)器—發(fā)送篇

    CW32學(xué)習(xí)筆記IIC接口-主機(jī)發(fā)送

    接著就是比較重要的部分了,IIC接口的收發(fā)并不是全自動的,因為一個完整的通信不僅包括發(fā)數(shù)據(jù)(地址、數(shù)據(jù)什么的),還包含收數(shù)據(jù)(啥也不干也得接收ACK信號),所以IIC通信的每個部分基本上都是收發(fā)易位的過程,
    的頭像 發(fā)表于 01-10 15:59 ?1142次閱讀
    【<b class='flag-5'>CW32</b><b class='flag-5'>學(xué)習(xí)</b><b class='flag-5'>筆記</b>】<b class='flag-5'>IIC</b><b class='flag-5'>接口</b>-主機(jī)發(fā)送

    那么點(diǎn)詳細(xì)CW32學(xué)習(xí)筆記IIC接口-主機(jī)發(fā)送

    例程鏈接 : https://pan.baidu.com/s/1s1XwqDFkO8fK4SRSTKsNhA?pwd=mshk 提取碼 :mshk 本章將介紹CW32IIC接口,并最終點(diǎn)亮一塊
    的頭像 發(fā)表于 01-11 09:53 ?1004次閱讀
    【<b class='flag-5'>有</b><b class='flag-5'>那么點(diǎn)</b><b class='flag-5'>詳細(xì)</b>的<b class='flag-5'>CW32</b><b class='flag-5'>學(xué)習(xí)</b><b class='flag-5'>筆記</b>】<b class='flag-5'>IIC</b><b class='flag-5'>接口</b>-主機(jī)發(fā)送

    那么點(diǎn)詳細(xì)CW32學(xué)習(xí)筆記】ADC“自動模式”

    上個章節(jié)介紹了ADC的基本框架和用法,本章節(jié)會較為全面地講解如何靈活地使用ADC功能。 通常來說,外設(shè)執(zhí)行的各種命令都是由CPU發(fā)出的,比如我們需要進(jìn)行AD轉(zhuǎn)換,就通過某個寄存器標(biāo)志位啟動ADC,隨后用判斷函數(shù)去檢測執(zhí)行情況,亦或是開啟中斷功能,轉(zhuǎn)換完成之后會提示CPU,再由CPU判斷接下來該做什么。 這當(dāng)然沒問題,不過有些時候,我們需要實(shí)現(xiàn)一些循環(huán)重復(fù)的功能,比如在做傅里葉分析的時候,需要按照固定間隔采集一定數(shù)量的數(shù)據(jù),比如采
    的頭像 發(fā)表于 03-04 18:09 ?1515次閱讀
    【<b class='flag-5'>有</b><b class='flag-5'>那么點(diǎn)</b><b class='flag-5'>詳細(xì)</b>的<b class='flag-5'>CW32</b><b class='flag-5'>學(xué)習(xí)</b><b class='flag-5'>筆記</b>】ADC“自動模式”