基于MSP430F449的数据存储和USB串行通信实现.doc_第1页
基于MSP430F449的数据存储和USB串行通信实现.doc_第2页
基于MSP430F449的数据存储和USB串行通信实现.doc_第3页
基于MSP430F449的数据存储和USB串行通信实现.doc_第4页
基于MSP430F449的数据存储和USB串行通信实现.doc_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

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

文档简介

基于msp430f449的数据存储和usb串行通信实现摘要:在数据采集设备以及具有相关功能的仪器设计中,数据的存储和传输是一个非常重要的环节,本文在成功实践的基础上,介绍微控制器msp430f449实现数据的采集后的数据存储及与上位机数据通信的相关内容。文中给出了实用的硬件电路和部分软件代码,详细讲解了在数据存储中需要注意的一些环节。关键词:msp430,usb,i2c在数据采集和测量仪器尤其是便携式设备中,数据存储和传输是不可避免的问题,近年来ti公司推出的低功耗微控制器msp430,在仪器设计和制造领域引起巨大变革,新型控制器和大容量串行存储器的应用大大提高产品了的性能。本文主要解决两个问题1 解决经过msp430采集后的数据与eeprom24c256的数据接口问题,也就是数据存储问题;2 解决eeprom与上位机(普通微机)的数据通信问题,也就是存储后的数据上传问题。首先对主要的集成电路做简单介绍msp430f449简介msp430f449是msp430系列中的一种,msp430系列是一种具有集成度高,功能丰富、功耗低等特点的16位单片机。它的集成调试环境embedded workbench 提供了良好的c语言开发平台。设计中基于程序的复杂性和程序容量大的要求选择了msp430f449,这款芯片具有64k程序存储器,可以满足大部分复杂控制的需要;它的封装100pin qfp具有良好的互换性,与msp430f437 、msp430f435等芯片具有完全一致的管脚可以在程序量上进行合理选择。24c256简介 24c256是支持i2c协议的串行eeprom,容量32768字节。 以上是24c256的管脚图,其中a0,a1,a2构成存储器的物理地址,作为i2c总线上区分不同存储器的控制地址,可以在i2c总线上同时连接8个设备。 wp是写保护,高电平将禁止对器件的写操作;scl和sda是数据传输的控制线,其中scl是时钟,sda是双向数据线,用来完成数据的写入和读出,数据的传输按照i2c协议的要求由时钟端scl配合共同完成。cp2102简介 cp2102是usb到uart的桥接电路,完成usb数据和uart数据的转换,电路连接简单,数据传输可靠,把下位机串行数据转换成usb数据格式,方便实现数据通信,在上位机上通过运行该芯片的驱动程序把usb数据可以按照简单的串口进行读写操作编程简单,操作灵活。 图1 msp430f449 接口原理图 以上是msp430f449与eeprom以及cp2102的接口原理图,本文重点在于介绍数据采集过程完成以后的数据存贮和数据传输。数据的采集多种多样,可以经过片内的adc转换器对模拟量进行采集,也可以通过独立的端口控制线对特殊的传感器比如温度传感器、压力传感器等进行数据转换,这不作为本文介绍的内容。本文主要是针对不同的采集过程完成后数据的存储和传输处理。数据自动存储的客观要求在许多测量过程中,不仅要求读取简单的仪表值,而且还需要对一段时间的数据进行科学的分析和处理以取得预测和分析的目的。在这种情况下,可能要求测量时间长,采集要求自动进行,无需人工值守,所以数据必须自动存储;另一个原因,采集数据的频率比较高,人的观察不能满足实际需要,这就要求对采集的数据进行有效的存储。集成电路合理选择有很多大容量的flash芯片已经得到广泛应用,但是这类芯片口线较多,需要占用较多的控制器资源,在控制外围器件多,接口复杂的情况下,特别是便携式仪器功能全、体积小,为了精简外围电路,在不影响存储量的情况下,具有i2c接口的串行eeprom就成为了最佳选择。24c256程序控制原理24c256是具有i2c接口的512x64存储器,在数据的存储过程中除了遵循i2c协议必须的逻辑以外,一个最容易忽视并且最容易导致出错的问题就是存储地址问题。24c256的数据容量是32768,即可以存储的有效字节数。所以它的地址是16位整型数,有效范围是032768,数据字节为单位存储,在16位地址其中有效数据只有15位,低6(05)位地址表示的容量是063,然后连续的9(614)位地址表示页码的范围是0511,在数据连续存储过程中,相同的页面内,存储地址自动完成累加过程;数据在不同页面的存储时,地址不能自动累加,如果不做正确处理,数据将从本页开始的地址重新开始覆盖已经存在的数据。例如,地址是63(二进制码111111)表示的是第0页的最后一个存储空间,地址64(二进制码1,000000)表示第1页最开始的存储空间。在当前存储地址是63时如果该器件处于连续存储模式下,数据将出错。原因是什么呢? 24c256支持数据的连续存储,最大的存贮数量是64即一页的内容,如果在地址选择上超过了这个限制,数据将会覆盖本页开始的位置重新存储,这就造成数据的错误,在使用上,虽然数据是分页存储的,但在形式上是连续数据,所以存储中不需要特意区分页地址和页内地址。在连续存储中,尽管数据每次存储的数量小于64,数据也可能出错,例如每次存储数量为11,地址的变化是0,11,22,33,44,55,66,看上去没有什么问题,地址是按照每次11递增的,然而存储的结果还是出错了,原因是什么呢?在地址55开始的空间无法提供连续11个页内存储空间,当地址增加到63以后数据又从该页0地址重新开始,从而导致数据储存的错误。有效的解决办法是如果使用连续存储模式,地址的安排上要使存储块的大小为64,32,16,8,4,2此外都不能使用连续地址存储。如果数据采集中的有效数据位小于64,比如每次采集的结果是30字节,在连续存储模式下要按照32为单位存储,不足的字节补零处理。以下是24c256数据传输基本控制模块 延时处理模块void iic_delay(void) _nop();_nop();_nop(); 启动i2c模块 void start_iic(void) / 启动i2p2out&=0xf9; /设置p2输出p2dir&=0xfd; /sda=1, 上拉电阻使得p2.1为h,fd=1111,1101p2dir&=0xfb; /scl=1 fb=1111,1011p2dir|=0x02; / sda=0p2dir|=0x04; / scl=0 停止i2c模块void stop_iic(void) / p2dir|=0x02;/sda=0iic_delay();p2dir&=0xfb;/scl=1 fb=1111,1011p2dir&=0xfd;/sda=1, 上拉电阻使得p2.1为h,fd=1111,1101 iic_delay();p2dir|=0x04;/ scl=0 发送 “ 0”模块void send_zero(void) / p2dir|=0x02;/ sda=0iic_delay();p2dir&=0xfb;/scl=1 fb=1111,1011iic_delay();p2dir|=0x04;/ scl=0 发送 1模块void send_one(void) / p2dir&=0xfd;/sda=1, 上拉电阻使得p2.1为h,fd=1111,1101 iic_delay();p2dir&=0xfb;/scl=1 fb=1111,1011iic_delay();p2dir|=0x04;/ scl=0 发送单字符数据void send _char(unsigned char data_out) / unsigned char i,tmp=0x80; for(i=0;i0) send_one(); else send_zero(); tmp/=2; 读单字符数据unsigned char read_char(void) unsigned char i,tmp=0x80;unsigned char data1=0; for (i=0;i0x00) data1|=tmp; p2dir|=0x04;/ scl=0 iic_delay(); tmp/=2;return data1; 检查应答信号模块void iic_ack(void)ack_flag=0x00;p2dir&=0xfd;/sda=1, fd=1111,1101iic_delay();p2dir&=0xfb;/scl=1 fb=1111,1011iic_delay();while(p2in&bit1)=bit1); p2dir|=0x04;/ scl=0 iic_delay(); 拒绝应答模块void iic_nack(void) p2dir&=0xfd;/sda=1,iic_delay();p2dir&=0xfb;/scl=1 fb=1111,1011iic_delay();p2dir|=0x04;/ scl=0 iic_delay();p2dir|=0x02;/ sda=0iic_delay();/ 写连续数据模块void writenbyte(unsigned char *p,unsigned int addr,unsigned char number) start_iic(); send_char(0xa2); iic_ack(); send_char(addr/256); /high address byte iic_ack(); send_char(addr%256); iic_ack(); do send_char(*p); p+; iic_ack(); while(-number); stop_iic(); delay(10); 发送应答模块:ack (low)void s_ack(void) p2dir|=0x02;/ sda=0iic_delay();p2dir&=0xfb;/scl=1 fb=1111,1011iic_delay();p2dir|=0x04;/ scl=0 iic_delay(); 连续读字符模块void readnbyte(unsigned char *p,unsigned int addr,unsigned char number) start_iic(); send_char(0xa2); iic_ack(); send_char(addr/256); iic_ack(); send_char(addr%256); iic_ack(); start_iic(); send_char(0xa3); iic_ack(); do *p=read_char(); p+; if(number!=1) s_ack(); /send ack while(-number); iic_nack(); stop_iic();数据的传输数据传输是存储在eeprom中的数据到达计算机的有效途径,数据上传到计算机最常用的是串行(rs232)接口,现在由于usb计数的不断成熟,通过usb可以方便快捷实现数据传输,而且可以满足速率和设备外观的要求,但是usb的驱动程序设计是比较复杂的工作,本例中使用简单的桥接电路,把uart接口的数据经过cp2102的桥接,直接实现数据的usb转换,从430f449异步串口输出的数据自动转化为

温馨提示

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

评论

0/150

提交评论