瑞萨RL78系列单片机实现16位串行通信的技巧和办法

时间:2022-10-18 08:51:45

瑞萨RL78系列单片机实现16位串行通信的技巧和办法

系统简介

1RL78系列单片机

瑞萨RL78系列单片机,属于新一代16位内核的低功耗单片机系统,被列为瑞萨近年来重点发展的产品之一,其重要性不言而喻。该系列产品基于16位复杂指令系统计算机(CISC)架构,具备丰富的片内和外设功能,已被广泛应用于照明、家电、汽车控制等领域,且专门面向超低功耗应用,让用户能够以较低成本构建小型高效的实用系统。

RL78系列单片机内含串行阵列单元,每个单元设有多个串行通道。各通道均能实现3线串行(CSI)、异步串行(UART)和简易串行总线12C的通信功能。系统内部设有一个16位的串行数据寄存器SDR(如图1所示)。

当接收数据时,系统将外部器件串行送入的数据经移位寄存器转换成并行数据,并缓存到SDR的低8位或低9位中;当发送数据时,系统将并行数据缓存到SDR的低8位或者低9位,然后通过移位寄存器逐位传出。虽然SDR共有16位存储空间,但其高位被用作运行时钟的分频设定寄存器,所以仅有其低8位或低9位能用于数据的发送和接收缓冲。

2 16位模数转换器ADS1602

德州仪器(TI)的高精度、高速度模数转换器(ADC) ADS1602,适合于需求精度高的如仪器设备、数据采集等测量场合。它能够在最高40MHz的时钟频率下,对输入的差分电压信号进行采样,然后通过3线串行接口,向外提供速率为2.5MSPS、16位分辨率的AD转换数据,也可同时提供数据的互补格式,并配有同步输出引脚,可实现多个ADS1602的同时采样。

ADS1602的传输时序如图2所示。其中,CLK为输入时钟,SCLK为输出串行时钟,FSO为帧同步信号,每帧包含16个SCLK脉冲,从高位到低位依次向外发送16位的模数转换数据。

3 SCI串行通信格式

串行通信接口(SCI)是采用双线制通信的异步串行通信接口(UART),通常用时钟信号线、数据I/O线和片选/复位线进行半双工串行数据传输,其通信格式如图3所示。空闲状态为“1”,发送器通过发送一个“O” 表示一个字节传输的开始,随后是数据位,最后发送1到2位的停止位,表示一个字节传送结束;若继续发送下一字节,则重新发送开始位,开始一个新的字节传送;若不发送新的字节,则维持“1” 的状态,使发送数据线处于空闲状态。从开始位到停止位结束的时间间隔被称为“一帧”。

SCI串行通信的特点是结构和控制简单,只需三根信号线即可完成低成本、长距离的数据传输。

问题的提出

RL78系列单片机内设多个串行单元供串行通信使用,可通过内部专设的串行状态寄存器(SSR),来指示通信的状态和发生错误的情况。其中,SSR的bit0作为溢出错误标志位“OVF”,当其为 “1”时表示,接收数据虽然已被保存到串行数据寄存器SDR的低8或低9位中,但是还未被准确完整取走,就被新的数据覆盖了。

如前所述,由于片内的串行数据缓冲器SDR只能提供一个字节的存储空间,那么要接收到模数转换芯片(比如AD S1602)连续发送的16位串行数据,就会导致溢出错误。倘若直接采用单片机内现有的串行单元CSI通道完成两者之间的数据传输,则实际效果是:ADS1602一旦被帧同步信号的启动脉冲所触发,就开始在时钟信号和帧同步信号的控制下,连续不断的向单片机串口数据端发送着16位的AD转换数据,而无法等待着片内SDR先把16位中的高八位数据安全转移,然后再接收低8位数据。SDR低8或9位缓存的上半截数据还没有被读走,下半截的数据就已经开始往里写了,这时SSR的“OVF”标志,就会被置1。也就是说,由于ADS1602无法把一大步(16位数据)分成两小步来走,导致它和RL78系列单片机二者刚一通信,就不可避免地发生了溢出错误!

解决技巧和办法

当由于实际需要,使得RL78系列单片机系统必须要从外部器件那里,获得8位以上的AD转换数据,则两者间的数据传输就必须要完成。那么,如何将外部连发的16位AD数据,准确及时的接收到单片机内呢?为了解决RL78系列单片机和16位模数转换芯片之间的串行通信溢出问题,我们可以不通过片内的串行通信模块,而是通过软件搭建虚拟串口的方式加以解决,具体方法叙述如下。

1 I/O口和时钟的设定

根据SCI串行通信格式和图2所示的16位ADS1602时序要求,设定三个片上输入端口帧同步信号AD_FSO、串行时钟AD_SCLK、串行数据信号AD_DOUT,分别与ADS1602的对应端口相连。

串行时钟SCLK的频率设定也很重要,首先串口时钟必须满足1602的要求,同时不能小于系统时钟,SCLK太快则容易丢失数据或读错数据,太慢又会影响系统的效率,最好根据具体的自身系统处理数据的循环周期的要求来现场实测确定。

2.虚拟SCI的函数搭建

以下为软件实现模拟串口通信的函数R_Imitate_SCI,具体方法为:

我们可以采用if语句进行逻辑判断,将FSO前一时钟的状态和当前状态进行比较,从而监测到其下降沿的到来,也即单帧数据的始发开始位置;另外采用两个do-while语句来判断串行时钟SCLK的下降沿和上升沿,从而判断出每一位串行数据的有效位置。

在SCLK的下降沿对应取数,上升沿对应数位的改变。一旦检测到FSO的下降沿到来,就陆续在SCLK的下降沿存入BIT15最高位以及后续串行数据,然后用“或运算”加“左移”的方式,最终完成16位串行数据的传送。

相关代码如下:

void R_Imitate_SCI(uint16_t*

3 可靠性优化

为了更好的完成模拟串口的可靠通信,可以对上述代码进行优化。优化从两方面人手:一方面可以在时钟下降沿到来后加适当延时再进行取数移位,以确保所取数据居于其稳定阶段;另一方面可以连续多次收发,存入一l6位宽的数组,然后通过算法对数组进行处理,以中值滤波或均值滤波的方式进一步确保数据的可靠和准确。由于这两种优化方案均能方便地获得相应代码,此处就不再赘述。

结语

本文详细叙述了通过软件模拟虚拟串口的方式,解决瑞萨RL78系列单片机无法实现与高于8或9位精度的外部器件之间的串行数据通信难题。比如,当需要将外部连续发送的16位AD转换数据串行送入单片机时,就可以采用本文所述方案。经过实测检验,证明此方案是切实可行、稳定可靠的。

上一篇:助听器调进无线世界 下一篇:面向电源优化和空间受限型系统的差分ADC驱动器...