新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 利用ST16C554D實現DSP多路串行通訊

        利用ST16C554D實現DSP多路串行通訊

        作者:付強文 張英敏 黎玉剛 時間:2005-03-23 來源: 收藏

        2004年11月A版

        本文引用地址:http://www.104case.com/article/4686.htm

        摘  要:    給出了DSP多路串行通信系統的構成及相關程序代碼。
        關鍵詞:    DSP;串行通訊;ST16C554D;TMS320VC33
        引言
            DSP是數字信號處理理論與超大規模集成電路技術融合的結晶。目前,DSP技術正廣泛地應用于通信、語音、圖像、航空航天、儀器儀表等領域,在推動信息處理數字化方面發揮著越來越大的作用。隨著應用領域越來越廣,應用環境也越來越復雜,如何實現DSP與外設的可靠數據交換就變得至關重要。串行通訊成本低,結構簡單,控制方便,DSP和外設的通訊通常都采用這種方式。
            TMS320VC33是TI公司一種浮點DSP芯片,性價比高,指令執行速度可達150 MFLOPS。但是為了不使其強大的計算能力受到影響,TMS320VC33僅提供了一個串口,要實現多路串行通訊,就必須通過外部器件來擴展。

        ST16C554D
            ST16C554D是EXAR公司生產的通用異步通信芯片,可支持4路獨立的串行通訊。芯片的每路傳輸和接收單元都提供了獨立的串并轉換和并串轉換,以實現串行異步數據接收同步。串行數據流的同步通過添加起始位和停止位實現,而數據的完整性通過校驗位來確認,在同一塊芯片上要集成這種多路串行通訊是較為復雜的,ST16C554D采用了先進的CMOS處理技術,達到了低損耗和高速率的要求。
            與普通處理器相比,ST16C554D提供了16字節的接收和發送FIFO,這就允許外部CPU在給定的時間內處理更多的在線任務,并減少了全局的UART中斷服務時間。
        另外,ST16C554D將16C554D和68C554D的兩種封裝集成在同一個芯片上,使用方便。16模式用于與INTEL系列芯片接口,而68模式用于與MOTOROLA和其他通用接口。
        ST16C554D特性有:

        TMS320VC33多路通訊系統的實現
            圖1是某捷聯慣性導航系統的部分原理框圖,通過ST16C554D實現了DSP芯片TMS320VC33的多路串行通訊。圖中三個陀螺為光纖陀螺,陀螺數據采用RS-422串行輸出,輸出周期為1ms。
            圖中,ST16C554D的讀寫信號和通道片選由DSP的選通信號STRB、地址信號A3-A6及讀寫信號R/W產生。為了使整個系統成為完全可編程系統,采用了一片可編程邏輯器件GAL20V8B來實現邏輯控制,從而增加了系統的靈活性。GAL芯片采用ABEL語言編程。ST16C554D譯碼電路的邏輯方程如下:
        EQUATIONS
              !CSA=!PAGE3&!AR6&!AR5&!AR4!&!AR3;
              !CSB=!PAGE3&!AR6&!AR5&!AR4&AR3;


              !CSC=!PAGE3&!AR6&!AR5&AR4&!AR3;
              !CSD=!PAGE3&!AR6&!AR5&AR4&AR3;
              !IOR=!PAGE3&RW&!STRB;
              !IOW=!PAGE3&!RW&!STRB;
            本系統中,ST16C554D的通道D用作監控口和PC機接連,通道A、B、C的接收端用于接收陀螺數據,通道C的發送端也與PC機相連,可在通道D的監控下高速發送各陀螺的原始數據。例如,PC機向通道D發送指令“$A#”,DSP接收到該指令后將X陀螺的原始采樣數據從通道C高速發送至PC機。
            通道D采用RS-232方式,波特率為19.2Kbps,用MAX232實現電平轉換后可直接和PC機串口連接。通道A、B、C采用RS-422方式,波特率為460.8Kbps,可用MAX3095芯片做接收電平轉換,用MAX3045芯片做發送電平驅動。考慮通道C發送端要和PC機相連,而PC機串口僅支持RS-232協議,故系統使用了PCI1601轉換卡。PCI1601帶有兩個9針的RS-422串口,采用PCI總線和PC機相連,安裝驅動后使用方法和普通PC機串口一致,波特率可達921.6Kbps。
            在串行通訊中,為了保證傳輸可靠性和數據實時性,發送常采用查詢方式,接收常采用中斷方式。但在本系統中,TMS320VC33要執行導航解算程序,若4路接收均采用中斷方式會嚴重影響它的計算能力。考慮A、B、C口陀螺數據爆發周期固定為1ms,且D口由PC機發來的監控指令數據量不大,接收可采用定時查詢方式。
            系統中三個陀螺通過1KHz時鐘實現同步。陀螺數據每幀包含7個字節,傳輸波特率460.8Kbps,采用偶校驗,8位數據位,1位停止位,故可以算出每次傳輸時間需要為(8+3)*7/460.8=0.167ms。所以系統將1KHz時鐘經SN54HC174J芯片延時0.2ms后作為TMS320VC33外接的定時時鐘。這樣,TMS320VC33在INT0產生1ms中斷時,數據已傳輸完成,可以在中斷服務函數中將所有通道的寄存器查詢一遍并讀空數據。由于ST16C554D的每路串口有16字長的接收FIFO,該方法不會產生數據丟失,并且延遲很小。

        程序設計
            在異步串行通訊中,收發雙方必須事先規定兩件事:一是字符格式,即規定傳送中每個字符的具體格式;二是波特率。這些規定是通過設置相關寄存器來實現的。
            本系統中,ST16C554D外接晶振7.3728MHz,基地址為0xC00000,由TMS320VC33編程實現它的初始化設置。TMS320VC33的程序在Code Composer C3X 下用C語言編寫,下面僅給出通道C的初始化代碼及收發程序,其他通道與此類似。
        #define C_rx_buf_size 100        //接收緩沖區大小
        #define C_tx_buf_size 100        //發送緩沖區大小
        unsigned char C_rx_buf[C_rx_buf_size];     //接收緩沖區
        unsigned char C_tx_buf[C_tx_buf_size];     //發送緩沖區
        unsigned int p_C_rx_w=0;         //接收緩沖區寫指針
        unsigned int p_C_tx_w=0, p_C_tx_r=0;    //發送緩沖區讀寫指針
        volatile int *Add_C_RHR = (volatile int *)0xC00010;     //C口基地址
        volatile int *Add_C_THR = (volatile int *)0xC00010;
        volatile int *Add_C_DLL = (volatile int *)0xC00010;
        volatile int *Add_C_IER = (volatile int *)0xC00011;
        volatile int *Add_C_DLM = (volatile int *)0xC00011;
        volatile int *Add_C_ISR = (volatile int *)0xC00012;
        volatile int *Add_C_FCR = (volatile int *)0xC00012;
        volatile int *Add_C_LCR = (volatile int *)0xC00013;
        volatile int *Add_C_MCR = (volatile int *)0xC00014;
        volatile int *Add_C_LSR = (volatile int *)0xC00015;
        volatile int *Add_C_MSR = (volatile int *)0xC00016;
        void init_ST16C554D_C( )     //串口C口的初始化函數
        {    *Add_C_LCR = 0x80;    //使能波特率因子寄存器
            *Add_C_DLM = 0x00;        
             *Add_C_DLL = 0x01;    //設置波特率為460800
                           (主頻7.3728M)
            *Add_C_LCR = 0x1b;    //選擇字長為8位,停止位為
                            1位,偶校驗
            *Add_C_FCR = 0x07;    //選擇FIFO MODE
            *Add_C_IER = 0x00;    //禁止中斷
            *Add_C_MCR = 0x08;    //選擇NORMAL MODE
        }
        void Read_ST16C554D_C( )//串口C口的接收函數,置于INT0中斷函數中
        {    while( (*Add_C_LSR) & 0x01 )      //判C口線狀態寄存器
             {      *( C_rx_buf + p_C_rx_w) = (*Add_C_RHR) & 0x0ff;                        //接收數據送接收緩沖區
                   p_C_rx_w ++;        //接收緩沖區指針加1
                   if(p_C_rx_w == C_rx_buf_size)    p_C_rx_w = 0;                        //接收緩沖區指針回零
              }
        }
        void C_tx_handle()        //串口C口的發送函數
        {    while(p_C_tx_r != p_C_tx_w)
            {    if( *Add_C_LSR & 0x20 )    //判C口線狀態寄存器
                {   *Add_C_THR = *(C_tx_buf + p_C_tx_r);                    //發送
                p_C_tx_r ++;                                 //發送緩沖區指針加1
                if( p_C_tx_r == C_tx_buf_size )    p_C_tx_r = 0;                    //發送緩沖區指針回零
                }
            }
        }

        結語
        在筆者開發的光纖陀螺捷聯式慣性導航系統中,通過使用ST16C554D擴展了4路串口,電路簡單,傳輸速率高,延時小,并且極大地減輕了主控計算機TMS320VC33的負擔。本設計,在通訊中各通道長期工作正常,完全達到了預期目的。

        參考文獻:
        1.  ST16C554D data manual. EXAR Corporation
        2.    TMS320VC33 Digital Signal Processor. Texas Instruments.2002

        圖1 多路通訊原理框圖

        數字通信相關文章:數字通信原理


        通信相關文章:通信原理




        關鍵詞:

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 绥中县| 波密县| 普兰店市| 万宁市| 廊坊市| 莱西市| 永吉县| 巨野县| 康定县| 彩票| 枣强县| 兴业县| 永州市| 油尖旺区| 正蓝旗| 嘉禾县| 莱阳市| 德安县| 白山市| 林口县| 晋城| 江达县| 青川县| 宜春市| 清水河县| 五大连池市| 临安市| 乐都县| 松溪县| 湟源县| 德化县| 普定县| 体育| 沂源县| 谢通门县| 抚松县| 常熟市| 浮梁县| 永城市| 荆门市| 清丰县|