簡介
這幾天過年,有點時間開始折騰以前買的紅黑版電子價簽了。目標是可以通過手機藍牙發送圖片到價簽。下面是效果圖:

先放上源碼吧,因為后面都是些閑話了。
https://github.com/muyuchl/cc2640BleEpd
包括了android app和IAR工程,怕編譯的可以直接下載二進制文件。
IAR 環境搭建
安裝TI sdk到默認目錄C:\ti\simplelink_cc2640r2_sdk_1_40_00_45
IAR 8.11 (安裝到無空格路徑,有空格下我一台電腦可以編譯,另一台不行,被折騰過了)
代碼里的目錄(5.14Simper... 和 target)也放到 sdk 下CC2640R2_LAUNCHIOT 目錄下。
祝您順利編譯!
Android 環境我的是
Android Studio 4.1.2
Android SDK 11.0 (API 30)
使用方法
首先制作兩個104x212的黑白圖,再用Image2Lcd生成bin文件。設置參數如下圖所示

把生成后的bin文件放到手機里,我是放到download目錄里了。不知道SD卡是不是能直接用,不行就APP里加權限,反正有源碼。
安裝APP到手機后打開,如下圖(這圖已經開始下載了),不需介紹應該也會用
* connect會彈出列表,選擇藍牙設備,目前名字是Peripheral_uarttrans
* 'Load black File' 加載黑白圖像文件
* 'Load red File' 加載紅白圖像文件
* 'Start Download'開始下載
下載進度用文本標簽提示,下載完也有提示

折騰過程
這幾個價簽去年很早就買了(在另一篇黑白價簽博客里介紹過),由於不過用就一直扔在那里。
后來為了用起來淘了個二手的CC2640開發板。開發板也就運行一下測試又放一邊了。
中間有段時間想玩一玩,就去看開發板的文檔和代碼。看的也似懂非懂的。
另外,具體的管腳也沒有網友提供,不像MSP430時候有現成的直接用。
我看很多網友都是拆掉外殼單獨把屏幕拿出來用。
去年夏天我也拆掉一個,還去某魚上淘了幾個便宜的驅動板,不過最后程序沒調出來。
直到過年放假前,看到數碼之家有網友拆機后驅動成功,他說網傳的數據文檔有誤,並發了一個新版本。
我拿出夏天時買的驅動板和拆出來屏幕,接到STM32F1上,用微雪的代碼成功顯示黑白,修改顯示尺寸后也正常,非常鼓舞人心啊。
可惜沒積分,不能下載那個網友的更正。
我自己也發現其中一個錯誤,文檔把顯示紅色屏命令等同於黑白那個了,估計研發人員復制的。
然后決定放假時候就搞一下這個價簽吧。
目標是使用藍牙把圖像傳到設備上顯示出來,這樣就不需要破壞外殼了。
下面憑記憶開始流水帳記錄了,看官莫笑
* Android手機和CC2640通信上
我下載了最新的Android Studio,裝上后才發現以前安裝的也還在。創建Hello World工程很順利。
但是直接打開工發板的示例工程(比較老)失敗,好像是gradle版本要某個版本。
上網一陣搜,有人碰到相同問題,但我照着做還是不行。換用低版本的android studio也不行。
又打算新建工程,把示例代碼一個個添加過去,在加過去后又是一堆編譯錯誤,大部分是依賴什么東本的。
Android 變化太大了,作為業余愛好者只好又放棄。
然后又不甘心,又去做各種嘗試,最后發現把gradle版本改成的新建的Hello World的一樣后居然順利編譯安裝。
連接藍牙,收發數據都正常了。
* 自定義通信協議
自己定義了簡單的協議,第一個字節當命令,有些命令如寫數據后跟一定的數據
MCU在收到命令后執行操作后再回復,也是第一個字節(和收到的命令一樣,懶得再區分問和答了)
手機在收到回復再做下一步操作。
一開始擔心干擾會不會丟包什么的,那樣就要自己做超時重傳了,自己對android不熟,想想就頭疼。
實際 測試時發現數據沒丟,應該是藍牙協議幫忙搞定了。
好像邊上網搜索邊不停嘗試折騰了兩天,終於調試通信功能。
* CC2640驅動墨水屏
上網搜現成的沒有搜到,只好自己改。參考SPI FLASH的代碼改啊改。
這個還好比較順利,但也犯了兩個低級錯誤:
1, 墨水屏的電源線沒接,結果當然是沒有顯示。
一開始不接電源線的原因是打算先調好程序下載后再接,怕原先的程序IO輸出會導致短路,燒壞板子。
結果是等寫好代碼過了好久就忘了。
以后還是等下好程序再接全部的線。
2, 墨水屏有幾個腳沒接對位置
我是用的CC2640開發板加拆機墨水屏,所以得把開發板上原先的跳線拿下。
結果接線的時候接到了外側,實際上就是墨水屏沒有連接到CPU管腳上。
還好沒花多少時間就發現了錯誤
* 藍牙更新墨水屏 CC2640
協議通了,墨水屏驅動也有了,兩個集成一下不就可以實現藍牙更新墨水屏了么?
又想簡單了。之前實現協議是直接在收到藍牙數據 包的回調函數里做的,前面是串口打印,然后就回復手機了。
現在加了墨水屏驅動了,里面的延時比較大,導致藍牙斷開了。
偷懶失敗,只好再新建個任務,以多線程的方式來處理接收到的藍牙數據。
改啊改,調啊調,終於在除夕那天搞定。心想,接下來就可以調價簽了。
* 價簽藍牙調試1
大年初一了。
之前就了解到CC2640R2F和CC2640管腳兼容,開發流程類似,所以以為有開發板例子的幫助應該很順利吧。
用萬用表測了PCB背面的串口,發現用的是通用的管腳,太好了。
學習了一下cjtag的連接,用杜邦線連到一個夾子上,再夾到價簽上,下載了一個simple peripheral 工程。
串口有輸出 ,太好了。
用手機連接藍牙,能連上,但是不能查看服務。用蘋果手機連則超時斷開。
再換個工程,還是一樣。慌了,不知道什么原因,紅米手機可以掃描並連接藍牙,說明無線可以用的呀。
是不是開發板的人沒搞好例子?雖說可能性不大。
我又試了一下官方的launchpad 例子,還是一樣的現象。
是不是SDK版本太低了?於是下載了4.10, 4.40的SDK。
IAR有編譯錯誤。電腦本來就裝了CCS9,這個倒是可以打開,可惜現象還是一樣。
CCS和IAR切換一下都是更新XDS的固件,不更新就不讓繼續,唉。
我看lauchpad代碼有個什么兩按鈕的菜單,phy 1M, phy 2M, both,猜想是不是一定要選擇后才能繼續。而CC2640開發板也是有LCD,有按鈕的。
我又打算搞兩個IO口接按鈕。折騰了一下,沒反應,可能按鈕的代碼沒寫對,再查看代碼,有沒有按鈕應該不影響。
想不出來 什么原因了。會不會是我的紅米老年機太老了,不知道藍牙5 .0?
換了個稍微新點的另一個紅米手機,還是一樣。
是不是模塊有鬼?我看了又看,PCB上就一個CC2640, 墨水屏(已拆),和LED, 干簧管。想不明白為啥藍牙不通。
上淘寶搜過模塊,貴了點,但是春節估計收不到了。 他們的說明書都要買開發板才分享。
* 價簽藍牙調試2
大年初二
我在考慮退而求其次,PCB背面有串口可用,搞成使用串口傳輸內容到價簽吧?
好,首先得逆向出墨水屏的管腳來。
本來就是近視眼,也沒做過PCB板子,雖然是兩層板,對我也是有困難的。
沒有顯微鏡可以利用。我用手機拍了照片,然后在電腦上放大,用PS里的鉛筆做標注。
我去年就買了一對很細的萬用表筆,就是為了個任務准備的。
過孔的逆向難一點,把板子翻來翻去,如果現在再做的話我會把正反拍照,然后在PS里找。
管腳逆向完,可以寫代碼驗證了。
我的思路是對這些IO分別輸出高低,同時用萬用表測,這就需要調試時單步。
GPIO總該最簡單的了吧?沒想到還是被坑了。
寫完,調試卻發現我輸出高和低,怎么都一樣?見鬼了。
於是就胡思亂想,是不是要等操作系統的消息循環起來后才起作用?是不是我的串口輸出有問題?
搞了幾個開發板的例子后都失敗,又打開launchpad的例子。
無意中發現有個RCOSC的配置,就去試一下,結果發現藍牙可以發現服務了。
上網一查,這個配置是給沒有32K晶振的電路用的。對比開發板和價簽,價簽確實沒有32K晶振,真相大白了。
IO測試也發現在被 pinopen過的管腳,在其它再open時會不起作用。(應該就是這個原因,懶得再去驗證了,自己確保每個IO只OPEN一次就好了)
* 無線通信協議 cc2640r2f
大年初三
既然藍牙可以用,又回到藍牙更新的想法上來。
查看CC2640R2開發板的例子,只有peripheral_uarttrans最像CC2640版本的。
說明一下,我買的是CC2640的開發板,核心模塊是焊死在開發板上的,而開發板廠家提供了針對 2640和2640R2F的例子,我都下載了。
跑起來一看,怎么特征個數和2640的例子不一樣?要是用這個的話我不是要改手機APP程序 ?
看了一下launchpad的ble5stack的例子,也是一樣,開發板廠家就是從launchpad 移植的。
launchpad下還有blestack的例子,看上去和CC2640的例子很相似。區別是我的開發板支持多字節收發,而launchpad只支持一個字節。
那就改成多字節的吧。我把開發板的修改應用到了launchpad的例子,運行了一下,收發了幾個就沒反應了或斷開藍牙了。
是不是我漏了什么?
還是回到最原先的peripheral_uarttrans例子吧,改手機程序 。
上網搜,加嘗試,發現一個特征也能收和發。
改UUID和價簽匹配,沒花多少時間就收發正常了。
然后把CC2640的協議移過來。
睡覺前通信正常
* 無線更新墨水屏cc2640r2f
大年初四
今天的重點是價簽墨水屏。
之前都是在另一塊拆掉屏幕的板子上調試,逆向IO時我把背面的觸點都焊線了,用板杜邦線和XDS調試器連接。
今天改回用夾子夾價簽。
把CC2640的代碼移過來,編譯,下載,測試。沒用幾次就看到屏幕更新了。
然后就是集成無線更新代碼了。
編譯后下載。有時藍牙沒搜到,有時串口都沒輸出。
只好單步調試,也是每次不一樣,有時只輸出剛開始的串口信息,后面要么跑飛了,要么跑到一個什么ICall abort的死循環里了。
有幾次IAR輸出 棧指針超出范圍。
應該是棧溢出了吧?上網搜答案。
改任務的棧,改編譯器的棧。
是不是我調試代碼里太多print了?刪掉一些,好像有改善,但是沒解決問題。
是不是這個例子多的SDI 任務太大了?一開始修改BUF大小,后來直接去掉,使用最簡的阻塞輸出串口。
還是不行。會不會是硬件壞了?
換了一個價簽,下載就失敗了。再換一個,倒是可以下載,但問題沒解決。
有時下載時會跳出來halt after bootloader
后來又發現拔插一下XDS就可以下載了。
然后回退到昨天的代碼,工程清空了好幾遍,居然還不行。
一查XDS的接線,nReset接到了TDI,糾正后一切都正常了。
那個位置正好是nReset在價簽上的位置。
沒想到在這里翻車了,一開始的墨水屏調通,沒讓我懷疑是接線出了問題,后面下載,單步看上去都是正常的。
代碼本來就沒問題,接好線重試,看着手機上下載進度更新,心理舒坦了。
數碼之家的積分有了,下載到了紅黑屏的正確流程。原來"Set display size and driver output control'那里參數也有錯誤。
下午開始搞紅色顯示。
手機端也要更新,增加加載紅色文件功能。
沒想到又碰到問題,屏幕最后只顯示紅色圖片內容,並且是預計的反色的。
懷疑是不是自己有漏了,檢查后一樣,又網友文檔是不是還有問題。
又拿出STM32來測試紅色顯示。最后發現把紅色的數據反一下色就對了(微雪的網上科普說的紅色處理和黑色一樣的,可能是芯片不一樣吧)
懶得改IAR代碼了,我就在手機下載紅色那里反一下色。
終於成功了,不知道這幾天要掉多少頭發。
下載調試用的夾子,也是老早就為這事買好的,這樣就不需要焊線了

* 改進
目前完全沒考慮低功耗,我也是搞着玩,更新完數據后在電池和PCB間塞上一張紙
原廠做得很好,現在還有3V多電壓
使用干簧管喚醒
* 感想
藍牙協議太復雜了,想掌握絕非易事
有些錯誤回過頭再看,覺得很弱智
容易過於樂觀,實際開發會碰到妖蛾子
IAR的編輯器太難用,我覺得QT Creator越來越強大
這個價簽就是一個小開發板了,非常值
謝謝數碼之家的網友的分享
