hph9 9yn9 77fl 7doq 9dcr yokm 1jrn j399 h513 dw40

在LED通用接口的设计中,HC595主要作用

周立功单片机 ? 2019-02-16 08:34 ? 次阅读
标签:悄然无声 824e 真人线上开户

周立功教授新书《面向AMetal框架与接口的编程(上)》,对AMetal框架进行了详细介绍,通过阅读这本书,你可以学到高度复用的软件设计原则和面向接口编程的开发思想,聚焦自己的“核心域”,改变自己的编程思维,实现企业和个人的共同进步。

第八章为深入理解AMetal,本文内容为8.2 HC595 接口。

8.2 HC595 接口

HC595 是一种“串转并”的外围器件,可以通过GPIO 控制数据引脚和时钟引脚实现数据的输出。但在一些具有SPI 外设的MCU 中,往往使用SPI 控制HC595 输出,使驱动程序更简洁。为了屏蔽底层数据输出方式的差异性,可以按照LED 通用接口的设计方法为HC595定义相关接口。

>>> 8.2.1 定义接口

1. 接口命名

由于操作的对象是HC595,因此接口命名以“am_hc595_”作为前缀。HC595 基本的操作是输出并行数据,其相应的接口名为:

  • am_hc595_send

特别地,HC595 的输出为三态输出,其由OE 引脚控制,因此可以定义相应接口使能输出(正常输出数据)或禁能输出(高阻状态)。其相应的的接口名为:

  • am_hc595_enable

  • am_hc595_disable

2. 接口参数

在LED 通用接口的设计中,通常可能存在多个LED,因而使用了唯一ID 号led_id 对多个LED 进行区分。按照这种逻辑,是否也需要使用hc595_id 来区分不同的HC595 呢?

在LED 通用接口中,使用了ID 号区分不同的LED,这就要求在接口实现中完成led_id到对应LED 设备之间的转换,即通过ID 号搜索到对应的LED 设备。显然,随着LED 设备的增加,搜索耗时也将增加。使用ID 号区分不同的LED,虽然简洁易懂,但效率不高。

对于操作LED 而言,通常都是秒级的,不会以极快的速率操作LED。如果LED 变化太快,则肉眼无法观察相应的现象是没有意义的。因此搜索耗时的影响对于LED 来说,可以忽略不计。虽然HC595 输出控制的具体器件是不确定的,但作为通用输出器件,其输出的效率应该尽可能高,不要因为驱动实现的策略而影响了输出效率,比如,常见的GPIO 能够以MHz 的速率输出,这种变化是us 级别的,显然此时搜索耗时会对输出效率产生一定的影响。

为了达到快速输出的目的,最好不存在任何搜索过程,直接操作相应的HC595 对象实现输出。在这种情况下,使用指向对象的指针就是很好的解决办法,只要具有指向对象的指针,就可以直接使用对象提供的方法。

显然使用指向对象的指针,只是为了提高接口实现的效率,与用户并无直接关系。对于用户来说,其无需关心这个指针的具体类型。为了对用户屏蔽“指针”的概念,可以为该指针单独定义一个类型,这就是本书中常常提及的“句柄”概念。由于现在还不清楚HC595对象的指针类型,可以先定义一个无类型的指针类型作为句柄类型。比如:

该类型的句柄本质上是指向HC595 对象的指针,其本身就代表了系统中确定的一个HC595 对象。基于此,所有接口均使用该类型作为第一个参数,即:

  • am_hc595_enable (am_hc595_handle_t handle);

  • am_hc595_disable (am_hc595_handle_t handle);

  • am_hc595_send (am_hc595_handle_t handle);

特别地,对于am_hc595_send(),还需要使用参数指定发送的数据,往往使用一个指向数据首地址的指针和数据的字节数表示一段数据。即可为am_hc595_send()新增两个参数:

  • am_hc595_send (am_hc595_handle_t handle, const void *p_data, size_t nbytes) ;

其中,p_data 指向了数据的首地址,使用void *类型,使其可以指向任意数据类型的首地址,使用const修饰符,表明本接口仅用于发送数据,不会改变数据内容;nbytes 指定了发送数据的字节数,若只有单个HC595,则输出是单个字节(8 位),若有多个HC595 级联,则输出是n 个字节(n 为HC595 的个数,共计8×n 位)。

实际中,单个HC595 只能输出8位数据,为了输出更多位数的数据,可以使用级联的方式将多个HC595级联起来。因此,这里的HC595“句柄”代表的HC595 设备可能包含多个级联的HC595,以实现多位数据的输出。

3. 返回值

接口无特殊说明,直接将所有接口的返回值定义为int 类型的标准错误号。基于此,HC595 接口的完整定义详见表8.4。其对应的类图详见图8.5。

表8.4 HC595 通用接口(am_hc595.h)

图8.5 HC595 对应的类图

特别注意,当前接口中的am_hc595_handle_t 类型为void *类型,最终,其需要是指向对象的指针类型。随着后文对接口实现的介绍,会定义相应的设备类型,到时再更新具体的定义。

>>> 8.2.2 实现接口

1. 抽象的HC595 设备类

与LED 通用接口的实现类似,为了屏蔽底层实现的差异性,可以将一些与底层硬件相关的功能进行抽象,根据三个接口,可以定义相应的三个抽象方法,并将其存放在一个虚函数表中。即:

类似地,将抽象方法和p_cookie 定义在一起,即为抽象的HC595 设备。比如:

显然,具体的HC595 设备直接从抽象的HC595 设备派生,然后由具体的HC595 设备根据实际的硬件,实现3 个抽象方法。

与抽象LED 设备的定义相比可以发现,这里定义抽象设备的方法和抽象LED 设备定义的方法是完全一致的,可以将这种方法作为定义一种抽象设备的模板,即:首先,根据接口的定义,整理需要具体设备实现那些功能,然后将这些功能一一抽象为方法,并将它们存放在一个虚函数表中,这些抽象方法的第一个参数均为p_cookie。最后,将虚函数表和p_cookie整合在一个新的结构体中,该结构体类型即为抽象设备类型。伪代码详见程序清单8.18。

程序清单8.18 抽象设备定义的一般方法

伪代码中,[name]表示当前模块的具体名字,如led。当然,如果需要,可以在抽象筹备中添加其它需要的成员,如LED 设备中,使用链表管理多个LED 设备,因此还具有p_next指针成员。

在HC595 接口中,使用了handle 作为第一个参数,其本质上是指向设备的指针,由于所有具体设备的都是从抽象的HC595 设备派生的,因此,handle 的类型可以定义为:

如此一来,所有接口的实现都可以直接调用抽象方法实现,而抽象方法的具体实现是由具体的HC595 设备完成的。各HC595 接口的实现详见程序清单8.19。

程序清单8.19 HC595 接口实现

由于handle 是直接指向设备的指针,可以通过handle 直接找到相应的方法,因此,在整个接口的实现过程中,没有任何查询搜索的过程,效率较高。除此之外,当handle 直接指向设备后,也就无需再集中对各个HC595 设备进行管理,如LED 设备,由于存在查询搜索过程,因此不得不使用单向链表将系统中的各个LED 设备链起来,便于查找。

在接口实现中,没有与硬件相关的实现代码,仅仅是简单的调用了抽象方法。抽象方法需要由具体的HC595 设备来完成。由于各个接口的实现非常简单,往往将其实现直接以内联函数的形式存放在.h 文件中。

为便于查阅,如程序清单8.20 所示展示了抽象HC59 设备接口文件(am_hc595.h)的内容。其对应的类图详见图8.6。

程序清单8.20 am_hc595.h 文件内容

图8.6 抽象的HC595 设备类

程序中,am_static_inline 是内联函数的标识,其在am_types.h 文件中定义,定义的实际内容与编译器相关,如使用GCC 编译器,则其定义如下:

由于在不同编译器中,内联函数的标识不尽相同,为了使用户使用统一的标识,AMetal统一将内联标识符定义为了am_static_inline,使得用户在任何编译器中均可使用该标识作为内联标识,无需关心与编译器相关的细节问题。

2. 具体的HC595 设备类

以使用SPI 控制HC595 输出数据为例,简述具体HC595 设备的实现方法。首先应该基于抽象设备类派生一个具体的设备类,其类图详见图8.7,

图8.7 具体的HC595 设备类

可直接定义具体的HC595 设备类:

am_hc595_spi_dev_t 即为具体的HC595 设备类。具有该类型后,即可使用该类型定义一个具体的HC595 设备实例:

在使用SPI 控制HC595 时,需要知道HC595 相关的信息,如锁存引脚、输出使能引脚、SPI 时钟频率等信息。

特别地,当SPI 输出数据时,可以指定数据输出时的位顺序:最高位先输出或最低位先输出。最先输出的位决定了HC595 输出端Q7 的电平,最后输出的位决定了HC595 输出端Q0 的电平。显然,位的输出顺序直接影响了HC595 的输出,因此,具体输出顺序应该是由用户来决定的。

基于此,将需要由用户提供的设备相关信息存放到一个新的设备信息结构体类型中:

若使用MiniPort-595,其与AM824-Core 联合使用时,则其对应的设备实例信息可以定义如下:

同理,在设备类中需要维持一个指向设备信息的指针。此外,由于使用SPI 控制HC595时,HC595 相当于是一个SPI 从设备,为了使用SPI 接口与之通信,需要为HC595 定义一个与之对应的SPI 从设备,新增两个成员,完整的HC595 设备定义即为:

显然,在使用SPI 控制HC595 前,需要完成设备中各成员的赋值,这些工作通常在驱动的初始化函数中完成,定义初始化函数的原型为:

其中:

  • p_dev 为指向am_hc595_spi_dev_t 类型实例的指针;

  • p_info 为指向am_hc595_spi_info_t 类型实例信息的指针;

  • handle 为SPI 句柄,便于使用SPI 输出数据,初始化函数的返回值即为HC595 句柄。基于前面定义的设备实例和实例信息,其调用形式如下:

返回值即为HC595 实例的句柄,可以作为HC595 通用接口的第一个参数(handle)的实参。初始化函数的实现范例详见程序清单8.21。

程序清单8.21 初始化函数实现范例(SPI 控制HC595)

程序中,首先建立了标准的SPI 从设备,便于后续使用SPI 接口发送数据,然后初始化了p_info 成员,接着完成了抽象HC595 设备中p_funcs 和p_cookie 的赋值,最后,返回设备地址作为用户操作HC595 的句柄。其中,pfuncs 赋值为了&__g_hc595_spi_drv_funcs,其中包含了3 个抽象方法的具体实现,完整定义详见程序清单8.22。

程序清单8.22 抽象方法的实现(SPI 控制HC595)

由此可见,使用GPIO 接口am_gpio_set()控制OE 引脚的输出电平实现了HC595 的使能和禁能函数,使用SPI 接口函数am_spi_write_then_write()实现了发送数据函数。

为了便于查阅,如程序清单8.23 所示展示了具体HC595 设备接口文件(am_hc595_spi.h)的内容。

程序清单8.23 am_hc595_spi.h 文件内容

周立功单片机 技术专区

原文标题:周立功:深入理解AMetal——HC595 接口

文章出处:【微信号:Zlgmcu7890,微信公众号:周立功单片机】欢迎添加关注!文章转载请注明出处。

关注电子发烧友微信

有趣有料的资讯及技术干货

下载发烧友APP

打造属于您的人脉电子圈

关注发烧友课堂

锁定最新课程活动及技术直播
收藏 人收藏
分享:

评论

相关推荐

蓝牙Meshled灯控方案详解

蓝牙技术受益于其智能、低功耗、高连接速度等特性,在物联网市场呈现爆发式增长是物联网工程师有目共睹的。....

的头像 无线模块 发表于 01-26 07:07 ? 次阅读 ? 0条评论
蓝牙Meshled灯控方案详解

居民楼道声控电路图(六款声控电路原理图详解)

本文主要介绍了居民楼道声控电路图(六款声控电路原理图详解)。LED声控灯集声控、光控、智能延时控制于....

发表于 01-25 15:49 ? 次阅读 ? 0条评论
居民楼道声控电路图(六款声控电路原理图详解)

铟含量的局限性导致氮化镓铟无法激发出红光和黄绿光

该研究指出,科学家为挑战铟含量极限,于是在氮化镓(GaN)上生长氮化铟(InN)单原子层,不过实验结....

的头像 CNLED网 发表于 01-25 15:07 ? 次阅读 ? 0条评论
铟含量的局限性导致氮化镓铟无法激发出红光和黄绿光

常见led驱动电源电路设计大全(十款电路设计原理图详解)

本文主要介绍了常见led驱动电源电路设计大全(十款电路设计原理图详解)。led驱动电源是把电源供应转....

发表于 01-25 10:13 ? 次阅读 ? 0条评论
常见led驱动电源电路设计大全(十款电路设计原理图详解)

自制12vled灯电路图(五款设计电路图分享)

本文主要介绍了自制12vled灯电路图(多款)。节能灯灯管坏了,能否用发光二极管(LED)代替,因为....

发表于 01-25 09:16 ? 次阅读 ? 0条评论
自制12vled灯电路图(五款设计电路图分享)

如何使用RTC实时时钟进行应用场景开发

虽然该程序的逻辑与程序清单6.70 所示的应用程序基本一致,但由于使用的接口是特殊功能控制接口,与具....

的头像 周立功单片机 发表于 01-25 09:15 ? 次阅读 ? 0条评论
如何使用RTC实时时钟进行应用场景开发

13.56MHz读写卡模块通信接口及选型指南

论选择I2C 或UART 通信方式,只要基于实例句柄编程,则应用程序与具体的通信方式无关。

的头像 周立功单片机 发表于 01-25 09:09 ? 次阅读 ? 0条评论
13.56MHz读写卡模块通信接口及选型指南

2种LED技术革新,带来更高效的发光效率

LED技术为世界带来巨大改变,除了显示用背光源还有LED照明的应用,而LED 技术也不断在革新,带来....

的头像 CNLED网 发表于 01-24 14:44 ? 次阅读 ? 0条评论
2种LED技术革新,带来更高效的发光效率

照明能够影响人的情绪、健康和能量 所以需考量到光谱分布和色温条件

人因照明 ( Humans Factor In Lighting ),也可以称为舒适照明,是指光照随....

的头像 每日LED 发表于 01-24 14:40 ? 次阅读 ? 0条评论
照明能够影响人的情绪、健康和能量 所以需考量到光谱分布和色温条件

国内led行业渠道企业形势已明朗

纵观2017全年,国内渠道三分天下的局面越发明显。一是以显示屏企业为主的,如洲明、利亚德等。二是以渠....

的头像 华强LED网 发表于 01-24 09:54 ? 次阅读 ? 0条评论
国内led行业渠道企业形势已明朗

G20会议成员企业“聚会”各领域企业工作协调

2017年度G20-LED照明峰会第2次CEO会议(以下简称“G20会议”)于2019-02-16....

的头像 高工LED 发表于 01-24 09:46 ? 次阅读 ? 0条评论
G20会议成员企业“聚会”各领域企业工作协调

GE照明或将转型智能照明方向发展

GE照明可以说是整个照明行业的先驱,但通用电气这家125年依靠照明起家的企业在2017年却频频出售业....

的头像 高工LED 发表于 01-24 09:24 ? 次阅读 ? 0条评论
GE照明或将转型智能照明方向发展

led灭蚊灯电路图(八款灭蚊灯电路图分析)

灭蚊灯是不需要采用任何化学灭蚊物质的灭蚊设备,是吸收国外先进技术再进行多项技术改良的新一代高效环保捕....

发表于 01-23 16:42 ? 次阅读 ? 0条评论
led灭蚊灯电路图(八款灭蚊灯电路图分析)

万用表如何测量led灯好坏

随着电子科技的发展,日常照明跟上时势,加入了电子科技,为了节能,灯管也使用了LED(发光二极管),使....

发表于 01-23 16:24 ? 次阅读 ? 0条评论
万用表如何测量led灯好坏

LED驱动电源PFC电路的设计

LED驱动电源是把电源供应转换为特定的电压电流以驱动LED发光的电源转换器,通常情况下:LED驱动电....

发表于 01-23 15:09 ? 次阅读 ? 0条评论
LED驱动电源PFC电路的设计

深度解析焦耳小偷电路

焦耳小偷电路是一个简约的自激振荡升压电路,只需三个元件:三极管、电阻、电感即可实现。它可以榨干一节废....

的头像 面包板社区 发表于 01-23 12:43 ? 次阅读 ? 0条评论
深度解析焦耳小偷电路

2020年低碳产业将突破10万亿,以及路灯实施节能改造对社会的影响

1月5日,国务院对外发布《“十三五”节能减排综合工作方案》,明确了“十三五”节能减排工作的主要目标和....

的头像 高工LED 发表于 01-23 10:18 ? 次阅读 ? 0条评论
2020年低碳产业将突破10万亿,以及路灯实施节能改造对社会的影响

浅谈2018年led产业的十三个期待

2018,是走进新时代的第一年,对整个照明界来说,是不辱使命奋起的一年,也是撸起袖子加油干的一年。

的头像 广明源照明 发表于 01-23 10:13 ? 次阅读 ? 0条评论
浅谈2018年led产业的十三个期待

LED产业现状以及分享吃掉企业利润的六种黑洞

LED产业正处于稳健发展期,目前全球LED产业可以分为四大地区。一是欧美地区,以通用照明为主攻方向,....

的头像 每日LED 发表于 01-23 10:09 ? 次阅读 ? 0条评论
LED产业现状以及分享吃掉企业利润的六种黑洞

基于智慧城市中的LED的妙用解析

一种嵌入路面的新型LED灯交通系统已在伦敦投入试用,可以侦测行人和其他车辆,并根据路况实时变化路面灯....

的头像 CNLED网 发表于 01-22 17:26 ? 次阅读 ? 0条评论
基于智慧城市中的LED的妙用解析