關 閉

        新聞中心

        EEPW首頁 > 工控自動化 > 設計應用 > 基于MSP430F449的數(shù)據(jù)存儲和USB串行通信實現(xiàn)

        基于MSP430F449的數(shù)據(jù)存儲和USB串行通信實現(xiàn)

        作者: 時間:2007-06-14 來源:網(wǎng)絡 收藏

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

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

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

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

        首先對主要的集成電路做簡單介紹

        MSP449簡介

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

        24C256簡介

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

        以上是24C256的管腳圖,其中A0A1A2構(gòu)成存儲器的物理地址,作為I2C總線上區(qū)分不同存儲器的控制地址,可以在I2C總線上同時連接8個設備。 WP是寫保護,高電平將禁止對器件的寫操作;SCLSDA是數(shù)據(jù)傳輸?shù)目刂凭€,其中SCL是時鐘,SDA是雙向數(shù)據(jù)線,用來完成數(shù)據(jù)的寫入和讀出,數(shù)據(jù)的傳輸按照I2C協(xié)議的要求由時鐘端SCL配合共同完成。

        CP2102簡介

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

        1 MSP430 接口原理圖

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

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

        數(shù)據(jù)自動存儲的客觀要求

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

        集成電路合理選擇

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

        24C256程序控制原理

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

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

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

        在連續(xù)存儲中,盡管數(shù)據(jù)每次存儲的數(shù)量小于64,數(shù)據(jù)也可能出錯,例如每次存儲數(shù)量為11,地址的變化是0112233445566……,看上去沒有什么問題,地址是按照每次11遞增的,然而存儲的結(jié)果還是出錯了,原因是什么呢?在地址55開始的空間無法提供連續(xù)11個頁內(nèi)存儲空間,當?shù)刂吩黾拥?/SPAN>63以后數(shù)據(jù)又從該頁0地址重新開始,從而導致數(shù)據(jù)儲存的錯誤。有效的解決辦法是如果使用連續(xù)存儲模式,地址的安排上要使存儲塊的大小為643216842此外都不能使用連續(xù)地址存儲。如果數(shù)據(jù)采集中的有效數(shù)據(jù)位小于64,比如每次采集的結(jié)果是30字節(jié),在連續(xù)存儲模式下要按照32為單位存儲,不足的字節(jié)補零處理。

        以下是24C256數(shù)據(jù)傳輸基本控制模塊

        Ø 延時處理模塊

        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

        }

        Ø 停止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

        }

        Ø 發(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.1HFD=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;i8;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;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();//

        }

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

        結(jié)論

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

        參考文獻:

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



        關鍵詞: 430F F449 MSP 430

        評論


        相關推薦

        技術(shù)專區(qū)

        關閉
        主站蜘蛛池模板: 台中市| 泾源县| 华容县| 孝义市| 吉林市| 乡宁县| 洱源县| 芒康县| 宁城县| 余干县| 富民县| 黎城县| 漳州市| 垫江县| 大理市| 正宁县| 科技| 定州市| 台东市| 全南县| 遂川县| 明溪县| 竹山县| 长丰县| 乌兰浩特市| 利津县| 红安县| 朝阳市| 方正县| 龙胜| 会泽县| 富锦市| 伊吾县| 邓州市| 海晏县| 兰西县| 广汉市| 合作市| 阳城县| 新乡市| 永仁县|