×

EInk屏幕模块驱动原理与代码分析,PSoC 6先锋套件评测资料下载

消耗积分:3 | 格式:pdf | 大小:983.17KB | 2021-04-06

罗星

分享资料个

此次PSoC 6先锋套件的评测,其实还了作者自己的一个心愿,那就是对EInk屏幕的原理与驱动代码进行一个深入的分析。 作为9年前就开始使用电纸书进行阅读的本文作者,一直没有抽出时间与精力来对它的原理进行了解确实有点小小遗憾。希望本文能给有需要的朋友能带来一点知识和阅读的兴趣。Happy Reading and Happy Coding! 概览 先来两张效果图: 图 使用PSoC 6来驱动EInk图 使用另外一款开发板驱动EInk 近几年来,有感于中国人读书的数量较其他国家少(比如日本,德国等发达国家),不管是国家还是地方政府相继推出了不少倡导读书的活动:如"读书年","读书月","全民阅读"等等。不过起到的效果如何还是要看个人的自身觉悟情况,归根结底阅读还是属于个人行为。 就作者本人的体会来讲,从小是很喜欢读书,甚至到了干扰正常学习工作的程度。但是自从有了个人电脑,智能手机,读书时间便直线下降。因为电子版本的资源比起纸质版本的更加及时也更加丰富,导致本人有很长一段时间就没有摸过书,相信这也是我们这一代人共同的体验。真正让本人重拾书本认真阅读的就是电纸书这个技术。 2011年本人买了第一个电纸书,从此收不住了。到目前为止,作者拥有6,7个电纸书,不同的电纸书存放不同的书籍种类,如有的放小说,有的放政治历史,有的放外文,有的放时事等等。电纸书阅读给本人的体验就是看起来很舒服,如果配上了均匀的背光,看起来比真正的纸质书还要赏心悦目。当然这是本人的一家之言,也有人认为还是纸质的书好。不论如何,把电纸书技术列作本时代最伟大的发明之一不为过。 本文的主题就是评测Cypress PSoC 6 Pioneer Kit 配套的EInk模块。该模块是Cypress组装的,核心器件由龙亭新技生产,分辨率是264x176,显示密度是117dpi。由于PSoC 6双核,高性能,低功耗的特点,使得其非常适合驱动这种显示器件。当然在探究了其原理之后,后面将尝试移植驱动代码到其他器件上以验证这个学习过程。 需要指出的是,EInk模块不仅仅可以用作电纸书的面板,事实上目前业内应用的不少器件都可以使用EIink来替代以降低功耗。比如很多监控仪器的参数显示面板,如果使用LCD/OLED这种技术,电源不能停,但是其显示更新的频率其实很低,如每天更新只有几次甚至几天一次。如果换成仅仅更新需要电源,维持内容不需要电源的EInk,不仅功耗可大大降低,稳定性也会大大增强。 EInk硬件 先将CY8CKIT-028-EPD原理图的几个部分分别贴出来。 图 外部接口 按照Arduino接口来分布的,除了I2C是其他外设,其余引脚是EInk模块控制信号。除了SPI的4根线之外,还有电源控制,边界控制,放电控制,复位信号,状态信号。 图 电平转换 EINK模块可以被不同的主控板控制,VCC/VDD电压范围2.3v~3.6v,通过电平转换来进行电压匹配。 图 电源控制 因为维持显示内容不需要电源,所以不更新内容时,可以把COG 驱动power off当需要更新显示内容时,再把COG驱动power on。这对于其他技术的显示器来说是巨大的功耗节省。 图 Border控制 边界控制:当进行电子墨水颗粒处理的时候用来保持边框清晰度的一种控制信号,利用时序控制引脚来控制此信号。 图 Discharge控制 放电控制就是在更新完毕后,将EInk驱动的电容上的电荷放掉以进一步减少功耗。 图 核心模块 上图是EINK模块的显示原理图,也就是最终的显示面板。除了Border信号之外,其余信号跟一般的显示器也差不多。这是因为这个驱动器本身也有COG控制IC以简化外围驱动软硬件设计。 Cypress的这个模块除了EInk之外还有其他几个器件:Motion传感器,热敏电阻与PDM接口的麦克风。这些器件与PSoC 6的配合也是值得一写的,权且放在后面的文章中介绍,此文对它们暂且不题。 驱动方式 如何控制这个显示器,也就是如何控制其内置COG (Chip On Glass) 驱动控制IC,新亭原厂提供了驱动例程。大致顺序是先将内容放到COG控制IC的内存(这个内存(memory)可以是图像buffer,SRAM或者Flash)中,接着给COG驱动上电并且初始化COG驱动,然后按照特定的显示数据格式将存储在IC内存中的内容发送到EPD(E-Paper Dispaly)显示。更新EPD显示内容的三种方式: ●4步; ●2 步; ●部分更新。 其中4步更新是最耗时的,但是显示效果也最好(残影少)。2步更新是省去了其中两步,部分更新就是省去了大多数操作。如果原来显示的内容与新内容相差过大,则需要用4步更新,否则酌情减少步骤。当然所需要的更新时间与显示效果是一个Trade-Off关系,需要程序员折中处理。 一般的电纸书应用这样做的:第一次显示某本书使用4步更新,之后每页纸进行部分更新,若干页后进行2步更新,过了更长的阶段后再进行一次4步更新。对于4步更新,过程是这样的: 图 4步更新 注意因为这样的更新方式,所以每次显示都需要保持上次的内容以作取反之用。2步更新法就是省去了取反的过程,部分更新法则是直接显示新内容。本文所使用的显示器是264x176的点阵,无灰阶,则每个Frame的显存为: 264 * 176 = 46464 Bits / 8 = 5808 Bytes EPD更新显示内容方式的介绍应该是建立在存储在同一内存的两帧数据,之前显示内容变更为新的显示内容(Previous Display-> New Dispaly)之上。所以需要两个Frame,那么显存就是10KB以上了,另外驱动的过程中也需要19KB以上的中间缓存,为什么需要两个Frame呢?故此在选用主控芯片时需要考虑到显存的尺寸。EPD驱动流程图如下: 图 流程图 EPD更新周期内的信号控制图: 图 信号波形 使用PSoC 6驱动EInk 如上文所述,EInk的特点是保持显示内容不需要电源,但是更新显示内容时,不停地需要处理器来做控制与查询。这种任务比较适合于低功耗的内核,比如PSoC 6中的Cortex M0 内核,此例中Cortex M4没有用武之处,所以干脆就没有使能。顶层设计图: 图 顶层设计 包括SPI口为通信口,定时器用来产生1ms的定时Tick,其余几个IO口为通用IO。 图 SPI模组配置图 更新定时器配置 这个定时器的主要作用是提供1ms的Tick计时,实际上任何可以提供1ms的tick的定时器都可以用,比如内核中的SysTick,这里只是为了展示如何配制通用定时器。 至于要显示的资源与内容,因为该显示器的点阵与内存的对应是逐行对应,所以取模时使用横行取模,字节正序即可。CYPRESS提供的EINK例程中支持两种大小字体,分别是CY_EINK_FONT_8X12BLACK和 CY_EINK_FONT_16X16BLACK。当然更高阶的玩家可以使用取模工具支持更多字体开发。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

评论(0)
发评论

下载排行榜

全部0条评论

快来发表一下你的评论吧 !

'+ '

'+ '

'+ ''+ '
'+ ''+ ''+ '
'+ ''+ '' ); $.get('/article/vipdownload/aid/'+webid,function(data){ if(data.code ==5){ $(pop_this).attr('href',"/login/index.html"); return false } if(data.code == 2){ //跳转到VIP升级页面 window.location.href="//m.lene-v.com/vip/index?aid=" + webid return false } //是会员 if (data.code > 0) { $('body').append(htmlSetNormalDownload); var getWidth=$("#poplayer").width(); $("#poplayer").css("margin-left","-"+getWidth/2+"px"); $('#tips').html(data.msg) $('.download_confirm').click(function(){ $('#dialog').remove(); }) } else { var down_url = $('#vipdownload').attr('data-url'); isBindAnalysisForm(pop_this, down_url, 1) } }); }); //是否开通VIP $.get('/article/vipdownload/aid/'+webid,function(data){ if(data.code == 2 || data.code ==5){ //跳转到VIP升级页面 $('#vipdownload>span').text("开通VIP 免费下载") return false }else{ // 待续费 if(data.code == 3) { vipExpiredInfo.ifVipExpired = true vipExpiredInfo.vipExpiredDate = data.data.endoftime } $('#vipdownload .icon-vip-tips').remove() $('#vipdownload>span').text("VIP免积分下载") } }); }).on("click",".download_cancel",function(){ $('#dialog').remove(); }) var setWeixinShare={};//定义默认的微信分享信息,页面如果要自定义分享,直接更改此变量即可 if(window.navigator.userAgent.toLowerCase().match(/MicroMessenger/i) == 'micromessenger'){ var d={ title:'EInk屏幕模块驱动原理与代码分析,PSoC 6先锋套件评测资料下载',//标题 desc:$('[name=description]').attr("content"), //描述 imgUrl:'https://'+location.host+'/static/images/ele-logo.png',// 分享图标,默认是logo link:'',//链接 type:'',// 分享类型,music、video或link,不填默认为link dataUrl:'',//如果type是music或video,则要提供数据链接,默认为空 success:'', // 用户确认分享后执行的回调函数 cancel:''// 用户取消分享后执行的回调函数 } setWeixinShare=$.extend(d,setWeixinShare); $.ajax({ url:"//www.lene-v.com/app/wechat/index.php?s=Home/ShareConfig/index", data:"share_url="+encodeURIComponent(location.href)+"&format=jsonp&domain=m", type:'get', dataType:'jsonp', success:function(res){ if(res.status!="successed"){ return false; } $.getScript('https://res.wx.qq.com/open/js/jweixin-1.0.0.js',function(result,status){ if(status!="success"){ return false; } var getWxCfg=res.data; wx.config({ //debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。 appId:getWxCfg.appId, // 必填,公众号的唯一标识 timestamp:getWxCfg.timestamp, // 必填,生成签名的时间戳 nonceStr:getWxCfg.nonceStr, // 必填,生成签名的随机串 signature:getWxCfg.signature,// 必填,签名,见附录1 jsApiList:['onMenuShareTimeline','onMenuShareAppMessage','onMenuShareQQ','onMenuShareWeibo','onMenuShareQZone'] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2 }); wx.ready(function(){ //获取“分享到朋友圈”按钮点击状态及自定义分享内容接口 wx.onMenuShareTimeline({ title: setWeixinShare.title, // 分享标题 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享给朋友”按钮点击状态及自定义分享内容接口 wx.onMenuShareAppMessage({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 type: setWeixinShare.type, // 分享类型,music、video或link,不填默认为link dataUrl: setWeixinShare.dataUrl, // 如果type是music或video,则要提供数据链接,默认为空 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到QQ”按钮点击状态及自定义分享内容接口 wx.onMenuShareQQ({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到腾讯微博”按钮点击状态及自定义分享内容接口 wx.onMenuShareWeibo({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到QQ空间”按钮点击状态及自定义分享内容接口 wx.onMenuShareQZone({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); }); }); } }); } function openX_ad(posterid, htmlid, width, height) { if ($(htmlid).length > 0) { var randomnumber = Math.random(); var now_url = encodeURIComponent(window.location.href); var ga = document.createElement('iframe'); ga.src = 'https://www1.elecfans.com/www/delivery/myafr.php?target=_blank&cb=' + randomnumber + '&zoneid=' + posterid+'&prefer='+now_url; ga.width = width; ga.height = height; ga.frameBorder = 0; ga.scrolling = 'no'; var s = $(htmlid).append(ga); } } openX_ad(828, '#berry-300', 300, 250);