<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>
關(guān) 閉

新聞中心

EEPW首頁(yè) > 工控自動(dòng)化 > 設計應用 > 基于MSP430F449的數據存儲和USB串行通信實(shí)現

基于MSP430F449的數據存儲和USB串行通信實(shí)現

作者: 時(shí)間:2007-06-14 來(lái)源:網(wǎng)絡(luò ) 收藏

摘要:在數據采集設備以及具有相關(guān)功能的儀器設計中,數據的存儲和傳輸是一個(gè)非常重要的環(huán)節,本文在成功實(shí)踐的基礎上,介紹微控制器F449實(shí)現數據的采集后的數據存儲及與上位機數據通信的相關(guān)內容。文中給出了實(shí)用的硬件電路和部分軟件代碼,詳細講解了在數據存儲中需要注意的一些環(huán)節。
關(guān)鍵詞,USB,I2C

在數據采集和測量?jì)x器尤其是便攜式設備中,數據存儲和傳輸是不可避免的問(wèn)題,近年來(lái)TI公司推出的低功耗微控制器,在儀器設計和制造領(lǐng)域引起巨大變革,新型控制器和大容量串行存儲器的應用大大提高產(chǎn)品了的性能。本文主要解決兩個(gè)問(wèn)題

1 解決經(jīng)過(guò)MSP430采集后的數據與EEPROM24C256的數據接口問(wèn)題,也就是數據存儲問(wèn)題;

2 解決EEPROM與上位機(普通微機)的數據通信問(wèn)題,也就是存儲后的數據上傳問(wèn)題。

首先對主要的集成電路做簡(jiǎn)單介紹

MSP449簡(jiǎn)介

MSP449MSP430系列中的一種,MSP430系列是一種具有集成度高,功能豐富、功耗低等特點(diǎn)的16位單片機。它的集成調試環(huán)境Embedded Workbench 提供了良好的C語(yǔ)言開(kāi)發(fā)平臺。設計中基于程序的復雜性和程序容量大的要求選擇了MSP430,這款芯片具有64K程序存儲器,可以滿(mǎn)足大部分復雜控制的需要;它的封裝100PIN QFP具有良好的互換性,與MSP430F437 、MSP430F435等芯片具有完全一致的管腳可以在程序量上進(jìn)行合理選擇。

24C256簡(jiǎn)介

24C256是支持I2C協(xié)議的串行EEPROM,容量32768字節。

以上是24C256的管腳圖,其中A0,A1,A2構成存儲器的物理地址,作為I2C總線(xiàn)上區分不同存儲器的控制地址,可以在I2C總線(xiàn)上同時(shí)連接8個(gè)設備。 WP是寫(xiě)保護,高電平將禁止對器件的寫(xiě)操作;SCLSDA是數據傳輸的控制線(xiàn),其中SCL是時(shí)鐘,SDA是雙向數據線(xiàn),用來(lái)完成數據的寫(xiě)入和讀出,數據的傳輸按照I2C協(xié)議的要求由時(shí)鐘端SCL配合共同完成。

CP2102簡(jiǎn)介

CP2102USBUART的橋接電路,完成USB數據和UART數據的轉換,電路連接簡(jiǎn)單,數據傳輸可靠,把下位機串行數據轉換成USB數據格式,方便實(shí)現數據通信,在上位機上通過(guò)運行該芯片的驅動(dòng)程序把USB數據可以按照簡(jiǎn)單的串口進(jìn)行讀寫(xiě)操作編程簡(jiǎn)單,操作靈活。

1 MSP430 接口原理圖

以上是MSP430EEPROM以及CP2102的接口原理圖,本文重點(diǎn)在于介紹數據采集過(guò)程完成以后的數據存貯和數據傳輸。

數據的采集多種多樣,可以經(jīng)過(guò)片內的ADC轉換器對模擬量進(jìn)行采集,也可以通過(guò)獨立的端口控制線(xiàn)對特殊的傳感器比如溫度傳感器、壓力傳感器等進(jìn)行數據轉換,這不作為本文介紹的內容。本文主要是針對不同的采集過(guò)程完成后數據的存儲和傳輸處理。

數據自動(dòng)存儲的客觀(guān)要求

在許多測量過(guò)程中,不僅要求讀取簡(jiǎn)單的儀表值,而且還需要對一段時(shí)間的數據進(jìn)行科學(xué)的分析和處理以取得預測和分析的目的。在這種情況下,可能要求測量時(shí)間長(cháng),采集要求自動(dòng)進(jìn)行,無(wú)需人工值守,所以數據必須自動(dòng)存儲;另一個(gè)原因,采集數據的頻率比較高,人的觀(guān)察不能滿(mǎn)足實(shí)際需要,這就要求對采集的數據進(jìn)行有效的存儲。

集成電路合理選擇

有很多大容量的FLASH芯片已經(jīng)得到廣泛應用,但是這類(lèi)芯片口線(xiàn)較多,需要占用較多的控制器資源,在控制外圍器件多,接口復雜的情況下,特別是便攜式儀器功能全、體積小,為了精簡(jiǎn)外圍電路,在不影響存儲量的情況下,具有I2C接口的串行EEPROM就成為了最佳選擇。

24C256程序控制原理

24C256是具有I2C接口的512x64存儲器,在數據的存儲過(guò)程中除了遵循I2C協(xié)議必須的邏輯以外,一個(gè)最容易忽視并且最容易導致出錯的問(wèn)題就是存儲地址問(wèn)題。

24C256的數據容量是32768,即可以存儲的有效字節數。所以它的地址是16位整型數,有效范圍是032768,數據字節為單位存儲,在16位地址其中有效數據只有15位,低605)位地址表示的容量是063,然后連續的9614)位地址表示頁(yè)碼的范圍是0511,在數據連續存儲過(guò)程中,相同的頁(yè)面內,存儲地址自動(dòng)完成累加過(guò)程;數據在不同頁(yè)面的存儲時(shí),地址不能自動(dòng)累加,如果不做正確處理,數據將從本頁(yè)開(kāi)始的地址重新開(kāi)始覆蓋已經(jīng)存在的數據。例如,地址是63(二進(jìn)制碼111111)表示的是第0頁(yè)的最后一個(gè)存儲空間,地址64(二進(jìn)制碼1,000000)表示第1頁(yè)最開(kāi)始的存儲空間。在當前存儲地址是63時(shí)如果該器件處于連續存儲模式下,數據將出錯。

原因是什么呢? 24C256支持數據的連續存儲,最大的存貯數量是64即一頁(yè)的內容,如果在地址選擇上超過(guò)了這個(gè)限制,數據將會(huì )覆蓋本頁(yè)開(kāi)始的位置重新存儲,這就造成數據的錯誤,在使用上,雖然數據是分頁(yè)存儲的,但在形式上是連續數據,所以存儲中不需要特意區分頁(yè)地址和頁(yè)內地址。

在連續存儲中,盡管數據每次存儲的數量小于64,數據也可能出錯,例如每次存儲數量為11,地址的變化是0,11,22,33,44,55,66……,看上去沒(méi)有什么問(wèn)題,地址是按照每次11遞增的,然而存儲的結果還是出錯了,原因是什么呢?在地址55開(kāi)始的空間無(wú)法提供連續11個(gè)頁(yè)內存儲空間,當地址增加到63以后數據又從該頁(yè)0地址重新開(kāi)始,從而導致數據儲存的錯誤。有效的解決辦法是如果使用連續存儲模式,地址的安排上要使存儲塊的大小為64,32,16,8,4,2此外都不能使用連續地址存儲。如果數據采集中的有效數據位小于64,比如每次采集的結果是30字節,在連續存儲模式下要按照32為單位存儲,不足的字節補零處理。

以下是24C256數據傳輸基本控制模塊

Ø 延時(shí)處理模塊

void IIC_Delay(void)

{

_NOP();

_NOP();

_NOP();

}

Ø 啟動(dòng)I2C模塊

void start_IIC(void) // 啟動(dòng)I2

{

P2OUT=0xf9; //設置P2輸出

P2DIR=0XFD; //SDA=1, 上拉電阻使得P2.1H,FD=1111,1101

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

P2DIR|=0X02; // SDA=0

P2DIR|=0X04; // SCL=0

}

Ø 停止I2C模塊

void stop_IIC(void) //

{

P2DIR|=0X02;//SDA=0

IIC_Delay();

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

P2DIR=0XFD;//SDA=1, 上拉電阻使得P2.1H,FD=1111,1101

IIC_Delay();

P2DIR|=0X04;// SCL=0

}

Ø 發(fā)送 0”模塊

void send_zero(void) //

{

P2DIR|=0X02;// SDA=0

IIC_Delay();

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

IIC_Delay();

P2DIR|=0X04;// SCL=0

}

Ø 發(fā)送 1模塊

void send_one(void) //

{

P2DIR=0XFD;//SDA=1, 上拉電阻使得P2.1H,FD=1111,1101

IIC_Delay();

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

IIC_Delay();

P2DIR|=0X04;// SCL=0

}

Ø 發(fā)送單字符數據

void send _char(unsigned char data_out) //

{

unsigned char i,tmp=0x80;

for(i=0;i8;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;i8;i++)

{

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

IIC_Delay();//

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

IIC_Delay();

if((P2IN0x02)>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((P2INBIT1)==BIT1);

P2DIR|=0X04;// SCL=0

IIC_Delay();

}

Ø 拒絕應答模塊

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();//

}

Ø 寫(xiě)連續數據模塊

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);

}

Ø 發(fā)送應答模塊: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計數的不斷成熟,通過(guò)USB可以方便快捷實(shí)現數據傳輸,而且可以滿(mǎn)足速率和設備外觀(guān)的要求,但是USB的驅動(dòng)程序設計是比較復雜的工作,本例中使用簡(jiǎn)單的橋接電路,把UART接口的數據經(jīng)過(guò)CP2102的橋接,直接實(shí)現數據的USB轉換,從430F449異步串口輸出的數據自動(dòng)轉化為符合USB協(xié)議的數據直接連接到計算機的USB口,上位機應用程序通過(guò)CP2102的驅動(dòng)程序可以象操作串口一樣直接讀寫(xiě)端口數據。

結論

以上的硬件設計比較簡(jiǎn)單可靠,可以照搬到同類(lèi)型的控制芯片上,軟件代碼也同樣具有較好的移植性,只要把控制時(shí)鐘和數據端口和程序軟件設置相一致即可。

參考文獻:

1、MSP430系列16位超低功耗單片機實(shí)踐與系統設計《清華大學(xué)出版社》
2、MSP430系列單片機接口計數及系統設計實(shí)例《北京航天航空大學(xué)出版社》
3、MSP430系列單片機C語(yǔ)言程序設計與開(kāi)發(fā)《北京航天航空大學(xué)出版社》



關(guān)鍵詞: 430F F449 MSP 430

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>