基于MSP430F449的数据存储和USB串行通信实现

发布者:Tianran2021最新更新时间:2013-07-03 来源: dzsc关键字:MSP430F449  数据存储  USB  串行通信 手机看文章 扫描二维码
随时随地手机看文章

 在数据采集和测量仪器尤其是便携式设备中,数据存储和传输是不可避免的问题,近年来TI公司推出的低功耗微控制器MSP430,在仪器设计和制造领域引起巨大变革,新型控制器和大容量串行存储器的应用大大提高产品了的性能。本文主要解决两个问题

1 解决经过MSP430采集后的数据与EEPROM24C256的数据接口问题,也就是数据存储问题;

2 解决EEPROM与上位机(普通微机)的数据通信问题,也就是存储后的数据上传问题。

首先对主要的集成电路做简单介绍

MSP430F449简介

MSP430F449MSP430系列中的一种,MSP430系列是一种具有集成度高,功能丰富、功耗低等特点的16位单片机。它的集成调试环境Embedded Workbench 提供了良好的C语言开发平台。设计中基于程序的复杂性和程序容量大的要求选择了MSP430F449,这款芯片具有64K程序存储器,可以满足大部分复杂控制的需要;它的封装100PIN QFP具有良好的互换性,与MSP430F437 MSP430F435等芯片具有完全一致的管脚可以在程序量上进行合理选择。

24C256简介

     24C256是支持I2C协议的串行EEPROM,容量32768字节。
                     

    以上是24C256的管脚图,其中A0A1A2构成存储器的物理地址,作为I2C总线上区分不同存储器的控制地址,可以在I2C总线上同时连接8个设备。 WP是写保护,高电平将禁止对器件的写操作;SCLSDA是数据传输的控制线,其中SCL是时钟,SDA是双向数据线,用来完成数据的写入和读出,数据的传输按照I2C协议的要求由时钟端SCL配合共同完成。

CP2102简介

    CP2102USBUART的桥接电路,完成USB数据和UART数据的转换,电路连接简单,数据传输可靠,把下位机串行数据转换成USB数据格式,方便实现数据通信,在上位机上通过运行该芯片的驱动程序把USB数据可以按照简单的串口进行读写操作编程简单,操作灵活。
     

   1 MSP430F449 接口原理图

    以上是MSP430F449EEPROM以及CP2102的接口原理图,本文重点在于介绍数据采集过程完成以后的数据存贮和数据传输。

数据的采集多种多样,可以经过片内的ADC转换器对模拟量进行采集,也可以通过独立的端口控制线对特殊的传感器比如温度传感器、压力传感器等进行数据转换,这不作为本文介绍的内容。本文主要是针对不同的采集过程完成后数据的存储和传输处理。

数据自动存储的客观要求

在许多测量过程中,不仅要求读取简单的仪表值,而且还需要对一段时间的数据进行科学的分析和处理以取得预测和分析的目的。在这种情况下,可能要求测量时间长,采集要求自动进行,无需人工值守,所以数据必须自动存储;另一个原因,采集数据的频率比较高,人的观察不能满足实际需要,这就要求对采集的数据进行有效的存储。

集成电路合理选择

有很多大容量的FLASH芯片已经得到广泛应用,但是这类芯片口线较多,需要占用较多的控制器资源,在控制外围器件多,接口复杂的情况下,特别是便携式仪器功能全、体积小,为了精简外围电路,在不影响存储量的情况下,具有I2C接口的串行EEPROM就成为了最佳选择。

24C256程序控制原理

24C256是具有I2C接口的512x64存储器,在数据的存储过程中除了遵循I2C协议必须的逻辑以外,一个最容易忽视并且最容易导致出错的问题就是存储地址问题。

24C256的数据容量是32768,即可以存储的有效字节数。所以它的地址是16位整型数,有效范围是032768,数据字节为单位存储,在16位地址其中有效数据只有15位,低605)位地址表示的容量是063,然后连续的9614)位地址表示页码的范围是0511,在数据连续存储过程中,相同的页面内,存储地址自动完成累加过程;数据在不同页面的存储时,地址不能自动累加,如果不做正确处理,数据将从本页开始的地址重新开始覆盖已经存在的数据。例如,地址是63(二进制码111111)表示的是第0页的最后一个存储空间,地址64(二进制码1,000000)表示第1页最开始的存储空间。在当前存储地址是63时如果该器件处于连续存储模式下,数据将出错。

原因是什么呢? 24C256支持数据的连续存储,最大的存贮数量是64即一页的内容,如果在地址选择上超过了这个限制,数据将会覆盖本页开始的位置重新存储,这就造成数据的错误,在使用上,虽然数据是分页存储的,但在形式上是连续数据,所以存储中不需要特意区分页地址和页内地址。

在连续存储中,尽管数据每次存储的数量小于64,数据也可能出错,例如每次存储数量为11,地址的变化是0112233445566……,看上去没有什么问题,地址是按照每次11递增的,然而存储的结果还是出错了,原因是什么呢?在地址55开始的空间无法提供连续11个页内存储空间,当地址增加到63以后数据又从该页0地址重新开始,从而导致数据储存的错误。有效的解决办法是如果使用连续存储模式,地址的安排上要使存储块的大小为643216842此外都不能使用连续地址存储。如果数据采集中的有效数据位小于64,比如每次采集的结果是30字节,在连续存储模式下要按照32为单位存储,不足的字节补零处理。

以下是24C256数据传输基本控制模块

Ø         延时处理模块

void IIC_Delay(void)   

{

 _NOP();

 _NOP();

 _NOP();

}

Ø         启动I2C模块

void start_IIC(void)      //          启动I2

{

 P2OUT&=0xf9;                    //设置P2输出

 P2DIR&=0XFD;                   //SDA=1, 上拉电阻使得P2.1HFD=1111,1101

P2DIR&=0XFB;                   //SCL=1              FB=1111,1011

P2DIR|=0X02;                     // SDA=0

P2DIR|=0X04;                     // SCL=0

}[page]

Ø         停止I2C模块

void stop_IIC(void)       //         

{

 P2DIR|=0X02;//SDA=0

 IIC_Delay();

 P2DIR&=0XFB;//SCL=1              FB=1111,1011

P2DIR&=0XFD;//SDA=1,             上拉电阻使得P2.1HFD=1111,1101

 IIC_Delay();

P2DIR|=0X04;// SCL=0

}

Ø         发送 0”模块

void send_zero(void)      //             

{

 P2DIR|=0X02;// SDA=0

 IIC_Delay();

 P2DIR&=0XFB;//SCL=1              FB=1111,1011

 IIC_Delay();

 P2DIR|=0X04;// SCL=0

}

Ø         发送  1模块

void send_one(void)       //          

{

 P2DIR&=0XFD;//SDA=1,           上拉电阻使得P2.1HFD=1111,1101

 IIC_Delay();

 P2DIR&=0XFB;//SCL=1              FB=1111,1011

 IIC_Delay();

 P2DIR|=0X04;// SCL=0

}

Ø         发送单字符数据

void send _char(unsigned char data_out)    //    

{

  unsigned char i,tmp=0x80;

  for(i=0;i<8;i++)

  {

    if((data_out & tmp)>0)

    send_one();

    else

    send_zero();

    tmp/=2;

  }

}

Ø         读单字符数据

unsigned char read_char(void) 

{

 unsigned char i,tmp=0x80;

 unsigned char data1=0;

for (i=0;i<8;i++)

{

   P2DIR&=0XFD;//SDA=1,  11111101

   IIC_Delay();//

   P2DIR&=0XFB;//SCL=1              FB=1111,1011

   IIC_Delay();

   if((P2IN&0x02)>0x00)

   {

     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,1101

 IIC_Delay();

 P2DIR&=0XFB;//SCL=1              FB=1111,1011

IIC_Delay();

while((P2IN&BIT1)==BIT1);

P2DIR|=0X04;// SCL=0

 IIC_Delay();

}[page]

Ø         拒绝应答模块

void iic_NACK(void)          {

 P2DIR&=0XFD;//SDA=1,

 IIC_Delay();

 P2DIR&=0XFB;//SCL=1              FB=1111,1011

 IIC_Delay();

 P2DIR|=0X04;// SCL=0

 IIC_Delay();

 P2DIR|=0X02;// SDA=0

 IIC_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=0

 IIC_Delay();

 P2DIR&=0XFB;//SCL=1              FB=1111,1011

 IIC_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异步串口输出的数据自动转化为符合USB协议的数据直接连接到计算机的USB口,上位机应用程序通过CP2102的驱动程序可以象操作串口一样直接读写端口数据。

结论

以上的硬件设计比较简单可靠,可以照搬到同类型的控制芯片上,软件代码也同样具有较好的移植性,只要把控制时钟和数据端口和程序软件设置相一致即可
参考文献:

[1]. MSP430F449 datasheet http://www.dzsc.com/datasheet/MSP430F449_.html.
[2]. MSP430 datasheet http://www.dzsc.com/datasheet/MSP430_490166.html.
[3]. MSP430F437  datasheet http://www.dzsc.com/datasheet/MSP430F437+_313058.html.
[4]. MSP430F435 datasheet http://www.dzsc.com/datasheet/MSP430F43500.html.
[5]. CP2102 datasheet http://www.dzsc.com/datasheet/CP2102_1134535.html.
[6]. RS232 datasheet http://www.dzsc.com/datasheet/RS232_585128.html.

关键字:MSP430F449  数据存储  USB  串行通信 引用地址:基于MSP430F449的数据存储和USB串行通信实现

上一篇:由MSP430和CC1100构成的无线传感器网络
下一篇:基于单片机设计微功耗中文人机界面

推荐阅读最新更新时间:2024-03-16 13:26

USB设备超过其集线器端口的电源限制的解决方法
电脑还好好的,一切正常关机。第二天开机后,一直插在USB插口上的键盘没有动静,拔出后随便再插一次,就出现下面的提示。“一个USB设备超过其集线器端口的电源限制”               根据提示进行恢复端口操作,毫无作用,提示一直无法消除,几个USB插口也都无法使用。重启电脑吧,提示就没有了,USB端口上的键盘还是没有动静,只得再拔出键盘再一插,那讨厌的提示又出来,前后几个USB端口都一样仍然无法使用,不管你插U盘,鼠标,手机什么都情况都一样。只得用刷去尘,电吹风除湿,后来进到BIOS与设备管理器中看看是否禁用了USB端口,还把USB设备全部卸载,然后再自动搜寻设备安装,轮流禁用启用各个USB
[嵌入式]
硕盟USB3.0 转RJ45千兆免驱网卡
产品介绍 硕盟SM-A44是一款USB3.0转RJ45千兆网口转换器。这是一种高性能和低开销的解决方案。转换USB端口到10 / 100/ 1000M以太网端口可以让您的笔记本,台式机电脑能够通过USB接口连接千兆端口快速访问以太网网络。无需购买昂贵的千兆网络接口和备件的PCI或CardBus插槽,只需使用现有的USB端口,就可以升级您的网络连接速度。 接口功能说明 1.支持1000Mbps/100Mbps/10Mbps有线以太网连接网络; 2.不需要额外的驱动程序软件,自动驱动程序安装; 3.支持双绞线交叉检测和自动校正USB总线电源(没有外部电源) 4.USB供电,不需要额外的电源供电 5.支持计算机系统 Windows:
[嵌入式]
stm32之神州三号开发板 USB DFU 实现过程
1.官网下载usb源码包 2.神舟III号的MCU位f103ze 系列。打开压缩包,直接找到 Device_Firmware_Upgrade 文件包 MDK打开工程。 3.选择 stm3210E_EVAL这个选项 ,此时启动文件为 starup_stm32f10x_hd.s. (1)选择器件类型为STM32F103ZE;C/C++的Define修改为USE_STDPERIPH_DRIVER, STM32F10X_HD, USE_STM3210E_EVAL; include paths选择F103相关文件。 (2)工程文件右键修改Mange Project ,把不必要的文件删除,如下。 4.修改 usb 拉高管脚为PG1
[单片机]
stm32之神州三号开发板 <font color='red'>USB</font> DFU 实现过程
基于DSP的串行通信在变频调速系统中的应用
介绍了基于专用DSP芯片ADMC328的异步电机调速系统中的主控部分与驱动部分之间的通信。详细介绍了通讯的硬件接口电路、通讯协议以及软件实现方法,实现了利用DSP的网步带口进行异步通讯的方法,并确保通讯准确可靠。实验结果证明了其可靠性。 1 变频调速系统 3 串行通讯接口电路 表1 通讯数据格式 UART 数据格式 起始位 8位数据字 奇偶校验 停止位 LSB 1 2 3 4 5 6 MSB 串口 数据格式 000 XXX YYY XXX YYY XXX YYY XXX YYY XXX 111 24位数据
[嵌入式]
基于DSP的<font color='red'>串行通信</font>在变频调速系统中的应用
PIC单片机通用同步异步收发器的编程应用
0 引言 PIC18Fxx8单片机是美国微芯公司推出的16位RISC指令集的高级产品,由于芯片内含有A/D、内部E2PROM存储器、I2C和SPI接口、CAN接口、同步/异步串行通信(USART)接口等强大的功能,具有很好的应用前景。但是,目前介绍其应用和以C语言编程的中文参考资料很少。本文将探讨该型单片机异步串行通信的编程应用,程序用HI-TECH PICC-18 C语言编写,并在重庆大学-美国微芯公司PIC单片机实验室的PIC18F458实验板上通过。 1 PIC18FXX8单片机同步/异步收发器(USART) 通用同步/异步收发器(USART)模块是由PIC18FXX8内的三个串行I/O模块组成的器件之
[单片机]
PIC单片机通用同步异步收发器的编程应用
STM32 USB SD卡读卡器和NAND FLASH模拟U盘
本次工程是要同时实现SD卡读卡器和NAND Flash模拟U盘的功能。结合之前的两个工程,稍稍修改下就可以了。 既然要实现两个盘,当然在usb_prop.c中的Max_Lun变量赋值为1,在USB_User组中同时添加fsmc_nand.c和sdio_sdcard.c这两个文件,在外设库中挺尸添加stm32f10x_sdio.c和stm32f10x_fsmc.c两个文件。 添加完之后,可能会有些许的错误,解决完后,我们就要修改下mass_mal.c文件了,这个文件本次要同时实现SD卡和NAND Flash的相关驱动代码的挂接,代码如下: uint32_t Mass_Memory_Size ; uint32_t Mass_Block
[单片机]
STM32 <font color='red'>USB</font> SD卡读卡器和NAND FLASH模拟U盘
USB 3.0来了
稍早前,USB应用者论坛(USB-IF)在台北的USB 3.0开发商论坛(SuperSpeed USB Developers Conference)中,公布了75款通过USB 3.0认证的产品。从年初在CES上展现的热力,到现在开始大力在主机板和笔电上推广,USB 3.0正朝普及的方向前进。 USB-IF总裁兼主席Jeff Ravencraft认为,更快的传输率(从480Mb/s提升到5Gb/s);支持更快的充电速度,以及平均耗电比USB 2.0还少三分之二等优势,是今年起在高阶PC、笔记型计算机领域推动USB 3.0普及的最重要驱动因素。 自今年初开始,加入支持USB 3.0的产品型号日益增多。惠普(HP)
[嵌入式]
68HC908JB8单片机及其在USB外设系统中的应用
主要参数及引脚功能     MC68HC908JB8是采用HCMOS工艺技术生产的高性能单片机芯片,具有片内256BRAM和8KB的Flash ROM结构,16位双通道TIM模块(每一通道配有输入捕捉、输出比较和PWM工作模式),以及兼容USB1.1协议低速通信功能。 JB8 的性能     68HC908JB8是一种高性能M68HC08结构,它和M6805、M146805及M68HC05族代码兼容,3MHz内部总线频率,256B的RAM和8129字节的Flash存储器,且在片内可编程。最多可达37个一般3.3V的I/O口。其中包括:     ·因封装不同有13或10个共享I/
[工业控制]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved