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

周立功单片机 2018-01-17 08:34 次阅读

周立功教授新书《面向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

打造属于您的人脉电子圈

关注发烧友课堂

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

评论

相关推荐

Panasonic投入大陆智能农业 应用LED于蔬菜光源调整

Panasonic在苏州的子公司,虽以电子零组件的制造装置为主业,但自2016年起便试营运蔬菜工厂。....

发表于 02-13 09:18 次阅读 0条评论
Panasonic投入大陆智能农业 应用LED于蔬菜光源调整

2017LED产业发展回顾及2018LED市场走势分析

技术是推动LED产业迅猛发展的强大驱动力,也是企业阔步登上世界舞台的底气和硬气。在市场经济竞争日趋激....

的头像 村田中文技术社区 发表于 02-11 10:41 次阅读 0条评论
2017LED产业发展回顾及2018LED市场走势分析

基于PLC技术的LED微波真空干燥灭菌机设计

产生微波的设备是磁控管。通过PLC控制中间固态继电器来驱动升压变压器,电压约为6000V。磁控管是一....

发表于 02-10 09:24 次阅读 0条评论
基于PLC技术的LED微波真空干燥灭菌机设计

2017年LED产业发展回顾与前瞻

2017年LED产业发展回顾与前瞻。

的头像 华强LED网 发表于 02-09 16:22 次阅读 0条评论
2017年LED产业发展回顾与前瞻

LED可见光通信室内定位商用开启LED智慧应用新天地

室内定位将人与物、物与物联系在一起,未来的智能制造、智慧城市、智慧建筑等,都将依赖高精度的室内定位能....

的头像 广明源照明 发表于 02-09 14:56 次阅读 0条评论
LED可见光通信室内定位商用开启LED智慧应用新天地

共阴共阳的疑问解答以及8*8LED点阵基础知识讲解

有的点阵后面标有第一脚,但是有的没有标,现在大家默认跟IC的管脚顺序一样,读法是第1脚一般在侧面有字....

的头像 电子工程专辑 发表于 02-09 14:15 次阅读 0条评论
共阴共阳的疑问解答以及8*8LED点阵基础知识讲解

12月中国LED照明出口景气指数达到2017年最优状态

12月中国LED照明出口景气指数为52.9,处于景气区间,较上月增长1个点,LED照明出口景气度达到....

的头像 高工LED 发表于 02-11 09:40 次阅读 0条评论
12月中国LED照明出口景气指数达到2017年最优状态

采用SoC驱动器提高汽车LED前照灯高亮度的方法

LED相较于氙气灯及卤素灯等传统车灯具有低能耗及高能效的优势,这对汽车工程师而言,可减少CO2排放及....

发表于 02-08 20:31 次阅读 0条评论
采用SoC驱动器提高汽车LED前照灯高亮度的方法

组建RS-485总线网络时,终端电阻实战案例

RS-485总线具有结构简单、成本低等优点,但各位工程师在组建RS-485总线网络时,为提升整个网络....

的头像 周立功单片机 发表于 02-08 09:51 次阅读 0条评论
组建RS-485总线网络时,终端电阻实战案例

木林森:合纵联横战略初显 1000亿级航母企业起航

“LED行业的价格屠夫和竞争规则破坏者。” 木林森 的发展一直受到各界关注,甚至时不时传出质疑声。而....

发表于 02-08 07:08 次阅读 0条评论
木林森:合纵联横战略初显 1000亿级航母企业起航

PWM控制LED灯的亮度程序(C 语言)

控制LED灯的亮度,通过调节电压的方式可以达到,但不理想,而且可调的范围很小,电压稍高,还容易把LE....

发表于 02-07 16:45 次阅读 0条评论
PWM控制LED灯的亮度程序(C 语言)

基于脉宽调制PWM控制抑制可调光LED EMI的方法

LED的亮度变化,我们是通过对LED的电流进行脉宽调制(PWM)控制;所产生的脉冲电流波形便是产生E....

发表于 02-07 16:22 次阅读 0条评论
基于脉宽调制PWM控制抑制可调光LED EMI的方法

STM32的GPIO输出编程实例之点亮三色LED

本实验通过STM32的三个GPIO口驱动三色LED的三个通道,将GPIO设置为推挽输出模式,采用灌电....

的头像 畅学单片机 发表于 02-07 11:14 次阅读 0条评论
STM32的GPIO输出编程实例之点亮三色LED

新型OFHR探测系统准确检测胎心率设计

胎心率(FHR)检测是一种用于胎儿出生前判断胎儿健康状况,并帮助识别胎儿缺氧或受压迫等潜在危险的主要....

的头像 社区化 发表于 02-14 20:40 次阅读 0条评论
新型OFHR探测系统准确检测胎心率设计

Li-Fi的含义、与Wi-Fi的不同以及其优势

Li-Fi,英文全称Light Fidelity,中文译名“可见光无线通信”,又被称为光保真技术,最....

的头像 中科院长春光机所 发表于 02-06 18:26 次阅读 0条评论
Li-Fi的含义、与Wi-Fi的不同以及其优势

美国大学正在试用集成了应急按钮的户外照明灯,以提高在校学生的安全

这些智能街道照明路灯里面包含了所谓的“应急按钮”,直接连接到学校的现场安保。这些按钮一旦按下,现场急....

的头像 CNLED网 发表于 02-06 17:17 次阅读 0条评论
美国大学正在试用集成了应急按钮的户外照明灯,以提高在校学生的安全

三星电子与三安光电签MicroLED供应协议 建立长期的商业合作关系

2月5日,三安光电发布公告称,本公司全资子公司厦门三安光电有限公司(以下简称“厦门三安”)于2018....

的头像 扩展触控快讯 发表于 02-06 17:01 次阅读 0条评论
三星电子与三安光电签MicroLED供应协议 建立长期的商业合作关系

介绍隐形照明设计及其对周围环境的影响

今天,在办公室外部、停车场和行车道,都有一个共同的、可能很难找到的元素:隐形的照明。这是因为隐形的照....

的头像 CNLED网 发表于 02-06 14:31 次阅读 0条评论
介绍隐形照明设计及其对周围环境的影响

介绍LED技术的优点,以及为什么能在户外照明中迅速发展

LED技术正在引领照明行业的发展,提高性能、最大限度地提高能源效率、降低长期成本。今天,它几乎照亮了....

的头像 CNLED网 发表于 02-05 14:32 次阅读 0条评论
介绍LED技术的优点,以及为什么能在户外照明中迅速发展

英国LED批发商推出超薄红外线面板加热器 能节省能源并取代传统供暖系统

英国LED批发商Mirrorstone Lighting公司展示了一种新型的红外面板加热器,能够节省....

的头像 CNLED网 发表于 02-05 14:28 次阅读 0条评论
英国LED批发商推出超薄红外线面板加热器 能节省能源并取代传统供暖系统