在數(shù)據(jù)采集和測(cè)量?jī)x器尤其是便攜式設(shè)備中,數(shù)據(jù)存儲(chǔ)和傳輸是不可避免的問題,近年來TI公司推出的低功耗微控制器MSP430,在儀器設(shè)計(jì)和制造領(lǐng)域引起巨大變革,新型控制器和大容量串行存儲(chǔ)器的應(yīng)用大大提高產(chǎn)品了的性能。本文主要解決兩個(gè)問題
1 解決經(jīng)過MSP430采集后的數(shù)據(jù)與EEPROM24C256的數(shù)據(jù)接口問題,也就是數(shù)據(jù)存儲(chǔ)問題;
2 解決EEPROM與上位機(jī)(普通微機(jī))的數(shù)據(jù)通信問題,也就是存儲(chǔ)后的數(shù)據(jù)上傳問題。
首先對(duì)主要的集成電路做簡(jiǎn)單介紹
MSP430F449簡(jiǎn)介
MSP430F449是MSP430系列中的一種,MSP430系列是一種具有集成度高,功能豐富、功耗低等特點(diǎn)的16位單片機(jī)。它的集成調(diào)試環(huán)境Embedded Workbench 提供了良好的C語言開發(fā)平臺(tái)。設(shè)計(jì)中基于程序的復(fù)雜性和程序容量大的要求選擇了MSP430F449,這款芯片具有64K程序存儲(chǔ)器,可以滿足大部分復(fù)雜控制的需要;它的封裝100-PIN QFP具有良好的互換性,與MSP430F437 、MSP430F435等芯片具有完全一致的管腳可以在程序量上進(jìn)行合理選擇。
24C256簡(jiǎn)介
24C256是支持I2C協(xié)議的串行EEPROM,容量32768字節(jié)。

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

圖1 MSP430F449 接口原理圖
數(shù)據(jù)的采集多種多樣,可以經(jīng)過片內(nèi)的ADC轉(zhuǎn)換器對(duì)模擬量進(jìn)行采集,也可以通過獨(dú)立的端口控制線對(duì)特殊的傳感器比如溫度傳感器、壓力傳感器等進(jìn)行數(shù)據(jù)轉(zhuǎn)換,這不作為本文介紹的內(nèi)容。本文主要是針對(duì)不同的采集過程完成后數(shù)據(jù)的存儲(chǔ)和傳輸處理。
數(shù)據(jù)自動(dòng)存儲(chǔ)的客觀要求
在許多測(cè)量過程中,不僅要求讀取簡(jiǎn)單的儀表值,而且還需要對(duì)一段時(shí)間的數(shù)據(jù)進(jìn)行科學(xué)的分析和處理以取得預(yù)測(cè)和分析的目的。在這種情況下,可能要求測(cè)量時(shí)間長(zhǎng),采集要求自動(dòng)進(jìn)行,無需人工值守,所以數(shù)據(jù)必須自動(dòng)存儲(chǔ);另一個(gè)原因,采集數(shù)據(jù)的頻率比較高,人的觀察不能滿足實(shí)際需要,這就要求對(duì)采集的數(shù)據(jù)進(jìn)行有效的存儲(chǔ)。
集成電路合理選擇
有很多大容量的FLASH芯片已經(jīng)得到廣泛應(yīng)用,但是這類芯片口線較多,需要占用較多的控制器資源,在控制外圍器件多,接口復(fù)雜的情況下,特別是便攜式儀器功能全、體積小,為了精簡(jiǎn)外圍電路,在不影響存儲(chǔ)量的情況下,具有I2C接口的串行EEPROM就成為了最佳選擇。
24C256程序控制原理
24C256是具有I2C接口的512x64存儲(chǔ)器,在數(shù)據(jù)的存儲(chǔ)過程中除了遵循I2C協(xié)議必須的邏輯以外,一個(gè)最容易忽視并且最容易導(dǎo)致出錯(cuò)的問題就是存儲(chǔ)地址問題。
24C256的數(shù)據(jù)容量是32768,即可以存儲(chǔ)的有效字節(jié)數(shù)。所以它的地址是16位整型數(shù),有效范圍是0~32768,數(shù)據(jù)字節(jié)為單位存儲(chǔ),在16位地址其中有效數(shù)據(jù)只有15位,低6(0~5)位地址表示的容量是0~63,然后連續(xù)的9(6~14)位地址表示頁碼的范圍是0~511,在數(shù)據(jù)連續(xù)存儲(chǔ)過程中,相同的頁面內(nèi),存儲(chǔ)地址自動(dòng)完成累加過程;數(shù)據(jù)在不同頁面的存儲(chǔ)時(shí),地址不能自動(dòng)累加,如果不做正確處理,數(shù)據(jù)將從本頁開始的地址重新開始覆蓋已經(jīng)存在的數(shù)據(jù)。例如,地址是63(二進(jìn)制碼111111)表示的是第0頁的最后一個(gè)存儲(chǔ)空間,地址64(二進(jìn)制碼1,000000)表示第1頁最開始的存儲(chǔ)空間。在當(dāng)前存儲(chǔ)地址是63時(shí)如果該器件處于連續(xù)存儲(chǔ)模式下,數(shù)據(jù)將出錯(cuò)。
原因是什么呢? 24C256支持?jǐn)?shù)據(jù)的連續(xù)存儲(chǔ),最大的存貯數(shù)量是64即一頁的內(nèi)容,如果在地址選擇上超過了這個(gè)限制,數(shù)據(jù)將會(huì)覆蓋本頁開始的位置重新存儲(chǔ),這就造成數(shù)據(jù)的錯(cuò)誤,在使用上,雖然數(shù)據(jù)是分頁存儲(chǔ)的,但在形式上是連續(xù)數(shù)據(jù),所以存儲(chǔ)中不需要特意區(qū)分頁地址和頁內(nèi)地址。
在連續(xù)存儲(chǔ)中,盡管數(shù)據(jù)每次存儲(chǔ)的數(shù)量小于64,數(shù)據(jù)也可能出錯(cuò),例如每次存儲(chǔ)數(shù)量為11,地址的變化是0,11,22,33,44,55,66……,看上去沒有什么問題,地址是按照每次11遞增的,然而存儲(chǔ)的結(jié)果還是出錯(cuò)了,原因是什么呢?在地址55開始的空間無法提供連續(xù)11個(gè)頁內(nèi)存儲(chǔ)空間,當(dāng)?shù)刂吩黾拥?3以后數(shù)據(jù)又從該頁0地址重新開始,從而導(dǎo)致數(shù)據(jù)儲(chǔ)存的錯(cuò)誤。有效的解決辦法是如果使用連續(xù)存儲(chǔ)模式,地址的安排上要使存儲(chǔ)塊的大小為64,32,16,8,4,2此外都不能使用連續(xù)地址存儲(chǔ)。如果數(shù)據(jù)采集中的有效數(shù)據(jù)位小于64,比如每次采集的結(jié)果是30字節(jié),在連續(xù)存儲(chǔ)模式下要按照32為單位存儲(chǔ),不足的字節(jié)補(bǔ)零處理。
以下是24C256數(shù)據(jù)傳輸基本控制模塊
// 延時(shí)處理模塊
void IIC_Delay(void)
{
_NOP();
_NOP(); <





