0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于MSP430F449单片机实现数据存储和通信系统的设计

电子设计 来源:中科院上海技术物理研究 作者:王海英 2020-07-01 07:50 次阅读

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

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

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

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

MSP430F449简介

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

24C256简介

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

基于MSP430F449单片机实现数据存储和通信系统的设计

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

CP2102简介

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

图1 MSP430F449 接口原理图

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

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

数据自动存储的客观要求

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

集成电路合理选择

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

24C256程序控制原理

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

24C256的数据容量是32768,即可以存储的有效字节数。所以它的地址是16位整型数,有效范围是0~32768,数据字节为单位存储,在16位地址其中有效数据只有15位,低6(0~5)位地址表示的容量是0~63,然后连续的9(6~14)位地址表示页码的范围是0~511,在数据连续存储过程中,相同的页面内,存储地址自动完成累加过程;数据在不同页面的存储时,地址不能自动累加,如果不做正确处理,数据将从本页开始的地址重新开始覆盖已经存在的数据。例如,地址是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) // 启动I2

{

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

P2DIR&=0XFD; //SDA=1, 上拉电阻使得P2.1为H,FD=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.1为H,FD=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.1为H,FD=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的驱动程序可以象操作串口一样直接读写端口数据。

结论

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

责任编辑:gt


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 微控制器
    +关注

    关注

    48

    文章

    7470

    浏览量

    150954
  • 芯片
    +关注

    关注

    453

    文章

    50301

    浏览量

    421424
  • 单片机
    +关注

    关注

    6030

    文章

    44505

    浏览量

    632420
收藏 人收藏

    评论

    相关推荐

    MSP430F449如何实现串口通信的接收数据?急求程序!!!

    MSP430F449如何实现串口通信的接收数据?急求程序!!!
    发表于 08-03 16:07

    实现MSP430F449的一键下载

    如何实现MSP430F449的一键下载?之前用过MSP430F149 借助于PL2303HX来实现一键下载功能现在想用CH340G来实现一键
    发表于 06-29 18:30

    基于MSP430F449单片机和M-BUS总线实现数据采集系统的设计方案

    基于MSP430F449单片机和M-BUS总线实现数据采集系统的设计
    发表于 01-04 07:57

    MSP430F449在超低功耗高精度雷达液位仪中的应用

    MSP430F449在超低功耗高精度雷达液位仪中的应用 MSP430F449系列是TI公司的超低功耗单片机系列产品。
    发表于 03-22 11:33 41次下载

    基于MSP430F449的悬挂运动控制系统设计

    以低功耗 MSP430F449 单片机系统平台为控制核心,由步进电机控制模块、红外传感和人机交互3个功能部分组成。由MSP430F449实现
    发表于 06-08 16:17 63次下载
    基于<b class='flag-5'>MSP430F449</b>的悬挂运动控制<b class='flag-5'>系统</b>设计

    基于单片机MSP430F449的宽带直流放大器设计

    利用单片机MSP430F449设计宽带直流放大器。采用单片机MSP430F449作为宽带直流放大器的控制芯片,利用三级放大器级联的形式实现
    发表于 07-24 15:26 62次下载
    基于<b class='flag-5'>单片机</b><b class='flag-5'>MSP430F449</b>的宽带直流放大器设计

    MSP430F449在微型化低功耗数据采集模块中的应用

    MSP430F449在微型化低功耗数据采集模块中的应用。
    发表于 02-17 09:45 5次下载

    基于MSP430F449单片机的USB通用串行总线设计

    基于MSP430F449单片机的USB通用串行总线设计。
    发表于 02-17 09:56 6次下载

    基于MSP430F449单片机的超温报警系统

    基于MSP430F449单片机的超温报警系统
    发表于 02-17 09:56 10次下载

    基于MSP430F449单片机数据采集实验设计

    基于MSP430F449单片机数据采集实验设计
    发表于 02-17 09:56 8次下载

    基于MSP430F449的电话音识别及数据/语音报警监控系统

    基于MSP430F449的电话音识别及数据/语音报警监控系统
    发表于 02-17 09:55 15次下载

    MSP430F449设计的开发板程序

    MSP430F449设计的开发板程序,下来看看
    发表于 05-25 10:51 62次下载

    基于高性能、低功耗16 位单片机MSP430F449 设计的电导率检测装置的测量原理

    基于高性能、低功耗16 位单片机MSP430F449 设计的电导率检测装置的测量原理
    发表于 10-13 08:39 12次下载
    基于高性能、低功耗16 位<b class='flag-5'>单片机</b><b class='flag-5'>MSP430F449</b> 设计的电导率检测装置的测量原理

    MSP430单片机的风力数据采集系统详析

    2 个单片机协同工作 从 MSP430F149 负责数据采集、计算与分析 主机MSP430F449 负责
    发表于 04-19 09:03 2次下载
    双<b class='flag-5'>MSP430</b><b class='flag-5'>单片机</b>的风力<b class='flag-5'>数据</b>采集<b class='flag-5'>系统</b>详析

    基于单片机MSP430F449的宽带直流放大器设计---王鹏云

    ,利用三级放大器级联的形式实现对输入小信号的放大。其中MSP430F449单片机来控制双路数模转换器TLV5638实现AD603的程控增益调节和整体后级放大模块引入的直流的软件补偿,并
    发表于 09-18 14:02 2次下载
    基于<b class='flag-5'>单片机</b><b class='flag-5'>MSP430F449</b>的宽带直流放大器设计---王鹏云