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