APP下载

PIC32MX单片机的无同步时钟电路HBS通信设计

2018-04-11,

单片机与嵌入式系统应用 2018年4期
关键词:波特率数组字节

,

(青岛海信日立空调系统有限公司,青岛 266510)

引 言

HBS通信具有无极性接线、抗干扰性强、传输距离长等优点,是商用空调领域重要的总线通信方式。但是HBS通信对主芯片具有同步时钟输出的要求[1],限制了主芯片的选型。

1 原理分析

1.1 HBS异步串行信号的分析

从图1(a)可以看出,Uart发送数据时,除了数据主体D0~D7,还有起始位、奇偶校验位和1~2个停止位[3]。起始位为低电平“0”,停止位为高电平“1”。为了叙述方便,后面的数据如无特别声明,均以1个停止位、9 600 bps波特率为默认的数据结构及传输速率。

图1(b)显示的是同步时钟信号,此信号的波特率是发送数据的两倍,当数据波特率为9 600 bps时,同步时钟信号的波特率为19 200 bps。

图1 异步串行信号波形图

图1(c)是原数据与同步时钟信号调制后的波形,此波形输入到MM1192芯片的6引脚。

图1(d)是HBS的差分信号,即屏蔽双绞线中测出的信号波形。

需要注意的是,UART是先发D0后发D7,而SPI(Serial Peripheral Interface)则相反,是先发D7后发D0。

1.2 同步信号模拟异步信号的原理分析

无论使用同步发送异步接收法还是PWM模拟同步时钟法,都需要确保图1(d)中的HBS差分信号是相同的。PIC32MX系列单片机虽然无同步时钟端口,但是使用SPI同步时钟发送的方法,适当的进行数据变换,可以实现和图1(c)相同的信号波形,输入MM1192的6引脚。从而在通信数据线中得到和图1(d)相同的HBS差分信号波形。

此方法成功的关键是进行准确的数据变换,11个数据引脚调制后是22个引脚,最少需要3个字节24引脚,再加上一个延时字节,共4个字节。通常有两种变换方法:一是将起始位单独变换为1个字节,数据位变换为2个字节,奇偶校验位及停止位变换为最后一个字节,如图2所示的划分;二是从起始位到停止位,按顺序每8个引脚划为一个字节,如图3所示。由于第1种数据变换方式实现上相对简单,本次设计采用第1种方式。

图2 第1种数据变换分组方式

图3 第2种数据变换分组方式

2 同步无调制发送异步接收HBS的硬件设计

2.1 MM1192的功能分析

本次设计应用MITSUMI生产的SOP MM1192通信芯片。该芯片主要由发送和接收两部分组成。接收部分的工作原理为:MM1192通过pinl5-IN(2)、pinl6-IN(1)采集总线上的差分信号,之后与芯片内部的2.5 V相比较,再将比较结果放大后转换为“1”或“0”数字信号,最终在pin1-Reception DATA OUT脚输出。发送部分工作原理为:MM1192通过pin6-DATA IN脚采集“1”或“0”数字信号,之后经过触发器判断高低电平,再通过与非门触发内部三极管导通,最终在pin9-OUT(A)和pinl0-OUT(B)输出模拟差分信号,实现数据的差分信号传输[4]。

2.2 硬件电路的设计

由于接收部分采用以前的成熟电路,而且接收信号也无变化,不作展开分析,只对发送部分电路进行分析及再设计,如图4、图5所示。

图4 异步有同步时钟的发送电路

图5 同步无调制发送电路

原电路如图5所示,通过三极管的组合实现逻辑和运算。其中Q23、Q24通过异或连接,其逻辑运算关系如下:

根据德摩根定理有以下运算成立:

这个逻辑非由Q25实现。

变更后电路如图5所示,由于PIC32MX系列芯片SPI在空闲时是低电平[3],而MM1192的空闲信号输入要求是高电平,所以新电路需要保留一个三极管在输入MM1192之前进行电平反转。R151作为芯片输出信号的上拉电阻,C142作为滤波电容也保留。

3 同步无调制发送异步接收HBS的软件设计

3.1 UART及SPI端口的初始化

同步无调制发送异步接收通信模块的软件流程图如图6所示,其中初始化和翻译表制作是重要的环节,进行详细说明。

图6 软件流程图

UART初始化如下:

SYS_INT_Disable(); //初始化时,先关掉所有中断

U1BRG = 259;//40 MHz的设定主频时,波特

//率为9600bps

U1MODEbits.PDSEL=2;//首字节奇校验接收

U1MODEbits.STSEL =0;//1个停止位

U1STAbits.URXEN=1;//允许接收

IEC1bits.U1RXIE=1;//允许接收中断触发

U1STAbits.UTXEN=0;//UART的发送中断是不需要

//的,关闭

IEC1bits.U1TXIE=0;//UART的发送中断使能是不

//需要的,关闭

SPI初始化如下:

SPI_BaudRateSet(&SPI1BRG,&SYS_CLK_Frequency, 19200 );

//19200bps波特率设定,两倍频于UART接收频率

SPI1CON = 0x18030;

SPI1CONbits.MODE32 = 1;//使用32位寄存器发送模式

SPI2CONbits.STXISEL =1;

SPI2CONbits.ON = 1;

SYS_INT_Enable();//初始化结束后,打开所有中断

同步串口通信没有起始位、停止位和奇偶校验位,所以和异步串口通信不同,不需要相关的软件设置[5]。由于SPI发送没有外部的调制电路,需要两倍频于UART的设置,才可以得到相同的波形。

3.2 异步转同步翻译表的制作

首先,需要定义5个unsigned char型数组,用于存放异步转同步时查表的数据。本设计翻译表的制作采用图2的分组方法。

Table0[256]——此数组用于存储起始位“0”的转化数据,因为0~255所有数据的起始位均相同,所以此数组中的所有数据均为0x01。

Table1[256]——此数组用于存储原始数据中的D0、D1、D2、D3 。由于UART和SPI数据发送的数据顺序相反[3,5],而且外部电路SPI发送少了一组三极管反向,需要将原二进制数据左右颠倒,然后再“0”或“1”反转。此部分数据转化的实现使用了Turbo C软件编程。转化结果如下:

const unsigned char Table1[256]={//第二字节 D0~D3

0x55,0x15,0x45,0x5,0x51,0x11,0x41,0x1,0x54,0x14, //0~9

0x44,0x4,0x50,0x10,0x40,0x0,0x55,0x15,0x45,0x5,//10~19

0x51,0x11,0x41,0x1,0x54,0x14,0x44,0x4,0x50,0x10, //20~29

0x40,0x0,0x55,0x15,0x45,0x5,0x51,0x11,0x41,0x1,//30~39

0x54,0x14,0x44,0x4,0x50,0x10,0x40,0x0,0x55,0x15, //40~49

0x45,0x5,0x51,0x11,0x41,0x1,0x54,0x14,0x44,0x4,//50~59

0x50,0x10,0x40,0x0,0x55,0x15,0x45,0x5,0x51,0x11, //60~69

0x41,0x1,0x54,0x14,0x44,0x4,0x50,0x10,0x40,0x0,//70~79

0x55,0x15,0x45,0x5,0x51,0x11,0x41,0x1,0x54,0x14, //80~89

0x44,0x4,0x50,0x10,0x40,0x0,0x55,0x15,0x45,0x5,//90~99

0x51,0x11,0x41,0x1,0x54,0x14,0x44,0x4,0x50,0x10, //100~109

0x40,0x0,0x55,0x15,0x45,0x5,0x51,0x11,0x41,0x1,//110~119

0x54,0x14,0x44,0x4,0x50,0x10,0x40,0x0,0x55,0x15, //120~129

0x45,0x5,0x51,0x11,0x41,0x1,0x54,0x14,0x44,0x4,//130~139

0x50,0x10,0x40,0x0,0x55,0x15,0x45,0x5,0x51,0x11, //140~149

0x41,0x1,0x54,0x14,0x44,0x4,0x50,0x10,0x40,0x0,//150~159

0x55,0x15,0x45,0x5,0x51,0x11,0x41,0x1,0x54,0x14, //160~169

0x44,0x4,0x50,0x10,0x40,0x0,0x55,0x15,0x45,0x5,//170~179

0x51,0x11,0x41,0x1,0x54,0x14,0x44,0x4,0x50,0x10, //180~189

0x40,0x0,0x55,0x15,0x45,0x5,0x51,0x11,0x41,0x1,//190~199

0x54,0x14,0x44,0x4,0x50,0x10,0x40,0x0,0x55,0x15, //200~209

0x45,0x5,0x51,0x11,0x41,0x1,0x54,0x14,0x44,0x4,//210~219

0x50,0x10,0x40,0x0,0x55,0x15,0x45,0x5,0x51,0x11, //220~229

0x41,0x1,0x54,0x14,0x44,0x4,0x50,0x10,0x40,0x0,//230~239

0x55,0x15,0x45,0x5,0x51,0x11,0x41,0x1,0x54,0x14, //240~249

0x44,0x4,0x50,0x10,0x40,0x00 //250~255

};

Table2[256]——此数组用于存储原始数据中的D4、D5、D6、D7 。此部分的转化和Table1[256]相似。转化结果如下:

const unsigned char Table2[256]={//第三字节 D4、D5、D6、D7

0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,//0~9

0x55,0x55,0x55,0x55,0x55,0x55,0x15,0x15,0x15,0x15,//10~19

0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,//20~29

0x15,0x15,0x45,0x45,0x45,0x45,0x45,0x45,0x45,0x45,//30~39

0x45,0x45,0x45,0x45,0x45,0x45,0x45,0x45,0x5,0x5,//40~49

0x5,0x5,0x5,0x5,0x5,0x5,0x5,0x5,0x5,0x5,//50~59

0x5,0x5,0x5,0x5,0x51,0x51,0x51,0x51,0x51,0x51,//60~69

0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,//70~79

0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,//80~89

0x11,0x11,0x11,0x11,0x11,0x11,0x41,0x41,0x41,0x41,//90~99

0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,//100~109

0x41,0x41,0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1,//110~119

0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x54,0x54,//120~129

0x54,0x54,0x54,0x54,0x54,0x54,0x54,0x54,0x54,0x54,//130~139

0x54,0x54,0x54,0x54,0x14,0x14,0x14,0x14,0x14,0x14,//140~149

0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,//150~159

0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,//160~169

0x44,0x44,0x44,0x44,0x44,0x44,0x4,0x4,0x4,0x4,//170~179

0x4,0x4,0x4,0x4,0x4,0x4,0x4,0x4,0x4,0x4,

//180~189

0x4,0x4,0x50,0x50,0x50,0x50,0x50,0x50,0x50,0x50,//190~199

0x50,0x50,0x50,0x50,0x50,0x50,0x50,0x50,0x10,0x10,//200~209

0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,//210~219

0x10,0x10,0x10,0x10,0x40,0x40,0x40,0x40,0x40,0x40,//220~229

0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,//230~239

0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,

//240~249

0x0,0x0,0x0,0x0,0x0,0x0

//250~255

};

Table30[256]——此数组用于存储原始数据中的奇偶校验位和停止位。由于数据发送时,头码使用奇校验,后面的数据使用偶校验,所以需要做成两个数组。此数组为奇校验翻译表,后面的Table31是偶校验翻译表。这两个数组全部由0x40和0x00组成,只是0x40和0x00在数组中的位置不同。

Table31[256]——此数组用于存储原始数据偶校验位和停止位。

举例说明:当HBS通信需要发送数据头码“0x23”时,需要以19 200bps的波特率连续发送 Table0[0x23]、Table1[0x23]、Table2[0x23]、Table30[0x23]。

3.3 问题及解决

问题1的现象为软件里计数器显示,在发送ACK第2个字节时,示波器上才出现第1个字节的波形。此时SPIxCONbit.STXISEL=0x00,本意是最后一个位移出SPISR寄存器后进入发送中断[5]。但是经过测试发现,数据刚放进SPIx发送缓存区SPIxBUF,就触发了发送中断。

发送中断中的发送数据计数器为2时,实际上第1个字节才刚刚发完,导致软件的自发自收检测出错。问题的原因是SPIxCONbit.STXISEL=0x00起作用是有条件的,需要使能增强缓存器模式才有效[5]。最后,将SPIxCON寄存器的bit16设置为1,将SPIx设置为增强模式后,问题解除。

问题2的现象为,用Checker串口监测软件不能正常显示出最后一位字节。但是用示波器看波形时,最后一个字节已经发送了,对方设备也回复了信息。

一帧数据被发送完毕,发送中断被立即关闭,导致软件一直处于发送未完成的状态。因为发送完毕标记位通常在发送中断中处理,关闭中断后就无法进入发送中断了。确保发送完毕标记位已经设置完成后,再关闭发送中断,问题解除。

4 测试结果与分析

分别测试原波形和本文设计的同步无调制发送的波形(单片机发送I/O口和两根通信线间的差分信号)。实际波形如图7和图8所示,非常相近,都可以被正常接收。本设计在进行数据翻译时,在每个字节之间有意加入了一些延时,使得通信波形更容易被接收端识别响应。此方法发送的数据,每个字节之间有0.9 ms的延时,可以改变翻译表的分组方法,去掉延时来缩短字节间的时隙。经过测试确认,字节之间少量的延时可令数据通信更加稳定。

图7 有同步时钟信号的发送数据和差分信号波形

图8 同步无调制发送和差分信号波形

[1] 金国华. 通信芯片MM1192在多联机控制系统中的应用[J].重庆工学院学报,2009,23(4).

[2] 李希志,曹锐,张献林,等.无时钟同步信号单片机实现HOMEBUS总线通信的方法:中国,201110256025.4[P].2018-01-8.

[3] Microchip. PIC32MX系列单片机手册, 2014.

[4] MITSUMI.HBS-Compatible Driver and Receiver Monolithic IC MM1192,2017.

[5] Microchip.Section 23 Serial Peripheral Interface(SPI), DS61106G.

石靖峰(硕士),主要从事中央空调控制系统研发工作。

猜你喜欢

波特率数组字节
JAVA稀疏矩阵算法
No.8 字节跳动将推出独立出口电商APP
JAVA玩转数学之二维数组排序
CAN 总线波特率自适应程序设计
No.10 “字节跳动手机”要来了?
简谈MC7字节码
Excel数组公式在林业多条件求和中的应用
寻找勾股数组的历程
C*Core芯片SCI串口波特率容限优化
UART波特率发生电路设计