,
(青島海信日立空調(diào)系統(tǒng)有限公司,青島 266510)
HBS通信具有無極性接線、抗干擾性強、傳輸距離長等優(yōu)點,是商用空調(diào)領(lǐng)域重要的總線通信方式。但是HBS通信對主芯片具有同步時鐘輸出的要求[1],限制了主芯片的選型。
從圖1(a)可以看出,Uart發(fā)送數(shù)據(jù)時,除了數(shù)據(jù)主體D0~D7,還有起始位、奇偶校驗位和1~2個停止位[3]。起始位為低電平“0”,停止位為高電平“1”。為了敘述方便,后面的數(shù)據(jù)如無特別聲明,均以1個停止位、9 600 bps波特率為默認(rèn)的數(shù)據(jù)結(jié)構(gòu)及傳輸速率。
圖1(b)顯示的是同步時鐘信號,此信號的波特率是發(fā)送數(shù)據(jù)的兩倍,當(dāng)數(shù)據(jù)波特率為9 600 bps時,同步時鐘信號的波特率為19 200 bps。
圖1 異步串行信號波形圖
圖1(c)是原數(shù)據(jù)與同步時鐘信號調(diào)制后的波形,此波形輸入到MM1192芯片的6引腳。
圖1(d)是HBS的差分信號,即屏蔽雙絞線中測出的信號波形。
需要注意的是,UART是先發(fā)D0后發(fā)D7,而SPI(Serial Peripheral Interface)則相反,是先發(fā)D7后發(fā)D0。
無論使用同步發(fā)送異步接收法還是PWM模擬同步時鐘法,都需要確保圖1(d)中的HBS差分信號是相同的。PIC32MX系列單片機雖然無同步時鐘端口,但是使用SPI同步時鐘發(fā)送的方法,適當(dāng)?shù)倪M行數(shù)據(jù)變換,可以實現(xiàn)和圖1(c)相同的信號波形,輸入MM1192的6引腳。從而在通信數(shù)據(jù)線中得到和圖1(d)相同的HBS差分信號波形。
此方法成功的關(guān)鍵是進行準(zhǔn)確的數(shù)據(jù)變換,11個數(shù)據(jù)引腳調(diào)制后是22個引腳,最少需要3個字節(jié)24引腳,再加上一個延時字節(jié),共4個字節(jié)。通常有兩種變換方法:一是將起始位單獨變換為1個字節(jié),數(shù)據(jù)位變換為2個字節(jié),奇偶校驗位及停止位變換為最后一個字節(jié),如圖2所示的劃分;二是從起始位到停止位,按順序每8個引腳劃為一個字節(jié),如圖3所示。由于第1種數(shù)據(jù)變換方式實現(xiàn)上相對簡單,本次設(shè)計采用第1種方式。
圖2 第1種數(shù)據(jù)變換分組方式
圖3 第2種數(shù)據(jù)變換分組方式
本次設(shè)計應(yīng)用MITSUMI生產(chǎn)的SOP MM1192通信芯片。該芯片主要由發(fā)送和接收兩部分組成。接收部分的工作原理為:MM1192通過pinl5-IN(2)、pinl6-IN(1)采集總線上的差分信號,之后與芯片內(nèi)部的2.5 V相比較,再將比較結(jié)果放大后轉(zhuǎn)換為“1”或“0”數(shù)字信號,最終在pin1-Reception DATA OUT腳輸出。發(fā)送部分工作原理為:MM1192通過pin6-DATA IN腳采集“1”或“0”數(shù)字信號,之后經(jīng)過觸發(fā)器判斷高低電平,再通過與非門觸發(fā)內(nèi)部三極管導(dǎo)通,最終在pin9-OUT(A)和pinl0-OUT(B)輸出模擬差分信號,實現(xiàn)數(shù)據(jù)的差分信號傳輸[4]。
由于接收部分采用以前的成熟電路,而且接收信號也無變化,不作展開分析,只對發(fā)送部分電路進行分析及再設(shè)計,如圖4、圖5所示。
圖4 異步有同步時鐘的發(fā)送電路
圖5 同步無調(diào)制發(fā)送電路
原電路如圖5所示,通過三極管的組合實現(xiàn)邏輯和運算。其中Q23、Q24通過異或連接,其邏輯運算關(guān)系如下:
根據(jù)德摩根定理有以下運算成立:
這個邏輯非由Q25實現(xiàn)。
變更后電路如圖5所示,由于PIC32MX系列芯片SPI在空閑時是低電平[3],而MM1192的空閑信號輸入要求是高電平,所以新電路需要保留一個三極管在輸入MM1192之前進行電平反轉(zhuǎn)。R151作為芯片輸出信號的上拉電阻,C142作為濾波電容也保留。
同步無調(diào)制發(fā)送異步接收通信模塊的軟件流程圖如圖6所示,其中初始化和翻譯表制作是重要的環(huán)節(jié),進行詳細(xì)說明。
圖6 軟件流程圖
UART初始化如下:
SYS_INT_Disable(); //初始化時,先關(guān)掉所有中斷
U1BRG = 259;//40 MHz的設(shè)定主頻時,波特
//率為9600bps
U1MODEbits.PDSEL=2;//首字節(jié)奇校驗接收
U1MODEbits.STSEL =0;//1個停止位
U1STAbits.URXEN=1;//允許接收
IEC1bits.U1RXIE=1;//允許接收中斷觸發(fā)
U1STAbits.UTXEN=0;//UART的發(fā)送中斷是不需要
//的,關(guān)閉
IEC1bits.U1TXIE=0;//UART的發(fā)送中斷使能是不
//需要的,關(guān)閉
SPI初始化如下:
SPI_BaudRateSet(&SPI1BRG,&SYS_CLK_Frequency, 19200 );
//19200bps波特率設(shè)定,兩倍頻于UART接收頻率
SPI1CON = 0x18030;
SPI1CONbits.MODE32 = 1;//使用32位寄存器發(fā)送模式
SPI2CONbits.STXISEL =1;
SPI2CONbits.ON = 1;
SYS_INT_Enable();//初始化結(jié)束后,打開所有中斷
同步串口通信沒有起始位、停止位和奇偶校驗位,所以和異步串口通信不同,不需要相關(guān)的軟件設(shè)置[5]。由于SPI發(fā)送沒有外部的調(diào)制電路,需要兩倍頻于UART的設(shè)置,才可以得到相同的波形。
首先,需要定義5個unsigned char型數(shù)組,用于存放異步轉(zhuǎn)同步時查表的數(shù)據(jù)。本設(shè)計翻譯表的制作采用圖2的分組方法。
Table0[256]——此數(shù)組用于存儲起始位“0”的轉(zhuǎn)化數(shù)據(jù),因為0~255所有數(shù)據(jù)的起始位均相同,所以此數(shù)組中的所有數(shù)據(jù)均為0x01。
Table1[256]——此數(shù)組用于存儲原始數(shù)據(jù)中的D0、D1、D2、D3 。由于UART和SPI數(shù)據(jù)發(fā)送的數(shù)據(jù)順序相反[3,5],而且外部電路SPI發(fā)送少了一組三極管反向,需要將原二進制數(shù)據(jù)左右顛倒,然后再“0”或“1”反轉(zhuǎn)。此部分?jǐn)?shù)據(jù)轉(zhuǎn)化的實現(xiàn)使用了Turbo C軟件編程。轉(zhuǎn)化結(jié)果如下:
const unsigned char Table1[256]={//第二字節(jié) 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]——此數(shù)組用于存儲原始數(shù)據(jù)中的D4、D5、D6、D7 。此部分的轉(zhuǎn)化和Table1[256]相似。轉(zhuǎn)化結(jié)果如下:
const unsigned char Table2[256]={//第三字節(jié) 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]——此數(shù)組用于存儲原始數(shù)據(jù)中的奇偶校驗位和停止位。由于數(shù)據(jù)發(fā)送時,頭碼使用奇校驗,后面的數(shù)據(jù)使用偶校驗,所以需要做成兩個數(shù)組。此數(shù)組為奇校驗翻譯表,后面的Table31是偶校驗翻譯表。這兩個數(shù)組全部由0x40和0x00組成,只是0x40和0x00在數(shù)組中的位置不同。
Table31[256]——此數(shù)組用于存儲原始數(shù)據(jù)偶校驗位和停止位。
舉例說明:當(dāng)HBS通信需要發(fā)送數(shù)據(jù)頭碼“0x23”時,需要以19 200bps的波特率連續(xù)發(fā)送 Table0[0x23]、Table1[0x23]、Table2[0x23]、Table30[0x23]。
問題1的現(xiàn)象為軟件里計數(shù)器顯示,在發(fā)送ACK第2個字節(jié)時,示波器上才出現(xiàn)第1個字節(jié)的波形。此時SPIxCONbit.STXISEL=0x00,本意是最后一個位移出SPISR寄存器后進入發(fā)送中斷[5]。但是經(jīng)過測試發(fā)現(xiàn),數(shù)據(jù)剛放進SPIx發(fā)送緩存區(qū)SPIxBUF,就觸發(fā)了發(fā)送中斷。
發(fā)送中斷中的發(fā)送數(shù)據(jù)計數(shù)器為2時,實際上第1個字節(jié)才剛剛發(fā)完,導(dǎo)致軟件的自發(fā)自收檢測出錯。問題的原因是SPIxCONbit.STXISEL=0x00起作用是有條件的,需要使能增強緩存器模式才有效[5]。最后,將SPIxCON寄存器的bit16設(shè)置為1,將SPIx設(shè)置為增強模式后,問題解除。
問題2的現(xiàn)象為,用Checker串口監(jiān)測軟件不能正常顯示出最后一位字節(jié)。但是用示波器看波形時,最后一個字節(jié)已經(jīng)發(fā)送了,對方設(shè)備也回復(fù)了信息。
一幀數(shù)據(jù)被發(fā)送完畢,發(fā)送中斷被立即關(guān)閉,導(dǎo)致軟件一直處于發(fā)送未完成的狀態(tài)。因為發(fā)送完畢標(biāo)記位通常在發(fā)送中斷中處理,關(guān)閉中斷后就無法進入發(fā)送中斷了。確保發(fā)送完畢標(biāo)記位已經(jīng)設(shè)置完成后,再關(guān)閉發(fā)送中斷,問題解除。
分別測試原波形和本文設(shè)計的同步無調(diào)制發(fā)送的波形(單片機發(fā)送I/O口和兩根通信線間的差分信號)。實際波形如圖7和圖8所示,非常相近,都可以被正常接收。本設(shè)計在進行數(shù)據(jù)翻譯時,在每個字節(jié)之間有意加入了一些延時,使得通信波形更容易被接收端識別響應(yīng)。此方法發(fā)送的數(shù)據(jù),每個字節(jié)之間有0.9 ms的延時,可以改變翻譯表的分組方法,去掉延時來縮短字節(jié)間的時隙。經(jīng)過測試確認(rèn),字節(jié)之間少量的延時可令數(shù)據(jù)通信更加穩(wěn)定。
圖7 有同步時鐘信號的發(fā)送數(shù)據(jù)和差分信號波形
圖8 同步無調(diào)制發(fā)送和差分信號波形
[1] 金國華. 通信芯片MM1192在多聯(lián)機控制系統(tǒng)中的應(yīng)用[J].重慶工學(xué)院學(xué)報,2009,23(4).
[2] 李希志,曹銳,張獻(xiàn)林,等.無時鐘同步信號單片機實現(xiàn)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.
石靖峰(碩士),主要從事中央空調(diào)控制系統(tǒng)研發(fā)工作。