? ? ? ? ? 產(chǎn)品概述
? ? ? ? ?VK3214是UARTTM接口的4通道UART器件。VK3214實(shí)現(xiàn)UART橋接/擴(kuò)展4個(gè)串口(UART)的功能。擴(kuò)展的子通道的UART具備如下功能特點(diǎn):每個(gè)子通道UART的波特率、字長、校驗(yàn)格式可以獨(dú)立設(shè)置,最高可以提供1Mbps的通信速率。每個(gè)子通道可以獨(dú)立設(shè)置工作在IrDA紅外通信。VK3214采用SOP20綠色環(huán)保的無鉛封裝,可以工作在2.5~5.5V的寬工作電壓范圍,具備可配置自動(dòng)休眠/喚醒功能。
應(yīng)用領(lǐng)域
車載信息平臺(tái)/車載GPS定位系統(tǒng)
遠(yuǎn)傳自動(dòng)抄表(AMR)系統(tǒng)
POS/稅控POS/金融機(jī)具
串口擴(kuò)展芯片vk3214應(yīng)用
1、VK32XX系列UART產(chǎn)品在稅控POS中的應(yīng)用
VK32系列產(chǎn)品在嵌入式稅控POS平臺(tái)設(shè)計(jì)中的應(yīng)用
稅控POS機(jī)是一個(gè)控制密集形的嵌入式系統(tǒng),需要控制大量外設(shè)。其基本配置要求的串口打印機(jī),MODEM,RS-485網(wǎng)絡(luò)接口,以及稅控IC卡(異步卡)都工作在基于UART的串行通信方式。同時(shí),大量的外設(shè)如密碼鍵盤,條碼掃描器,條碼稱,接觸IC卡/非接觸IC卡讀卡器,磁卡讀卡器,串口顯示屏等設(shè)備都是通過RS-232串口與POS機(jī)相連。
采用VK32XX系列UART器件,可以根據(jù)MCU/CPU的接口特性,選擇SPI/8位并行總線/UART進(jìn)行靈活的UART串口擴(kuò)展。該方案與采用目前GPIO來模擬串口的方案相比,占用CPU的I/O和資源都很少,即使普通的8位MCU也可以勝任。同時(shí),擴(kuò)展的子串口都是標(biāo)準(zhǔn)的硬件UART,使得數(shù)據(jù)傳輸也更加可靠。
2、 VK32XX系列UART器件在遠(yuǎn)程自動(dòng)抄表系統(tǒng)中的應(yīng)用
如圖所示,遠(yuǎn)傳自動(dòng)抄表系統(tǒng)由遠(yuǎn)傳表和集中抄表器以及MODEM等部分組成。在遠(yuǎn)傳表中,應(yīng)用VK3212雙串口擴(kuò)展IC將單片機(jī)的一個(gè)UART擴(kuò)展成兩個(gè)UART,擴(kuò)展出來的兩個(gè)串口UART1和UART2分別接RS-485/M-BUS接口和紅外接口。VK3212的UART1設(shè)置為RS-485自動(dòng)收發(fā)和RS-485網(wǎng)絡(luò)模式,可以無需MCU的控制,自動(dòng)完成RS-485/M-BUS的數(shù)據(jù)自動(dòng)收發(fā)和自動(dòng)網(wǎng)絡(luò)地址識(shí)別。VK3212的UART2設(shè)置為紅外模式,用于連接遠(yuǎn)傳表的紅外設(shè)置窗口。
在集中抄表器中,用一片SPI接口的4通道UART器件VK3234將擴(kuò)展出4個(gè)子串口UART,MCU通過SPI總線與VK3234相連。VK3234的子串口UART設(shè)置為RS-485自動(dòng)收發(fā)模式,每個(gè)子通道UART控制的RS-485/MBUS收發(fā)器通過RS-485/M-BUS總線連接最多250個(gè)遠(yuǎn)傳表。一個(gè)基于VK3234的集中抄表器可以實(shí)現(xiàn)最多1000個(gè)遠(yuǎn)傳表的數(shù)據(jù)讀取。
由于是通過SPI接口擴(kuò)展的串口,集中抄表器單片機(jī)自身的串口可以連接PSTN/GSM MODEM將集抄數(shù)據(jù)傳給遠(yuǎn)程服務(wù)器。
3 VK3224 SPI接口系列UART器件在嵌入式車載信息平臺(tái)中的應(yīng)用
VK3233主接口有SPI和UART兩種接口可以選擇。嵌入式平臺(tái)中的DSP/CPU通過SPI/UART接口與VK3233相連,VK3233擴(kuò)展出來的三個(gè)子串口分別連接GPS模塊,倒車?yán)走_(dá)模塊和GSM/ CDMA模塊。MODEM控制線連接GSM/CDMA MOMEM。整個(gè)嵌入式系統(tǒng)共用一個(gè)顯示設(shè)備,有效的節(jié)省了車內(nèi)有限的空間。
? ?最近一個(gè)項(xiàng)目需要用到3個(gè)串口,但是用的MCU只有2個(gè)串口,選擇多串口的單片機(jī)成本太高,最后打算用串口擴(kuò)展芯片VK3214擴(kuò)展2個(gè)串口。
VK3214可以用單片機(jī)的一個(gè)串口擴(kuò)展出4個(gè)子串口,每個(gè)子串口都可以單獨(dú)設(shè)置波特率。
腳位圖如下:
MRX,MTX分別接單片機(jī)一個(gè)串口的TX,RX。RXn,TXn 為擴(kuò)展的4個(gè)子串口。
每個(gè)子串口有16字節(jié)的發(fā)送FIFO,16字節(jié)的接收FIFO。當(dāng)發(fā)送FIFO觸發(fā)點(diǎn)中斷使能時(shí),發(fā)送FIFO中的數(shù)據(jù)小于設(shè)定的觸發(fā)點(diǎn)時(shí)產(chǎn)生相應(yīng)的中斷。當(dāng)接收FIFO觸發(fā)點(diǎn)中斷使能時(shí),接收FIFO中的數(shù)據(jù)大于設(shè)定的觸發(fā)點(diǎn)時(shí)產(chǎn)生相應(yīng)的中斷。
中斷腳IRQ低電平有效,注意不是下降沿有效。IRQ接單片機(jī)的中斷腳,中斷腳接單片機(jī)的外部中斷腳INT,INT要設(shè)置為低電平有效。因?yàn)槭堑碗娖接行В谶M(jìn)入中斷程序后,要禁止外部中斷,中斷處理完后再開外部中斷。
例如當(dāng)接收FIFO中斷使能,觸發(fā)點(diǎn)設(shè)置為1,那么在接收FIFO中的數(shù)據(jù)大于1時(shí),IRQ變低,產(chǎn)生中斷,此時(shí)進(jìn)入中斷程序,在中斷程序中要讀完FIFO中的全部數(shù)據(jù),接收FIFO的數(shù)據(jù)變?yōu)?時(shí),IRQ才變?yōu)楦摺H绻麤]讀完FIFO退出中斷,IRQ仍會(huì)為低,退出中斷后,馬上又進(jìn)入中斷程序,導(dǎo)致其它程序不能執(zhí)行。
初始化VK3214時(shí),要初始化完后再使能單片機(jī)的外部中斷,否則會(huì)因?yàn)镮RQ一直為低,導(dǎo)致程序一直運(yùn)行外部中斷程序,其它程序無法運(yùn)行。
初始化程序如下:
void Vk3214_Init(void){
uchar i;
FREEDOG;
VK3214_RST=1;
delay(10);
VK3214_RST=0;
delay(10);
VK3214_RST=1;
delay(10);
write_reg(1,SCTLR,0x38); //串口1波特率設(shè)置為9600,使能串口1
write_reg(2,SCTLR,0x38);//串口2ㄌ羋噬柚夢?600,使能串口1
//write_reg(3,SCTLR,0x30);//禁止串口3
//write_reg(4,SCTLR,0x30);//禁止串口4
//write_reg(0,SCONR,0x00);
//write_reg(1,SCONR,0x00);
//write_reg(2,SCONR,0x00);
//write_reg(3,SCONR,0x00);
//write_reg(0,SFWCR,0x00);
//write_reg(1,SFWCR,0x00);
//write_reg(2,SFWCR,0x00);
//write_reg(3,SFWCR,0x00);
write_reg(1,SFOCR,0xcf);//接收FIFO觸點(diǎn)控制1BYTE
//i = read_reg(1, SFOCR);
//SENDCOM1(&i,1);
write_reg(2,SFOCR,0xcf);
//write_reg(2,SFOCR,0xcc);
write_reg(1,SIER,0x01);//使能接收FIFO觸點(diǎn)中斷,禁止發(fā)送FIFO觸點(diǎn)中斷
write_reg(2,SIER,0x01);
//write_reg(2,SIER,0x00);
//write_reg(3,SIER,0x00);
//write_reg(0,SIFR,0x00);
//write_reg(1,SIFR,0x00);
//write_reg(2,SIFR,0x00);
//write_reg(3,SIFR,0x00);
write_reg(1,GIR,0X30);//使能串口1, 2中斷
while(read_reg(1,SFSR))//讀完串口1,2接收FIFO中的數(shù)據(jù)
read_reg(1,SFDR);
while(read_reg(2,SFSR))
read_reg(2,SFDR);
write_reg(1,GUCR,0X10);//主串口波特率設(shè)為38400
AUXR=0x14;///S2使用獨(dú)立波特率發(fā)生器,S2波特率不加倍BRTX12設(shè)為1
BRT=0xf7;//0xee;//0xf7;//設(shè)置波特率38400
delay(10);
}
為保證及時(shí)接收到擴(kuò)展串口的數(shù)據(jù),接收FIFO觸發(fā)點(diǎn)中斷設(shè)置為1,即接收到1個(gè)字節(jié)就產(chǎn)生中斷,發(fā)送因?yàn)槭菃纹瑱C(jī)控制,不用設(shè)置觸發(fā)點(diǎn)中斷。
void uart_sendByte(unsigned char dat)
{
S2BUF=dat;
while(!(S2CON & 0x02)); //waite for data to transmit completely
S2CON &= 0xFD;
}
//通過串口發(fā)送1個(gè)字節(jié)的數(shù)據(jù),dat為發(fā)送的數(shù)據(jù)
unsigned char uart_recByte(void)
{
unsigned char rec=0;
while(!(S2CON & 0x01)); //waite to recieve data in SBUF0
rec=S2BUF;
S2CON &= 0xFE;
return rec;
}
//接收一個(gè)字節(jié)的數(shù)據(jù),函數(shù)返回讀取到的數(shù)據(jù)
unsigned char read_reg(unsigned char port,unsigned char reg)
{
uchar i;
EX1 = 0; //此處關(guān)外部1中斷,避免在讀寫寄存器時(shí),串口芯片接收到數(shù)據(jù)引起外部中斷,在外部中斷調(diào)用相同的寄存器會(huì)導(dǎo)致死機(jī)
uart_sendByte(((port-1)《《4)+reg);
i = uart_recByte();
EX1 = 1;
return i;
}
//讀取寄存器的值,port為子串口的路數(shù),reg為寄存器的地址,返回值是寄存器的值
void write_reg(unsigned char port,unsigned char reg,unsigned char dat)
{
EX1 = 0;
uart_sendByte(0x80+((port-1)《《4)+reg);
uart_sendByte(dat);
EX1 = 1;
}
從上面的函數(shù)可以看出,單片機(jī)的串口控制VK3214的串口,讀寫都是先發(fā)送VK3214的寄存器地址,然后再讀寫數(shù)據(jù),所以如果單片機(jī)的串口和擴(kuò)展的子串口的波特率設(shè)置成一樣,會(huì)導(dǎo)致子串口接收FIFO溢出,再考慮到用單片機(jī)的一個(gè)串口控制2-4個(gè)子串口,所以單片機(jī)的串口波特率一定要是子串口波特率的倍數(shù),我現(xiàn)在擴(kuò)展2個(gè)串口,子串口的波特率為9600,所以我把單片機(jī)串口的波特率設(shè)置為38400,是子串口的4倍。倍數(shù)要考慮好,太慢會(huì)導(dǎo)致接收FIFO溢出,太快會(huì)導(dǎo)致發(fā)送FIFO的數(shù)據(jù)還沒發(fā)出去,有送進(jìn)來新的數(shù)據(jù),發(fā)送FIFO溢出。
VK3214復(fù)位后根據(jù)外接的晶振,主,子串口都有默認(rèn)的波特率,單片機(jī)上電后先把波特率設(shè)為和VK3214主串口波特率一樣,初始化VK3214完成后,在改變VK3214的主串口波特率和單片機(jī)串口的波特率。見初始化程序的最后部分。
接下來關(guān)鍵的部分是外部中斷程序的處理。程序如下:
void Int1Init(void) interrupt 2
{
uchar x,i,j,z;
EX1 = 0;
uart_sendByte(GIR);
i=uart_recByte();
FREEDOG;
if(i&0x01)
{
uart_sendByte((0《《4)+SSR);
z=uart_recByte();
z&=0x01;
while(z==0)
{
uart_sendByte((0《《4)+SFDR);
com2rev[com2revidx++] = uart_recByte();
FREEDOG;
if(com2revidx》=COM2_MAX)com2revidx=0;
uart_sendByte((0《《4)+SSR);
z=uart_recByte();
z&=0x01;
}
}
if(i&0x02)
{
uart_sendByte((1《《4)+SSR);
z=uart_recByte();
z&=0x01;
while(z==0)
{
uart_sendByte((1《《4)+SFDR);
com3rev[com3revidx++] = uart_recByte();
FREEDOG;
if(com3revidx》=COM3_MAX)com3revidx=0;
uart_sendByte((1《《4)+SSR);
z=uart_recByte();
z&=0x01;
}
}
EX1 = 1;
}
進(jìn)入中斷后先判斷是哪個(gè)子串口產(chǎn)生的中斷,如果是子串口1產(chǎn)生的接收中斷,那么讀子串口1的寄存器SSR,看接收FIFO是否為空,不為空就一直讀子串口1的接收FIFO,直到FIFO為空。中斷程序中一定要把接收FIFO的數(shù)據(jù)讀完,因?yàn)槲以O(shè)置的接收FIFO觸發(fā)點(diǎn)數(shù)據(jù)為1。如果不讀完退出中斷,IRQ仍然會(huì)為低,還會(huì)繼續(xù)進(jìn)入中斷程序。讀完后,IRQ才變?yōu)楦摺?/p>
評論
查看更多