基于vk的串口扩展方案.doc_第1页
基于vk的串口扩展方案.doc_第2页
基于vk的串口扩展方案.doc_第3页
基于vk的串口扩展方案.doc_第4页
基于vk的串口扩展方案.doc_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

17VK3XXX 串口扩展芯片应用手册 前言第1节 简介随着现代现代工业发展,使用串口作为通信的设备在不断增加。通常一般控制器自带的串口只有2路,难以满足多个外设的需求,所以串口扩展就变得很必要。通常串口扩展有以下几种方式,一种是通过IO来软件模拟,此方法优点是灵活性好,但是占用的资源比较多,而且只能实现低速模式,准确性较差。二是通过专用串口扩展IC。这个成本较高但是稳定性好,更便于系统集成。为开微电子有限公司设计开发的VK3XXX系列串口扩展芯片,能满足各行各业用户的需求。VK3XXX系列串口扩展芯片的优势在哪些地方,我们下面来做一一分析:这也可以为大家选择合适串口扩展芯片提供一定的参考。(注意:通常我们把和MCU连接的UART/SPI/I2C/并口称为主接口,扩展出来的UART1-UART4称为子串口。)技术优势及选型参考 支持多种主机接口:可选择UART,SPI,IIC,或8位并口来扩展串口分析:1、多总线接口,为串口扩展设计提供更多更丰富选择,让设计更加灵活。 超大硬件收发缓存,支持16级FIFO分析:硬件缓存大小对串口收发数据的影响1、 在串口扩展芯片领域,串口的硬件缓存有大有小,那么到底硬件缓存会对串口有何影响。首先缓存越小,数据溢出的可能性会大大增加,特别是对较长的帧数据。2、 其次是对MCU处理数据效率影响较大。串口扩展芯片都是通过主接口读写操作来实现数据交换,主接口除了读出子串口数据还需要判断芯片相关状态,那么每读一次数据,我们肯定需要作出相关状态的判断。对于同一长度一帧的数据,硬件缓存越小,我们每次读取的数据长度越短,读取数据次数就越多,相应的判断相关状态的次数越多。也就是硬件缓存越小,可能我们会大把的时间都花在对芯片状态的判断上,如果扩展的子串口数量越多,那么这就更加明显。对MCU处理数据效率影响肯定很大。 支持每个子串口不同波特率配置分析:每个子串口都可以进行任意的波特率编程,且每个子串口的波特率都可以不一样,数据格式也是可以配置的。目前市面上常用的波特率是4800,9600,19200,38400,115200几种,但是也有特殊的波特率。可编程配置波特率让主设备可以实现和任意串口设备进行通信。 支持休眠设置分析:对于某系设备,可能使用率较低,可以关闭芯片时钟使芯片进入休眠状态,可以大大降低系统功耗,特别是在工业平板、POS机等采用电池供电的设备上。 支持主接口波特率自适应分析:波特率自适应就是我们只需要在通信前给目标设备的串口发送一个数据目标设备通过该数据测试现在通信的波特率,然后把自身串口的波特率进行调整到相同的波特率。这样可以大大减少波特率误差造成的通信异常。 支持485自动收发控制 分析:目前有些设备是485设备,485设备是半双工设备,在和uart通信的时候需要做收发转换控制。如果芯片自带这样的控制逻辑,那么将大大减少系统软件硬件设计同时系统也将更稳定。 不同主接口之间区别和选型注意事项分析:首先从主接口速率上来看,由高到低并口、SPI、UART、I2C通常主接口速率较高,相应的子串口支持的通信速率也更高。(注意:无论主接口是什么类型,子串口都能设置到很高的波特率。因此为了保证系统饱和通信情况,不出现数据溢出的情况,通常不同的主接口速率会对应一个大概的子串口速率。)通常如果子串口连接的设备都是115200速率或者以上的,那么我们通常选着SPI或者并口,当然最好优先选择SPI接口类型,因为他占用的硬件资源毕竟要少的多。如果你希望通过I2C或者UART来扩展子串口,那么建议你的子设备的波特率最好不要超过115200,除非你的子设备传输的数据较少或者支持数据重传。第2节 芯片结构 VK3XXX是业界首款具备UART/SPI/IIC/8位并行总线接口的四通道UART器件。对于整个VK系列的串口扩展芯片在结构上都是以下结构:主接口通过其中的UART/I2C/SPI/并口中的一种连接到MCU。那么MCU就可以通过读写数据来控制VK3XXX芯片。第三节 硬件电路参考1、 各部分电路详解 A、UART扩展电路 B、SPI扩展电路 C、I2C扩展电路 D、并口扩展电路第四节 软件编程 VK3XXX芯片可选择的主接口有UART/SPI/I2C/8位并口,也就是实现UART扩展UART、SPI扩展UART、I2C扩展UART、8位并口扩展UART;那么不同的主接口,对VK3XXX操作也有一定的差异,下面我们就以51单片机为例,对不同的主接口模式下,读写VK3XXX寄存器的编程做一些分析:1、主UART时序分析与编程 UART时序和协议分析 请注意当主接口设置位uart模式的时候。我们芯片的主uart是波特率自适应的。具体的操作是:在芯片上电复位完成后,控制器发送0X55来完成波特率的匹配。以后就按照当前的波特率进行通信。 A、主uart写寄存器操作 写操作时,先向VK3XXX的RX写入一个命令字节(command byte),随后写入相应的数据字节,其操作时序(无校验,禁止转义和红外模式)如图: 写寄存器协议: 编程参考:/*/Function:往寄存器里面写数据/输入:port为子串口的路数(C1C0),reg为寄存器的地址(A3A2A1A0) /dat 为写入寄存器的值/返回: 无/*void write_reg(unsigned char port,unsigned char reg,unsigned char dat)uart_sendByte(0x80+(port-1)4)+reg); /写地址uart_sendByte(dat);/写数据 B、主uart读寄存器操作 读操作时,先向VK3XXX的RX写入命令字节,相应的数据字节从MTX读取,其操作时序(无校验,禁止转义和红外模式),如图: 读寄存器协议: 编程参考:/*/Function:读取寄存器值/输入:port为子串口的路数(C1C0),reg为寄存器的地址(A3A2A1A0)/输出: 返回值是读取的寄存器的值/*unsigned char read_reg(unsigned char port,unsigned char reg)uart_sendByte(port-1)4)+reg); /发送寄存器地址return uart_recByte(); C、主uart写FIFO操作 写FIFO协议:(多字节写入) 注意:读写FIFO操作是一个特殊的读写寄存器操作命令。该命令只能用于读写子串口的缓冲区的数据,也就是FIFO中的数据。 编程参考: /*/Function:写fifo/输入:port为子串口的路数,num是读取的数据的个数 ,p是将要写入数据的首地址/返回:无/*void write_fifo(unsigned char port,unsigned char *p,unsigned char num)unsigned char n;uart_sendByte(0xc0+(port-1)4)+(num-1);for(n=0;nnum;n+)uart_sendByte(*(p+n); D、主uart读FIFO操作 读FIFO协议:(多字节读取) 注意:读写FIFO操作是一个特殊的读写寄存器操作命令。该命令只能用于读写子串口的缓冲区的数据,也就是FIFO中的数据。 编程参考:/*/Function:读取fifo中的数据/输入:port为子串口的路数,num是读取的数据的个数/返回:函数返回值dat为读取到的数据的首地址指针/*unsigned char *read_fifo(unsigned char port,unsigned char num)unsigned char n;unsigned char dat8;uart_sendByte(0x40+(port-1)4)+(num-1);for(n=0;nnum;n+)datn=uart_recByte();return dat;2、 主SPI时序分析与编程 VK3XXX工作在SPI同步串行通信的从机模式下,支持SPI模式0标准。为实现主机与VK3XXX的通信,在主机端需要设置CPOL=0(SPI时钟极性选择位),CPHA=0(SPI时钟相位选择位)。 SPI接口的操作时序如图: A、SPI写寄存器协议/*void write_reg(unsigned char port,unsigned char reg,unsigned char dat)send(0x80+(port-1)5)+reg*2,dat);/写寄存器,port为子串口的路数,reg为寄存器的地址,dat为写入寄存器的数据/* B、SPI读寄存器协议unsigned char read_reg(unsigned char port,unsigned char reg)return send(port-1)5)+(reg1),0x00);/读寄存器,port为子串口的路数,reg为寄存器的地址,返回寄存器的值/*3、 I2C时序分析与编程 两线IIC总线是一根串行数据线和一根串行时钟线。当总线处于空闲时,两根线都通过上拉电阻拉到正电源电压。每一个设备都有一个独立的地址。数据传输 每一位数据都是通过一个始终脉冲进行传输的。在SCLK未高的周期SDA线上的数据必须保持稳定。在此时改变SDA线上的数据会被认为是控制信号。当SCLK为高的时候SDA线数据由高到低的跳变表示一个起始位,一个由低到高的跳变表示一个停止位。总线在起始位以后被认为处于忙的状态;在停止位后被认为处于空闲状态。 在起始位和停止位之间的由主机到从机的数据必须是8bit长,高位在前并且必须有一个应答位。与应答位相匹配的时钟是由主机产生的。当主机释放总线时,应答的设备必须在应答周期内拉低SDA线。IIC传输协议与格式如下:4、 并口时序分析与编程 VK3XXX的8位并行总线接口完全兼容主流的8位MCU(如8051)的操作时序。 A、并口写操作时序 编程参考:/*void write_reg(unsigned char port,unsigned char reg,unsigned char dat) unsigned char tmpdataa; tmpdataa=(0x40+(port-1)4)+reg);/|reg|0x40);P0=0XFF;CS=0;A0=COMMAND;P0=tmpdataa;PWR=0;/nop;nop;nop;PWR=1;A0=DATA;P0=dat;PWR=0;nop;nop;nop;PWR=1;CS=1; P0=0XFF;/写寄存器,port为子串口的路数,reg为寄存器的地址,dat为写入寄存器的数据/*B、并口读操作时序 编程参考:/*unsigned char read_reg(unsigned char port,unsigned char reg)unsigned char dat; unsigned char tmpdataa=0; tmpdataa=(port-1)4)+reg);/|reg);dat=0x00;P0=0XFF;CS=0;P0=tmpdataa;A0=COMMAND;PWR=0;PWR=1; P0=0XFF;A0=DATA;PRD=0;dat=P0;PRD=1;CS=1;P0=0XFF;return dat;/读寄存器,port为子串口的路数,reg为寄存器的地址,返回寄存器的值/* 当我们完成了再不同主接口模式下对VK3XXX的读写寄存器函数操作时,也就是完成了对VK3XXX最小的操作单元,以后对VK的操作完全依赖那几个基本函数。那么下面我们继续对芯片的基本结构和收发数据过程进一步剖析与分析。5、 寄存器结构分析 VK3XXX串口扩展芯片的寄存器可以分为2类:全局寄存器和子串口寄存器。 全局寄存器有7个,主要是控制主接口或者是某个子串口功能的总开关。 子串口寄存器11个,完成子串口功能设置和状态指示。每个子串口都有一组独立的子串口寄存器,但是每个寄存器都是一样的,我们通过子串口的端口加以区分。6、 发送数据过程分析发送数据过程分析:发送数据就是将CPU通过主接口把需要发送到子串口的发送到FIFO,然后FIFO中的数据按照相应的波特率发送出去。当我们需要把数据发送给VK3XXX连接的子设备,那么我们就需要通过主接口向VK3XXX写入相应的数据,然后再经过VK3XXX传输给指定的子串口(子设备)。那么这就完成了一次数据的发送。实际过程就是配置VK3XXX相关寄存器的过程,那么我们现在也通过子串口1发送数据为例讲解一下相关寄存器的配置。A、 使能子串口,设置子串口的波特率(默认值),具体设置波特率参考数据手册 write_reg(1,SCTLR,0X38);/使能子串口1,在晶振为3.6864下面,波特率为9600B、FIFO设置,清空发送、接收FIFO中的数据 write_reg(1,SFOCR,0XFF);C、使能发送、接收FIFO write_reg(1,SFOCR,0XFC); D、查看发送接收FIFO中是否有数据,如果有则把FIFO中的数据读出来,使发送接收FIFO中的数据为0 while(read_reg(1,SFSR) read_reg(1,SFDR);E、向SFDR写入需要发送的数据,完成数据发送 write_reg(1,SFDR,0X00);/向子串口FIFO数据寄存器写入数据说明:上述过程A-D都是初始化配置,只需要在复位以后进行配置。配置成功后只需要早主函数在执行E即可完成对数据的发送。7、 接收数据过程分析 数据接收过程是这样的,当在子串口的接收功能使能的情况下,子串口RX引脚接收到的数据暂存在子串口的接收FIFO当中,需要CPU主动去VK3XXX的接收FIFO当中读取。下面就以子串口1接收数据为例:A、使能子串口,设置子串口的波特率(默认值),具体设置波特率参考数据手册 write_reg(1,SCTLR,0X38);/使能子串口1,在晶振为3.6864下面,波特率为9600B、FIFO设置,清空发送、接收FIFO中的数据 write_reg(1,SFOCR,0XFF);C、使能发送、接收FIFO write_reg(1,SFOCR,0XFC); D、查看发送接收FIFO中是否有数据,如果有则把FIFO中的数据读出来,使发送接收FIFO中的数据为0 while(read_reg(1,SFSR) read_reg(1,SFDR);E、从接收FIFO当中读取数据 dat=read_reg(1,SFDR);/数据被接收说明:上述过程A-D都是初始化配置,只需要在复位以后进行配置。配置成功后只需要早主函数在执行E即可完成对数据的接收。8、 中断结构分析 中断对于VK3XXX的意义:对于VK3XXX的操作,都是MCU通过总线去读写VK3XXX的寄存器,这些对于VK3XXX来说都是被动的操作,被动的接受MCU过来的数据,当然有时候我们也有消息需要及时的通知MCU,那么中断输出信号就是为实现这项功能而设立的。IRQ中断信号输出引脚通常会接到MCU的外部中断输入引脚。 VK3XXX有两级中断:子串口及MODEN中断,全局中断。当IRQ引脚指示有中断时,可以通过读取全局中断寄存器GIR以判断当前中断类型,然后去读取相应的中断状态寄存器,以确定当前的中断源。 中断的使用方式: A、首先使能全局中断 GIR B、使能相应子串口相应的中断 SIER C、对于接收和发送FIFO触点中断需要设置中断触点,也就是中断产生的条件 SFOCR/设置一些固定的中断触点 中断处理方式: 当中断来了以后我们应该怎么判断全局中断 首先判断是哪个子串口的中断 GIR 判断具体的中断源 SIFR9、 485功能使用及其编程 在使用485功能的时候,我们通常都是只需要使用RTS引脚来控制后端485电平转换芯片的收发。具体操作如下:自动模式配置: write_reg(1,SCTLR,0X3C);/配置RS485自动收发模式,使能串口数据收发 write_reg(1,SCONR,0X79);设置完这些寄存器后,当你发送数据时,RTS引脚会自动拉高,使485芯片处于发送状态,数据发送完后 ,拉低RTS恢复到接收状态。 手动模式如下: 1、write_reg(1,SFWCR,0X0E);/设置为硬件手动控制模式,为手动设置RST信号做准备 2、主函数中手动设置RST信号。 write_reg(1,SIFR,0X08);/使RST保持高电平,控制485转换芯片的RE和DE. 3、当发送完数据后,拉低RST引脚电平 write_reg(1,SIFR,0X00); 10、 调试技巧 调试技巧: 电路硬件检查:A、首先检查电源,看芯片电源正和GND是否正常。芯片焊接是否有虚焊,过焊,和短路的情况。B、首先查看晶振是否起振,起振是否正常;然后检查复位引脚,复位后应该保持高电平。C、检查模式配置引脚,M1M0选择模式是否正常。 如果选择uart模式,请注意IR功能引脚,通常应该设置为普通模式。 如果选择是I2C模式,请注意IA1和IA0这两个地址引脚是否和编程中写的一致。 软件调试:在保证硬件没有问题的情况下可进行软件调试。A、 上电后最好进行复位。保证芯片处于一个初始状态(在调试阶段复位很关键,很多调试不正常可能都是由于前期错误操作导致的,只要复位,可避免前期错误操作带来的影响)B、 通常我们调试软件都是先调试主接口通信。我们可以通过读VK3XXX芯片某些值比较固定的寄存器,来判断主接口是否通信成功。比如:SCTLRC、 读调试成功好,然后再调试写。通过读来验证写寄存器是否成功了。D、 如果读写都没有问题了,那么就可以开始你的编程之旅了。第5节 编程实例1、程序结构分析 A、程序主体流程图 B、程序流程图中断处理函数2、程序实例VK3XXX.c/* /*/Function:子串口设置函数/输入:无/返回值:无/日期:2011/12/12/*void config_vkxx() write_reg(1,SCTLR,0X38);/使能子串口,设置子串口的波特率(默认值),具体参看数据手册中,子串口波特率设置write_reg(2,SCTLR,0X38); /write_reg(3,SCTLR,0X38); /write_reg(4,SCTLR,0X38);/*write_reg(1,SFOCR,0XFF);/FIFO设置,清空发送接收FIFO中的数据,write_reg(2,SFOCR,0XFF);write_reg(3,SFOCR,0XFF);write_reg(4,SFOCR,0XFF);write_reg(1,SFOCR,0XFC); /使能发送接收FIFOwrite_reg(2,SFOCR,0XFC);write_reg(3,SFOCR,0XFc);write_reg(4,SFOCR,0XFC);/*while(read_reg(1,SFSR)read_reg(1,SFDR);while(read_reg(2,SFSR)read_reg(2,SFDR);while(read_reg(3,SFSR)read_reg(3,SFDR);while(read_reg(4,SFSR)read_reg(4,SFDR);/查看发送接收FIFO中是否有数据,如果有则把FIFO中的数据读出来,/使发送接收FIFO中的数据为0Main.c/下面的代码并非完整的代码,主要是一个测试demomain()static unsigned char dat1,dat2,dat3,dat4,m,n; unsigned int tmp=0xfff; unsigned char err_fla=0,err_flb=0,err_flc=0,err_fld=0;m=0x00; /初试化MCU config(); /初试化LED Init_led(); /初始化VK;config_vkxx(); /主串口测试;亮起UART-LEDCH4_LED = 1;CH3_LED = 1;CH2_LED = 1;CH1_LED = 1;PAR_LED = 1;SPI_LED = 1; UART_LED = 0;IIC_LED = 1; delay(0x8fff);delay(0x8fff);while(1) /写出数据分别到4个子UART ,MCU发送数据write_reg(1,SFDR,m);write_reg(2,SFDR,m);write_reg(3,SFDR,m);write_reg(4,SFDR,m);delay(0x8fff);/delay(0x8fff);

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论