基于状态机的IIC驱动算法及其应用
2020-12-24郑安迪林伟敏富雅琼
郑安迪 林伟敏 富雅琼
摘 要:IIC总线设计自其诞生以来,由于其结构简单、连线少,被广泛运用于设备间的通信。针对现有的IIC驱动算法存在程序结构上的不足,无法胜任一些对时间控制精度较高的多任务工作的现状,该文设计了基于状态机原理的IIC驱动算法,该算法利用状态转换实现前台接收、后台处理,提高软件运行效率,完成IIC通信,且不影响系统别的程式的运行。
关键词:状态机 IIC通信 驱动算法 分时操作
中图分类号:TP336 文献标识码:A 文章编号:1672-3791(2020)07(c)-0001-04
IIC Driving Algorithm Based on State Machine and Its Application
ZHENG Andi LIN Weimin FU Yaqiong
(College of Mechanical and Electrical Engineering, China Jiliang University, Hangzhou, Zhejiang Province, 310018 China)
Abstract: The IIC bus design, due to its simple structure and few connections, is widely used in the communication between devices since it was invented. The existing IIC driver algorithm has the deficiency of program structure, which is not competent for some multi-task work with high precision of time control. In this paper, we design the IIC driver algorithm which is based on state machines. This driver algorithm uses state transition to realize receiving frontend and processing background, this can improve the efficiency of the software, to complete IIC communication. It does not affect other programs in the system.
Key Words: State machine; IIC communication; Driving algorithm; Time-sharing operation
IIC是由飞利浦公司在1980年代为了使设备能够连接低速周边设备而发展出的一种串行通信总线。由于其结构简单、连线少,简化了硬件电路方面的设计,所以很多设备都采用该通信方式。软件模拟IIC因为其可移植能力强,配置方便,使用过程简单,在很多单片机程序设计中都用了软件模拟IIC的编写思路。因此,在不具备硬件IIC的单片机,一般采用软件模拟IIC方法。目前常用的模拟IIC采用查询式程序结构,其无法胜任一些对时间控制精确度较高的多任务工作。为了提高软件模拟IIC的工作效率,该文设计了一种基于状态机的IIC驱动算法。该文设计的基于状态机的IIC驱动算法,通过状态机状态的改变运行相应的步骤程序,达到非占用式的多任务穿插运行,从而提高了效率,对于测量仪器和对时间要求高的任务尤其有效。
1 算法设计
1.1 总体思路
IIC驱动算法由发送指令和接收指令两个部分构成。
接收程序分前后台,接收字符的(中斷)服务程序为前台程序,处理主程序为后台程序。前台接收字符并存入缓冲区,后台从缓冲区读取字符并进行处理。前台程序通过读取和改变状态机状态来控制IIC通信,以达到完整的IIC接收部分。
发送部分中程序也分前后台,发送字符的(中断)服务程序为前台程序,处理主程序为后台程序。后台程序将要发送的字符存入缓存区,前台从缓冲区读取字符并发送出去。
整个主程序采用时间片结构,每隔一段时间进入后台程序进行任务处理,前台程序主要由中断触发。该结构确保将空闲时间释放给其他任务程序,以达到高效利用系统资源运行的目的。
1.2 前台程序
在接收指令的前台程序中,根据IIC通信协议,主机需先检测总线状态。如果总线空闲则产生START信号掌管总线,然后传送7位地址加1位读写位(读写位为0表示写),并等待从机检测到发送的地址与自己的地址相匹配并反馈一个应答信号(ACK)。从机如检测到发送地址与自己相匹配,则反馈应答信号(ACK),主机收到后会紧接着发送下一个START状态,然后重复第一个地址字节并将读写位变为1,表示读取;主机释放数据总线,开始接收数据字节,主机接收每个数据字节后发送应答信号(ACK)表示继续发送,无应答(NACK)表示传输数据结束。
发送指令的首字节与接收情况相同,主机首先要检测总线状态,如果总线空闲则产生START信号掌管总线,然后传送器件7位地址加1位读写位(读写位为0表示写)。等待从机检测到发送的地址与自己的地址相匹配并反馈一个应答信号(ACK),区别是从机应答后主机继续发送字节数据,如果从机发送无应答(NACK)则表示数据传输结束。主机发送完全部数据后,会发送一个停止位STOP,结束整个通信并且释放总线。
基于状态机的IIC驱动算法因此将IIC前台程序分为空状态、START信号发送、地址发送、等待应答、发送数据、接收数据、发送应答信号、STOP状态。在每一部分进行完之后,通过改变状态变量,在下一次进入前台处理程序中,通过判断状态量来进入相应的程序部分,以达到完成IIC通信的效果。
1.3 后台程序
IIC后台程序也分为几个状态,以期完成各项功能。在具体的功能中,首先判断总线是否繁忙。若总线为空闲状态,可启动相应的读或写的IIC任务,具体的任务设计可根据整套系统应用需求来设计,将任务交给前台程序处理即可,即改变前台状态。接收到相应数据后就可进行数据处理,完成后台程序数据处理的任务。
2 算法应用
2.1 SHT20温湿度传感器介绍
SHT20是一款集成测量湿度和温度为一体的传感器,支持标准的IIC格式,采用数字输出,优异的长期工作的稳定性。SHT20的分辨率可通过输入命令进行改变,可选的分辨率有8/12bit乃至12/14bit的RH湿度/T温度。
2.2 基于状态机的SHT20通信程序
基于IIC状态机的SHT20通 程序,前台程序按照状态相应的IIC通信协议完成其中的发送,接收程序部分的相应状态编写,并在每次状态结束后更新状态变量至新的状态,使程序能在运行时达到转换状态的效果。后台程序根据程序需求编写,将目标任务、测量温度、测量湿度、修正数值分成几块状态进行编写,在每块任务中向前台程序发送指定命令,并更新状态变量转换相应的下一个状态。主程序采用时间片结构,每隔一段时间(通常这段时间是极短的)执行前台程序和后台程序,完成相应的IIC通信和前后台程序的状态转换。
2.3 程序分析
前台程序编写根据IIC协议完成各个状态的编写,严格按照IIC时序来进行状态转换编写;后台程序也将温湿度传感器的测量任务主要分为若干个状态部分,温度与湿度测量同理,以温度测量为例,分为启动测量温度、等待测量温度、读取测量温度、等待读取测量温度、温度值修正5个部分,通过状态变量改变将5个部分串联起来。启动测量温度这个状态部分中是向前台程序发送了IIC发送指令,将温湿度传感器SHT20的地址和所要测得的量以及读写位写入了发送缓冲区,且改变了前台程序的状态,此时后台程序状态同時转变,进入等待测量温度。在下一次进入前台程序时,会判定状态变量的状态,确定进行IIC通信。后台等待测量温度结束后会自动改变状态进入读取测量温度的状态,读取测量温度的状态这个状态部分中是向前台程序发送了IIC接收指令,确定了温湿度传感器SHT20的地址和所要测得的量以及读写位,以及读取的字节个数,且改变了前台程序的状态,此时后台程序状态同时改变,进入等待读取测量温度。在下一次进入前台程序时,会判定状态变量的状态,确定进行IIC通信。后台等待读取测量温度结束后会自动改变状态进入温度值修正的状态。在后台程序温度值修正的状态下,后台程序从接收缓冲区中读取数据后进行相应的修正处理。至此,整个测量温度的过程结束。整个系统采用时间片的程序结构,在整个主程序中以20μs的间隔进入一次前台程序,以1ms的间隔进入一次后台程序,既可以保证温湿度测量任务、IIC通信正常进行,且不会因为采用软件延时过多地占用系统资源,同时系统还能以相同时间片结构的方式加入其他传感器测量或者其他任务,相互之间能够不受影响,且只需要一个前台程序即可,后台程序只需要在进入需要IIC通信时的状态时先判定总线是否繁忙即可。
相比之下,若用普通的软件IIC程序,的确简单易懂,操作简单,容易上手,且易于在不同型号的单片机上移植程序。但不适用于任务数量较多,对采集频率有较高要求的工程;基于状态机的IIC驱动算法可以适用于需要高频次、复杂的IIC通信的任务,如温湿度数据的采集,传感器数据发送回主机,通过状态机状态的改变来判定IIC通信的情况,程序的穿插式运行,提高整个单片机系统的效率,能够保证主机从传感器获取数据频率且不影响自身其他程序运行,且同样具有良好的可移植性;而普通软件IIC由于其查询法程序结构限制,软件延时占用系统资源,难以达到相应高的数据获取频率,且会阻塞系统其他程序的进行。
3 结语
基于状态机的IIC驱动算法将整个单片机程序结构切分为类似时间片的结构,如驱动算法中将IIC的各个过程步骤模块化处理,将一个IIC通信任务分割,把原先软件模拟IIC所特有的软件延时的时间节省下来进行其他程序的运行操作,较普通软件IIC能够避免软件延时占用系统资源,节约程序资源,结构也并非复杂,通过状态改变来进行相应操作。使用该算法能够使单片机在各个场景下更加轻松、灵活地处理任务,提高单片机程序效率。我们可以将这种基于状态机的IIC驱动算法,运用到一些对时间精度要求高、读取频率高,且需要进行多从机IIC读写工作的单片机中去。值得一提的是,面对现在现有的一些实时操作系统,如freeRTOS,也可以达到这种多任务系统设计。但大多数的RTOS的代码量都是有一定规模的,在引入RTOS时不得不去考虑会不会带入RTOS所附有的一些程序陷阱。若只是在一些任务种类简单的单片机上使用RTOS的话,无疑需要权衡大量代码可能带来的问题和RTOS所带来的效益之间的平衡。相比之下,基于状态机的IIC驱动算法填补了RTOS在一定场合下的适用性的空缺,更能广泛地应用于需要高可靠性的场合,单片机处理性能有限的场合,对程序编写者来说也更加友好,程序可读性也更好。
参考文献
[1] 张毅刚,赵光权,刘旺.单片机原理及应用[M].北京:高等教育出版社,2016:301-312.
[2] Stephen Prata.C Primer Plus[M].北京:北京人民邮电出版社,2005:152-180.
[3] SENSIRION.Datasheet SHT20[EB/OL].https://www.sensirion.com.
[4] 李兴建,李琨,马文玲.分时操作系统思想在单片机中的具体应用[J].电子设计应用,2003(Z1):56-58.
[5] 唐飞,杨伟.基于多任务机制的STM32系统程序设计[J].安庆师范大学学报:自然科学版,2019,25(4):70-74.
[6] 王洪生.单片机的延时与中断问题及解决方法[J].科技创新导报,2019,16(34):54-55.
[7] 关鑫.基于C语言的计算机编程技术分析[J].科技资讯,2019,17(16):16-17.
[8] 杜隆胤,方冰,郑军.51单片机循环轮询多任务编程[J].计算机时代,2018(10):1-4.
[9] 杨旭.单片机编程中有限状态机的应用[J].科技风,2017(15):71.
[10] 郭兆正,于鹏,于震.基于有限状态机建模的单片机编程方法研究[J].渤海大学学报:自然科学版,2016,37(3):266-270.