PIC32MX单片机的无同步时钟电路HBS通信设计
2018-04-11,
,
(青岛海信日立空调系统有限公司,青岛 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.
石靖峰(硕士),主要从事中央空调控制系统研发工作。