在數(shù)據(jù)采集設(shè)備以及具有相關(guān)功能的儀器設(shè)計(jì)中,數(shù)據(jù)的存儲和傳輸是一個(gè)非常重要的環(huán)節(jié),,本文在成功實(shí)踐的基礎(chǔ)上,,介紹微控制器MSP430F449實(shí)現(xiàn)數(shù)據(jù)的采集后的數(shù)據(jù)存儲及與上位機(jī)數(shù)據(jù)通信的相關(guān)內(nèi)容。文中給出了實(shí)用的硬件電路和部分軟件代碼,,詳細(xì)講解了在數(shù)據(jù)存儲中需要注意的一些環(huán)節(jié),。
在數(shù)據(jù)采集和測量儀器尤其是便攜式設(shè)備中,數(shù)據(jù)存儲和傳輸是不可避免的問題,,近年來TI公司推出的低功耗微控制器MSP430,,在儀器設(shè)計(jì)和制造領(lǐng)域引起巨大變革,新型控制器和大容量串行存儲器的應(yīng)用大大提高產(chǎn)品了的性能,。本文主要解決兩個(gè)問題
1 解決經(jīng)過MSP430采集后的數(shù)據(jù)與EEPROM24C256的數(shù)據(jù)接口問題,,也就是數(shù)據(jù)存儲問題;
2 解決EEPROM與上位機(jī)(普通微機(jī))的數(shù)據(jù)通信問題,,也就是存儲后的數(shù)據(jù)上傳問題,。
首先對主要的集成電路做簡單介紹
MSP430F449簡介
MSP430F449是MSP430系列中的一種,MSP430系列是一種具有集成度高,,功能豐富,、功耗低等特點(diǎn)的16位單片機(jī)。它的集成調(diào)試環(huán)境Embedded Workbench 提供了良好的C語言開發(fā)平臺,。設(shè)計(jì)中基于程序的復(fù)雜性和程序容量大的要求選擇了MSP430F449,,這款芯片具有64K程序存儲器,,可以滿足大部分復(fù)雜控制的需要,;它的封裝100-PIN QFP具有良好的互換性,與MSP430F437 ,、MSP430F435等芯片具有完全一致的管腳可以在程序量上進(jìn)行合理選擇,。
24C256簡介
24C256是支持I2C協(xié)議的串行EEPROM,容量32768字節(jié),。
以上是24C256的管腳圖,,其中A0,A1,,A2構(gòu)成存儲器的物理地址,,作為I2C總線上區(qū)分不同存儲器的控制地址,可以在I2C總線上同時(shí)連接8個(gè)設(shè)備,。 WP是寫保護(hù),,高電平將禁止對器件的寫操作;SCL和SDA是數(shù)據(jù)傳輸?shù)目刂凭€,,其中SCL是時(shí)鐘,,SDA是雙向數(shù)據(jù)線,用來完成數(shù)據(jù)的寫入和讀出,數(shù)據(jù)的傳輸按照I2C協(xié)議的要求由時(shí)鐘端SCL配合共同完成,。
CP2102簡介
CP2102是USB到UART的橋接電路,,完成USB數(shù)據(jù)和UART數(shù)據(jù)的轉(zhuǎn)換,電路連接簡單,,數(shù)據(jù)傳輸可靠,,把下位機(jī)串行數(shù)據(jù)轉(zhuǎn)換成USB數(shù)據(jù)格式,方便實(shí)現(xiàn)數(shù)據(jù)通信,,在上位機(jī)上通過運(yùn)行該芯片的驅(qū)動程序把USB數(shù)據(jù)可以按照簡單的串口進(jìn)行讀寫操作編程簡單,,操作靈活。
圖1 MSP430F449 接口原理圖
以上是MSP430F449與EEPROM以及CP2102的接口原理圖,,本文重點(diǎn)在于介紹數(shù)據(jù)采集過程完成以后的數(shù)據(jù)存貯和數(shù)據(jù)傳輸,。
數(shù)據(jù)的采集多種多樣,可以經(jīng)過片內(nèi)的ADC轉(zhuǎn)換器對模擬量進(jìn)行采集,,也可以通過獨(dú)立的端口控制線對特殊的傳感器比如溫度傳感器,、壓力傳感器等進(jìn)行數(shù)據(jù)轉(zhuǎn)換,這不作為本文介紹的內(nèi)容,。本文主要是針對不同的采集過程完成后數(shù)據(jù)的存儲和傳輸處理,。
數(shù)據(jù)自動存儲的客觀要求
在許多測量過程中,不僅要求讀取簡單的儀表值,,而且還需要對一段時(shí)間的數(shù)據(jù)進(jìn)行科學(xué)的分析和處理以取得預(yù)測和分析的目的,。在這種情況下,可能要求測量時(shí)間長,,采集要求自動進(jìn)行,,無需人工值守,所以數(shù)據(jù)必須自動存儲,;另一個(gè)原因,,采集數(shù)據(jù)的頻率比較高,人的觀察不能滿足實(shí)際需要,,這就要求對采集的數(shù)據(jù)進(jìn)行有效的存儲,。
集成電路合理選擇
有很多大容量的FLASH芯片已經(jīng)得到廣泛應(yīng)用,但是這類芯片口線較多,,需要占用較多的控制器資源,,在控制外圍器件多,接口復(fù)雜的情況下,,特別是便攜式儀器功能全,、體積小,為了精簡外圍電路,,在不影響存儲量的情況下,,具有I2C接口的串行EEPROM就成為了最佳選擇,。
24C256程序控制原理
24C256是具有I2C接口的512x64存儲器,在數(shù)據(jù)的存儲過程中除了遵循I2C協(xié)議必須的邏輯以外,,一個(gè)最容易忽視并且最容易導(dǎo)致出錯的問題就是存儲地址問題,。
24C256的數(shù)據(jù)容量是32768,即可以存儲的有效字節(jié)數(shù),。所以它的地址是16位整型數(shù),有效范圍是0~32768,,數(shù)據(jù)字節(jié)為單位存儲,在16位地址其中有效數(shù)據(jù)只有15位,,低6(0~5)位地址表示的容量是0~63,,然后連續(xù)的9(6~14)位地址表示頁碼的范圍是0~511,在數(shù)據(jù)連續(xù)存儲過程中,,相同的頁面內(nèi),,存儲地址自動完成累加過程;數(shù)據(jù)在不同頁面的存儲時(shí),,地址不能自動累加,,如果不做正確處理,數(shù)據(jù)將從本頁開始的地址重新開始覆蓋已經(jīng)存在的數(shù)據(jù),。例如,,地址是63(二進(jìn)制碼111111)表示的是第0頁的最后一個(gè)存儲空間,地址64(二進(jìn)制碼1,000000)表示第1頁最開始的存儲空間,。在當(dāng)前存儲地址是63時(shí)如果該器件處于連續(xù)存儲模式下,,數(shù)據(jù)將出錯。
原因是什么呢,? 24C256支持?jǐn)?shù)據(jù)的連續(xù)存儲,,最大的存貯數(shù)量是64即一頁的內(nèi)容,如果在地址選擇上超過了這個(gè)限制,,數(shù)據(jù)將會覆蓋本頁開始的位置重新存儲,,這就造成數(shù)據(jù)的錯誤,,在使用上,,雖然數(shù)據(jù)是分頁存儲的,但在形式上是連續(xù)數(shù)據(jù),,所以存儲中不需要特意區(qū)分頁地址和頁內(nèi)地址,。
在連續(xù)存儲中,盡管數(shù)據(jù)每次存儲的數(shù)量小于64,,數(shù)據(jù)也可能出錯,,例如每次存儲數(shù)量為11,地址的變化是0,,11,,22,,33,44,,55,,66……,看上去沒有什么問題,,地址是按照每次11遞增的,,然而存儲的結(jié)果還是出錯了,原因是什么呢,?在地址55開始的空間無法提供連續(xù)11個(gè)頁內(nèi)存儲空間,,當(dāng)?shù)刂吩黾拥?3以后數(shù)據(jù)又從該頁0地址重新開始,從而導(dǎo)致數(shù)據(jù)儲存的錯誤,。有效的解決辦法是如果使用連續(xù)存儲模式,,地址的安排上要使存儲塊的大小為64,32,,16,,8,4,,2此外都不能使用連續(xù)地址存儲,。如果數(shù)據(jù)采集中的有效數(shù)據(jù)位小于64,比如每次采集的結(jié)果是30字節(jié),,在連續(xù)存儲模式下要按照32為單位存儲,,不足的字節(jié)補(bǔ)零處理。
以下是24C256數(shù)據(jù)傳輸基本控制模塊
// 延時(shí)處理模塊
void IIC_Delay(void)
{
_NOP();
_NOP();
_NOP();
}
// 啟動I2C模塊
void start_IIC(void) // 啟動I2
{
P2OUT&=0xf9; //設(shè)置P2輸出
P2DIR&=0XFD; //SDA=1, 上拉電阻使得P2.1為H,,F(xiàn)D=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.1為H,,F(xiàn)D=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.1為H,F(xiàn)D=1111,1101
IIC_Delay();
P2DIR&=0XFB;//SCL=1 FB="1111",1011
IIC_Delay();
P2DIR|=0X04;// SCL="0"
}
// 發(fā)送單字符數(shù)據(jù)
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;
}
}
// 讀單字符數(shù)據(jù)
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;
}
// & 檢查應(yīng)答信號模塊
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();
}
// 拒絕應(yīng)答模塊
void iic_NACK(void) & nbsp; {
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();//
}
// 寫連續(xù)數(shù)據(jù)模塊
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ā)送應(yīng)答模塊: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();
}
// 連續(xù)讀字符模塊
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();
}
數(shù)據(jù)的傳輸
數(shù)據(jù)傳輸是存儲在EEPROM中的數(shù)據(jù)到達(dá)計(jì)算機(jī)的有效途徑,,數(shù)據(jù)上傳到計(jì)算機(jī)最常用的是串行(RS232)接口,,
現(xiàn)在由于USB計(jì)數(shù)的不斷成熟,通過USB可以方便快捷實(shí)現(xiàn)數(shù)據(jù)傳輸,,而且可以滿足速率和設(shè)備外觀的要求,,但是USB的驅(qū)動程序設(shè)計(jì)是比較復(fù)雜的工作,本例中使用簡單的橋接電路,,把UART接口的數(shù)據(jù)經(jīng)過CP2102的橋接,,直接實(shí)現(xiàn)數(shù)據(jù)的USB轉(zhuǎn)換,從430F449異步串口輸出的數(shù)據(jù)自動轉(zhuǎn)化為符合USB協(xié)議的數(shù)據(jù)直接連接到計(jì)算機(jī)的USB口,,上位機(jī)應(yīng)用程序通過CP2102的驅(qū)動程序可以象操作串口一樣直接讀寫端口數(shù)據(jù),。
結(jié)論
以上的硬件設(shè)計(jì)比較簡單可靠,可以照搬到同類型的控制芯片上,,軟件代碼也同樣具有較好的移植性,,只要把控制時(shí)鐘和數(shù)據(jù)端口和程序軟件設(shè)置相一致即可,。
參考文獻(xiàn):
1、MSP430系列16位超低功耗單片機(jī)實(shí)踐與系統(tǒng)設(shè)計(jì)《清華大學(xué)出版社》
2,、MSP430系列單片機(jī)接口計(jì)數(shù)及系統(tǒng)設(shè)計(jì)實(shí)例《北京航天航空大學(xué)出版社》
3,、MSP430系列單片機(jī)C語言程序設(shè)計(jì)與開發(fā)《北京航天航空大學(xué)出版社》