简介
这几天过年,有点时间开始折腾以前买的红黑版电子价签了。目标是可以通过手机蓝牙发送图片到价签。下面是效果图:
先放上源码吧,因为后面都是些闲话了。
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越来越强大
这个价签就是一个小开发板了,非常值
谢谢数码之家的网友的分享