题外话:从Android mmi层转战驱动已达3月,作为方案公司的程序猿,对于MTK的驱动,最大的体会:填表,永无止境;不会填了,请call FAE。所以,时日匆匆,待到年华已逝,填表登峰造极之时,想要转行,不禁长叹:天地苍茫,任我彷徨,但思转行,余生何往... ...ok,闲话休提,获取知识不应只是工作的驱使,咱要有对知识的兴趣和渴望。填表不给机会,咱自己去探索。这三月中最大的收获,莫过于学习了开发一个模块,如何从底层到上层。现以呼吸灯为例,分段记录下开发过程。这里先介绍一下本实验待实现的简单功能和所用到的主要芯片。

本实验所实现的简单功能:应用程序apk界面仅包含一个SeekBar控件,通过拖动进度条来控制Led等的亮度(与调Lcd背光亮度功能类似)。后面几篇会按照“驱动——HAL——JNI——Framework——APP”的开发过程进行叙述。下面先介绍下本实验用到的呼吸灯控制芯片。

一  呼吸灯控制芯片SN3112-12简介

SN3112-12是矽恩微电子的一款12路呼吸灯驱动芯片,工作于2.7V~5.5V,每路单独256级亮度可控。单路最大输出电流可通过一个外部电阻设定,最大限制电流为38mA。主控器件(这里为MT6572)通过I2C接口对其进行编程控制,通过将SDB脚拉低或软件设置可关断芯片,进入低功耗模式(对手持设备,省电必须考虑)。SN3112-12的从地址为0xa8.如下为芯片典型应用电路图:

单路最大输出电流由图中电阻R_EXT控制,计算公式为:

I_max  =  x * V_EXT / R_EXT

其中x = 58.5,V_ENT = 1.3V。如上,R_EXT = 3.3k欧时,I_max = 58.5 * 1.3 / 3300 = 23mA。

注意:PCB布线时,芯片需原理手机天线放置,防止天线对芯片辐射造成影响。

SN3112-12采用QFN-20封装,其20个引脚说明如下:

芯片其他详细的电气特性请查找芯片datasheet。

二  I2C通信接口简介

芯片既然是I2C接口通信,这里先简单介绍下I2C通信协议。

2.1 I2C简介 

I2C(Inter-Integrated Circuit)总线是由PHILIPS公司开发的两线式串行总线,用于连接微控制器及其外围设备。I2C总线通过串行数据(SDA)线和串行时钟 (SCL)线在连接到总线的器件间传递信息。每个器件都有一个唯一的地址识别,而且都可以作为主设备,但是同一时刻只能有一个设备被允许作为主设备。主设备是初始化总线的数据传输并产生允许传输的时钟信号 的器件,此时,任何被寻址的器件都被认为是从设备。其特性如下:

1、只要求两条总线线路:一条串行数据线SDA,一条串行时钟线SCL;

2、每个连接到总线的器件都可以通过唯一的地址和一直存在的简单的主机/从机关系软件设定地址,主机可以作为主机发送器或主机接收器;

3、它是一个真正的多主机总线,如果两个或更多主机同时初始化,数据传输可以通过冲突检测和仲裁防止数据被破坏;

4、串行的8 位双向数据传输位速率在标准模式下可达100kbit/s,快速模式下可达400kbit/s,高速模式下可达3.4Mbit/s;

5、连接到相同总线的IC 数量只受到总线的最大电容400pF 限制。

2.2 位传输

I2C每传输一个数据位,会产生一个时钟脉冲,逻辑0(低)和逻辑1(高)的电平不是固定的,它由电源VCC的相关电平决定。在传输数据的时候,SDA线必须在时钟高电平的时候保持稳定,SDA的高或低只有在SCL为低时改变。如下为I2C位传输数据有效性图:

2.3 起始停止位

SCL是高电平时,SDA线从高到低切换,该情况表示起始条件;SCL是高电平是,SDA线从低到高切换,该情况表示终止条件。起始和终止条件一般由主机产生,总线在起始条件后被认为处于忙状态,在终止条件的某段时间后被认为处于空闲状态。示意图如下:

2.4 数据传输

发送到SDA线上的字节格式必须为8位,每次传输发送的字节数量不受限制,每个字节后必须跟一个响应位,字节发送最先发送最高位(MSB)。

数据传输必须带响应,相关的响应时钟脉冲由主机产生。在响应的时钟脉冲期间发送器释放SDA 线(高)。在响应的时钟脉冲期间,接收器必须将SDA 线拉低,使它在这个时钟脉冲的高电平期间保持稳定的低电平。如下为传输示意图:

2.5 寻址方式

第一个字节的头7 位组成了从机地址,最低位(LSB)是第8 位,它决定了传输方向。第一个字节的最低位是“0”,表示主机会写信息到被选中的从机;“1”表示主机会向从机读信息,当发送了一个地址后,系统中的每个器件都在起始条件后将头7 位与它自己的地址比较,如果一样,器件会判定它被主机寻址,至于是从机接收器还是从机发送器,都由R/W 位决定的。SN3112-12的器件地址为“1010 100”,由于SN3112-12只支持写操作,所以最低位固定为0,即组合成的地址字节固定为“1010 1000”,即0xa8。普通7位地址传输方式如下:

2.6 SN3112-12芯片的I2C通信介绍

SN3112-12使用固定的8位从地址“1010 1000”,该芯片只支持写操作。下图为传送时序图:

在SCL为稳定的高电平时,SDA为闭锁状态并且在不使用的时候保持高电平。“开始”信号由SCL保持高电平时SDA拉低产生的,首先传送8位从地址,在最后一位传输出去后,主控器件会检测SN3112-12的应答信号。主控器件会通过上拉电阻释放SDA为高电平,然后是SCL发送一个脉冲,如果SN3112-12正确接收到8位数据,在SCL的脉冲期间,它将使SDA拉低。如果SDA不为低,则表示数据没有成功被接收。主控器件会发送一个“停止”信号并中断数据传送。SN3112-12从地址成功发送后,接下来发送寄存器地址,最后发送寄存器数据。每个字节的发送过程是一样的。如下为典型方式写入SN3112-12:

还有一种地址自加的方式:如果有多个数据要传入SN3112-12,只需发送第一个待写入的寄存器地址,在SN3112-12接收数据期间,寄存器地址会自动加1,下一个数据将写入新的寄存器中,如此继续,直到I2C写入停止信号。如下为地址自加方式:

三  SN3112-12寄存器介绍

下表为SN3112的寄存器定义:

3.1 关断寄存器(00h)

关断寄存器用来设定软件关断SN3112-12。SSD位置1时为标准工作模式,置0为关断SN3112-12。

3.2 PWM寄存器(04h~0Fh)

PWM寄存器对每路Led设置256级亮度可控。PWM设置Led平均电流值 I_out = (x / 256) * I_max。其中x为PWM寄存器值。04h~0Fh对应12路led。

3.3 LED控制寄存器(13h~15h)

LED控制寄存器存储每路Led开关状态。OUTx位为0时表示关闭,为1时表示开启。

3.4 数据更新寄存器(16h)

发送给PWM寄存器和Led控制寄存器的数据会被存储到临时既存器里,写入任意8位数据到数据更新寄存器里才可使数据生效。

3.5 复位寄存器(17h)

写入任意8位数据到复位寄存器中可使所有寄存器数据回复到默认值。

四  SN3112-12应用说明

4.1 PWM控制

通过设置PWM寄存器(04h~0Fh)值来调节每路LED亮度。连续写入数据是PWM值升高或降低可达到呼吸效果。

4.2 LED呼吸灯非线性校正

SN3112-12内部实现线性256级灰度PWM调光,由于人视觉对亮度的误差,电流线性增加时,视觉上会感觉到LED灯开始时亮度变化快,然后进入到亮度饱和的问题。故在呼吸时建议采用伽马补偿方法,达到视觉效果的线性。如下为32级亮度的伽马补偿数据:

五  其他

主控芯片MT6572这里就不多做介绍了,本实验中,采用了GPIO模拟I2C通信,SN3112-12与MT6572的连接如下:

如图,这里只需注意3个脚即可,SDB,SCL和SDA,分别用了MT6572的GPIO141,GPIO101和GPIO138脚。编程过程只需对这三个脚进行操作即可。

MT6572平台加入呼吸灯功能——控制芯片SN3112-12简介相关推荐

  1. MT6572平台加入呼吸灯功能——编写linux驱动

    上一篇介绍了本实验所使用的主要IC及其通信方式,这里开始记录正式的开发过程.所选用的平台为MTK的MT6572,做过MTK智能平台研发的亲们都知道,MTK将自己的东西都添加在自加的包mediatek下 ...

  2. 灵动微电子MM32L0系列芯片做呼吸灯功能

    呼吸灯就是指电子产品上的LED灯的亮度随着时间由暗到亮逐渐增强,再由亮到暗逐渐衰减,有节奏感地一起一伏,就像是在呼吸一样,因而被广泛应用于手机.电脑等电子设备的指示灯中.在使用MCU开发相关的应用产品 ...

  3. android呼吸灯动画,Android高德地图自定义定位蓝点实现呼吸灯功能

    还是先上个图吧: cluster.gif 说下实现的原理,首先这个定位小蓝点是由两张图片组成的,最底层的一张白色圆形图片以及上一层的蓝色圆形图片,只要不停的对蓝色图片进行透明度动画操作就可以实现这个效 ...

  4. 单片机实现LED呼吸灯功能

    ** 程序名: 两键控制亮度 编写人: 编写时间: 2017年12月15日 硬件支持: STC12C2052 内部RC或外部12MHZ晶振 接口说明: 8个LED彩灯接P1口,按键接P3.7和P3.3 ...

  5. android8 呼吸灯,红米note8pro呼吸灯颜色如何设置?

    红米note8pro支持呼吸灯功能,当有未读通知的时候,指示灯就会闪烁提醒.此外,我们还可以根据自己的喜好设置呼吸灯的颜色,下面为大家带来详细的设置教程. 红米note8pro怎么设置呼吸灯颜色 1. ...

  6. 为什么一些手机厂商要砍掉呼吸灯?

    一些手机厂商砍掉手机呼吸灯,我觉得主要原因就是呼吸灯这个功能可有可无,从用户的使用情况来看,呼吸灯功能的争议比较大,有些用户会认为手机非常有必要带呼吸灯功能,能够给日常使用手机的过程中带来便利,而有的 ...

  7. 基于FPGA的呼吸灯设计

    一:背景介绍: 网上类似的标题很多,有一些呼吸灯的设计是基于单片机的,还有一部分设计是基于FPGA的,我也一时手痒,将这两天自己重新写的verilog描述语句晒出来,免得压箱底放久了,出现发霉点. 为 ...

  8. 嵌入式STM32—第一天GPIO实现led呼吸灯

    1.软件及工程环境搭建 就不介绍了,可以直接用现成的 链接:https://pan.baidu.com/s/1GaSYpNm6yh-lZZmqRdXxvQ 提取码:dy63 相关库文件 链接:http ...

  9. 单片机开发—呼吸灯的三种实现方法

    目录 一.前言 1.什么是呼吸灯 2.如何实现呼吸灯 二.利用for循环实现呼吸灯 三.利用定时器实现呼吸灯 1.利用定时器中断实现 2.利用定时器输出PWM波实现 四.总结 一.前言 提示:本文使用 ...

最新文章

  1. QTP的那些事---通过html标签的属性获取对象(类似onclick的属性)
  2. 2017年10月05日普及组 约数
  3. scala学习手记28 - Execute Around模式
  4. 拖拽功能-jquery
  5. mfc color 亮度_双十一4K投影仪怎么选?小心别掉“亮度坑” - 电视
  6. J2EE实现发送邮件功能
  7. linux中断底半部机制
  8. UltraEdit(UE编辑器)常用快捷键一览
  9. div区域内容抓取_企业微信群机器人应用:使用python从网站抓取行业资讯并定时推送...
  10. Go语言实现并行分段求和计算
  11. lightgbm algorithm case of kaggle(下)
  12. CentOS桥接网卡配置
  13. matlab 噪声协方差矩阵,已知各个通道的信号的协方差矩阵(covariance matrix), 模拟各个通道的噪声信号...
  14. 如何把高版本unity资源导入Laya
  15. 【VBA研究】关于工作表单元格复制粘贴的语句
  16. MongoDB~从入门到入坑。
  17. byte最大值最小值的问题
  18. 通过GPU服务器运行Carla
  19. 变量存储重温及在Ubuntu系统和Keil中编程验证
  20. 视频拍摄技巧——构图

热门文章

  1. Advanced Archive Password Recovery下载
  2. 运放放大倍数计算公式_运算放大器基础1——用作比较器
  3. 3D 渲染的 5 种方式
  4. 使用crow E-R图描述数据库关系
  5. NetTerm共享文件
  6. Pygame 实作 GUI(01)Label
  7. python 创建画板_OpenCV +Python 制作画板
  8. 联通软研院2020年球季校招笔试第三题 20190916
  9. 笔试题33——双队列解决全排列拼接问题
  10. Vue使用WebUploader上传文件/压缩包