>>> 4.4.1 中断与事件驱动
无论采用哪种总线都使用时钟信号和数据/控制线,时钟信号由 MCU 主机进行控制。用于控制的信号线中的 SPI 为 4 根,除了具有传输的信号外,还具有片选信号,通过该信号的有效与否,主机指定哪个器件作为目标对象。
>>> 4.6.1 SPI 总线简介
在这里,以 LPC824 为例来介绍主机 SPI 的原理和应用设计。
-
SSEL:片选输入
当 SPI 作为主机时,则在串行数据启动前驱动 SSEL 信号,使之变为有效状态,并在串行数据发送后释放该信号,使之变为无效状态。默认 SSEL 为低电平有效,也可将其选为高电平有效。当 SPI 作为从机时,处于有效状态的任意 SSEL 信号都表示该从机正在被寻址。
-
MOSI :主机输出从机输入
MOSI 信号可将串行数据从主机传送到从机。当 SPI 作为主机时,则串行数据从 MOSI输出;当 SPI 作为从机时,则串行数据从 MOSI 输入。
-
MISO :主机输入从机输出
MISO 信号可将串行数据由从机传送到主机。当 SPI 作为主机时,则串行数据从 MISO输入;当 SPI 作为从机时,则串行数据输出至 MISO。
-
SCK:时钟信号
SCK 同步数据传送时钟信号。它由主机驱动从机接收,使用 SPI 接口时,则时钟可编程为高电平有效或低电平有效。
>>> 4.6.2 74HC595 接口
在同一时钟信号作用下,74HC595 实现数据的串行输入/并行输出转换。除了 8 个并行输出口之外,74HC595 还有 5 个输入控制口,其中的Q 7 ~ Q 0 端输出;同时将V CC ,从而保证 74HC595 处于永久选通状态。另外还有 3 个输入端:CP 时钟信号端、D 数据输入端与 STR 锁存信号,其分别连接 MCU 的 SCK、MOSI 与 SSEL,详见图 4.18。
图 4.18 74HC595 电路图
在 CP 时钟信号上升沿的作用下,保证将加载 D端的二进制数据依次送入 74HC595 中。当数据移位完成后,在 STR 上升沿的作用下,数据将一次性地在 Q 7 ~ Q 0 端输出,从而保证在移位的过程中,输出端的数据保持不变。
MiniPort-595 模块采用 74HC595 扩展 8 路 I/O,可以直接驱动 LED 显示模块,其对应AM824-Core 的 MiniPort 接口 J4 功能定义详见图 4.19(b)。MiniPort-595 模块输出信号引脚J2 功能定义详见图 4.19(c)。
图 4.19 595 模块实物与控制接口定义
假设要将 1000 0000 串行传送到 74HC595 的并行输出端 Q 7 ~ Q 0,此数据在时钟脉冲的作用下,从 Q 7 ~ Q 0逐位送到串行数据输入端 D。待 8 个时钟脉冲过后,10000000在Q 7 ~ Q 0并行输出。AMetal针对 74HC595 提供了相应的 hc595.h 接口,详见程序清单 4.44。
程序清单 4.44 hc595.h 接口
由此可见,在初始化 74HC595 相关的操作后调用 hc595_send_data(),则串行输入并行输出一个 8 位二进制数,74HC595 的输出管脚当作 8位 I/O 口使用。此前控制 8 个 LED 流水灯不得不使用 8 个 I/O 口,现在有了 74HC595,则可以节省的更多 I/O 口留作其它用途。
显然,只要将 AM824-Core 主机、MiniPort-595 模块的 MiniPort A(排针)与 MiniPort-LED 模块的 MiniPort B(排母)直接对插即可,其原理图详见图 4.20,模块的组合详见图 4.21(a),组合之后对应 MCU 的 MiniPort 接口 J4 端口功能定义详见图 4.21(b),MCU 通过 STR、CP和 D 这 3 个端口控制 74HC595 芯片驱动8 个 LED,详见程序清单 4.45。
图 4.20 8 路输出 I/O 扩展
图 4.21 模块组合实物与控制接口定义
程序清单 4.45 74HC595 通用接口范例程序
显然,同样可以用 74HC595 来驱动数码管的 8 个段,其原理图详见图 4.22。
将AM824-Core、MiniPort-595模块的MiniPort A(排针)与MiniPort-View模块的MiniPort B(排母)3 个模块直接对插即可,详见图 4.23(a),组合之后对应 MCU 的MiniPort接口J4功能定义详见图4.23 (b)。MCU 除了使用 STR、CP 和 D 端口控制74HC595,还需要使用 COM0 和 COM1控制数码管的位选。
图 4.23 模块组合实物与控制接口定义
其实使用 74HC595 与直接使用 I/O驱动数码管,唯一的不同是段码的输出方式不一样,因此仅需修改段码传送函数,并将实现代码添加到digitron1.c 中,详见程序清单 4.46。
程序清单 4.46 新增 74HC595 驱动数码管的相关函数
由于用户不会直接调用 digitron_hc595_segcode_set(),因此仅将 digitron_hc595_init()和digitron_hc595_disp_scan()添加到程序清单 4.47 所示的 digitron1.h 接口中。
程序清单 4.47 digitron1.h
当使用 74HC595 驱动数码管时,只要调用相关函数即可,详见程序清单 4.48。
程序清单 4.48 74HC595 驱动数码管实现秒计数器范例程序
4.7 I2C 总线
>>> 4.7.1 I2C 总线简介
I2C 总线(Inter Integrated Circuit)是 NXP 公司开发的用于连接微控制器与外围器件的两线制总线,不仅硬件电路非常简洁,而且还具有极强的复用性和可移植性。I2C 总线不仅适用于电路板内器件之间的通信,而且通过中继器还可以实现电路板与电路板之间长距离的信号传输,因此使用 I2C 器件非常容易构建系统级电子产品开发平台。其特点如下:
-
总线仅需 2 根信号线,减少了电路板的空间和芯片管脚的数量,降低了互连成本;
-
同一条 I2C 总线上可以挂接多个器件,器件之间按不同的编址区分,因此不需要任何附加的 I/O 或地址译码器;
-
非常容易实现 I2C 总线的自检功能,以便及时发现总线的异常情况;
-
总线电气兼容性好,I2C 总线规定器件之间以开漏 I/O 互连,因此只要选取适当的上拉电阻就能轻易实现 3V/5V 逻辑电平的兼容;
-
支持多种通信方式,一主多从是最常见的通信方式。此外还支持双主机通信、多主机通信与广播模式;
-
通信速率高,其标准传输速率为100Kbps (每秒100K位),在快速模式下为400Kbps,按照后来修订的版本,位速率可高达 3.4Mbps。
>>> 4.7.2 LM75B 接口
AM824-Core 选择与 LM75A 兼容的 LM75B 数字测温传感器,其关断模式下消耗的电流仅为 1μA。
1. 特性
LM75B 是 NXP 半导体推出的具有 I2C 接口的数字温度传感器芯片,其关键特性如下:
-
器件地址 1001xxx,同一总线上可以外扩 8 个器件;
-
供电范围:2.8~5.5V,温度范围:-55~125℃;
-
11 位 ADC 提供温度分辨率达 0.125℃;
-
精度:±2℃(-25~100℃),±3℃(-55~125℃)。
LM75B 的管脚排列详见图 4.24,从机地址为 0x90,A0~A2 分别为地址选择位 0~2,且必须在 SCL 串行时钟输入与 SDA 串行数据信号线上添加上拉电阻。当芯片过热时,则关断输出。
图 4.24 LM75B 管脚图
2. 应用电路
LM75B 典型应用电路详见图 4.25,R5 和 R6 是 I2C总线的上拉电阻。由于板载只有一片 LM75B,因此不用考虑芯片的地址问题,即可将芯片的 A0~A2 引脚直接接地。OS 为芯片的过热输出,可以外接继电器等器件实现独立温控器的功能。由于是通过 MCU 实现测温的,因此该引脚可以悬空。只要短接(J13_1、J13_2)与(J11_1、J11_2),则 SDA、SCL 分别与 PIO0_18、PIO0_16 相连。
图 4.25 LM75B 应用电路图
如图 4.26 所示为 AM824-Core 的加热电路,R32 的阻值为 20~50Ω(2W)。短接 J14_2与J14_3即可将焊接在LM75B附近的加热电阻R32与KEY相连,当 KEY 键按下时,则 R32 开始发热,此时电阻上产生的热量会通过较粗的导线传导到 LM75B 的下面,于是LM75B 也会跟着热起来。如果电阻越小,则通过的电流越大,产生的热量也就越大。当按键按下时电路导通,这时可以通过测温电路观察温度上升情况。
图 4.26 加热电路
3. 温度测量
针对 LM75B,AMetal 提供了相应的软件包,其函数原型为:
显然,使用这两个通用接口,很容易读取当前的温度值。由于只有两位数码管,因此只显示整数部分;当温度为负数时,也不显示负,仅显示温度值,详见程序清单 4.49。
程序清单 4.49 LM75 温度读取和显示范例程序
将程序编译后下载到开发板上运行,如果数码管显示 28,表示当前温度为 28℃。如果按下加热按键,则低阻值加热电阻 R32 开始发热,那么显示的温度值会不断升高。
在显示温度值时,之所以将温度值右移了 8 位,这是因为 lm75_read()读取的数值是实际温度的 256 倍,所以实际温度应该是读取的值除以 256.0。同时,由于不需要显示小数部分,所以直接右移 8 位,就表示除以了 256,只剩下了整数部分。
>>> 4.7.3 温控器
下面将结合此前编写的程序,使用 LED、蜂鸣器、数码管、矩阵键盘和温度采集,实现一个简易的温控器。
1. 功能简介
使用标准I2C接口LM75B温度传感器采集温度在数码管上显示,由于只有两位数码管,因此只显示整数部分;当温度为负数时,也不显示负,仅显示温度值。
可设置温度上限值和温度下限值,当温度高于上限值或低于下限值时,则蜂鸣器鸣叫。
2. 状态指示
在调节过程中,使用两个 LED 用于状态指示,用短路跳线器连接 J9 和 J10 即可。
-
LED0 亮:表明当前值为上限值,数码管显示上限值;
-
LED1 亮:表明当前值为下限值,数码管显示下限值;
-
两灯闪烁:表明正常运行状态,数码管显示环境温度值。
3. 操作说明
设置上下限值时,共计使用 4 个按键。即:
-
SET 键:用于进入设置状态。点击后首先进入温度上限值设定,再次点击可进入温度下限值设定,再次点击回到正常运行状态;
-
左移/右移键:用于切换当前调节的位(个位/十位)。当进入设置状态后,当前调节的位会不断的闪烁;点击该键可以切换当前调节的位,由个位切换到十位,或由十位切换到个位;
-
加 1 键:当进入设置状态后,当前调节的位会不断的闪烁,按该键可以使该位上的数值增加 1;
-
减 1 键:当进入设置状态后,当前调节的位会不断的闪烁,按该键可以使该位上的数值增减 1。
(1)设置上限值
首次按下 SET 键进入上限值设置,此时 LED0 点亮,数码管显示上限值温度,个位不停闪烁。按“加 1 键”或“减 1 键”可以对当前闪烁位上得值进行调整,按下“左移/右移键”可以切换当前调节的位。
(2)设置下限值
在设置上限值的基础上,再次点击 SET 键即可进入下限值的设定,此时 LED1 点亮,数码管显示下限值温度,个位不停闪烁。按“加 1 键”或“减 1 键”可以对当前闪烁位上的值进行调整,按“左移/右移键”可以切换当前调节的位。
4. 功能实现
如程序清单 4.50 所示为温控器的范例程序,程序中比较繁琐的是按键的处理程序。为了使程序结构更加清晰,分别对 3 种按键:切换状态(KEY0)、切换当前调节位(KEY2)、调节当前位的值(KEY1 和 KEY3)写了 3 个函数,各个函数直接在 key_process()按键处理程序中调用。其它部分均在 while(1)主循环中完成,主要完成 3 件事情:温度值的采集,每隔 500ms 进行一次;键盘扫描,每隔 10ms 进行一次;数码管扫描,每隔 5ms 进行一次。
程序清单 4.50 综合实验范例程序
-
SPI总线
+关注
关注
4文章
103浏览量
27586 -
IIC总线
+关注
关注
1文章
66浏览量
20298 -
接口编程
+关注
关注
0文章
9浏览量
8733
原文标题:周立功:面向接口的编程——SPI 总线和IIC 总线
文章出处:【微信号:ZLG_zhiyuan,微信公众号:ZLG致远电子】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
评论