| 
  |||||||||||
| 技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng) 驅(qū)動編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機(jī) | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計 | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe  | 
  
波特率自適應(yīng)技術(shù)在DSP5402上的應(yīng)用之C++測試程序 | 
  
| 作者:hotpower 欄目:DSP技術(shù) | 
/*------------------------------------------------- 波特率自適應(yīng)技術(shù)在DSP5402上的應(yīng)用之C++測試程序 菜農(nóng) HotPower@126.com 2005.6.33 21:58 于西安大雁塔村隊部 菜地: http://hotpower.21ic.org -------------------------------------------------*/ #include <cstdio> //C語言可以用stdio.h #include <cstring>//C語言可以用string.h #include "C5402DEF.h"//DSP菜鳥HotPower創(chuàng)建 #include "class.h" #define ccsdebug 1//1--IO模擬SPI; 0--硬件McBSP模塊 extern "C" interrupt void Timer0Isr();//注意加extern "C" extern "C" interrupt void Timer1Isr(); extern "C" interrupt void Eint0Isr(); extern "C" interrupt void Eint1Isr(); extern "C" interrupt void Eint2Isr(); extern "C" interrupt void Eint3Isr(); SystemObj::SystemObj(void) { Disable();//關(guān)中斷 SREG->IMR = 0x0000;// SREG->IFR = 0xffff;//清除 //設(shè)置0x0080為中斷向量表首址,在第2個128頁內(nèi)。 SREG->PMST = (0x01 << PMST_IPTR) | (1 << PMST_MP_MC) | (1 << PMST_OVLY); // SREG->PMST |= (1 << PMST_DROM);//數(shù)據(jù)可const. /*--------------------------------------------------------------------------- 若:設(shè)置0x0100為中斷向量表首址,在第3個128頁內(nèi)。 則:*.cmd文件應(yīng)該改為: PAGE 0: VECS: origin=0x0100, length=0x66 則: SREG->PMST = (0x02 << PMST_IPTR) | (1 << PMST_MP_MC) | (1 << PMST_OVLY); ----------------------------------------------------------------------------*/ SystemInit();//系統(tǒng)初始化 } void SystemObj::SystemInit(void) { PllInit();//PLL初始化 TIMER0Init(); TIMER1Init(); EintInit(); /*-------------------------------------------------------- 注意以下2個變量的作用域的不同 --------------------------------------------------------*/ if (::SystemRamTest != 0x55aa) {//全局變量SystemRamTest ::SystemRamTest = 0x55aa;//改寫全局變量 } if (SystemRamTest != 0x55aa) {//類成員變量SystemRamTest SystemRamTest = 0x55aa;//改寫類成員變量 } ::IOXF = 0; } void SystemObj::PllInit(void) { volatile unsigned int start; SREG->SWWSR = 0x2000; do { SREG->CLKMD = 0; __nop(); } while(SREG->CLKMD & (1 << CLKMD_PLLSTATUS)); // SREG->CLKMD = (0 << CLKMD_PLLMUL) | (30 << CLKMD_PLLCOUNT) | (1 << CLKMD_PLLONOFF) | (1 << CLKMD_PLLNDIV) | (1 << CLKMD_PLLSTATUS);//10M SREG->CLKMD = (9 << CLKMD_PLLMUL) | (30 << CLKMD_PLLCOUNT) | (1 << CLKMD_PLLONOFF) | (1 << CLKMD_PLLNDIV) | (1 << CLKMD_PLLSTATUS);//100M // SREG->CLKMD = (14 << CLKMD_PLLMUL) | (30 << CLKMD_PLLCOUNT) | (1 << CLKMD_PLLONOFF) | (1 << CLKMD_PLLNDIV) | (1 << CLKMD_PLLSTATUS);//150M for (start = 0; start < 10000; start ++);//等待外設(shè)上電復(fù)位正常結(jié)束 } void SystemObj::TIMER0Init(void) { TIMER0->TCR = (1 << TCR_TSS);//關(guān)閉定時器0 TIMER0->PRD = 60000;//設(shè)置定時周期 TIMER0->TIM = 60000;//設(shè)置定時計數(shù)器 TIMER0->TCR &= ~(1 << TCR_TSS);//啟動定時器0 SREG->IMR |= (1 << IMR_TINT0);//允許TINT0中斷 } void SystemObj::TIMER1Init(void) { TIMER1->TCR = (1 << TCR_TSS);//關(guān)閉定時器1 TIMER1->PRD = 0xffff;//設(shè)置定時周期 TIMER1->TIM = 0xffff;//設(shè)置定時計數(shù)器 // TIMER1->TCR &= ~(1 << TCR_TSS);//啟動定時器1 // SREG->IMR |= (1 << IMR_TINT1);//允許TINT1中斷 } void SystemObj::EintInit(void) { SREG->IMR |= (1 << IMR_INT0);//允許INT0中斷 SREG->IMR |= (1 << IMR_INT1);//允許INT1中斷 SREG->IMR |= (1 << IMR_INT2);//允許INT2中斷 SREG->IMR |= (1 << IMR_INT3);//允許INT3中斷 } LcdObj::LcdObj(void) { LcdInit(); } void LcdObj::LcdSpiSetup(void) { #if (ccsdebug == 0) /*----------------------------------------------------------- 硬件McBSP模塊配置為SPI接口 實驗?zāi)康模?br> 演練硬件McBSP模塊配置為SPI接口的應(yīng)用。 ------------------------------------------------------------*/ McBSP1->SPSA = SPCR1; McBSP1->SPSD = 0; // McBSP1->SPSD &= ~(1 << SPCR1_RRST);//禁止串口接收 _delay_loop_(1);//延時等待 McBSP1->SPSA = SPCR2; McBSP1->SPSD = 0; // McBSP1->SPSD &= ~(1 << SPCR2_XRST);//禁止串口發(fā)送 _delay_loop_(1);//延時等待 McBSP1->SPSA = SPCR1; McBSP1->SPSD = (0x02 << SPCR1_CLKSTP);//CLKSTP=10b _delay_loop_(1);//延時等待 McBSP1->SPSA = PCR; McBSP1->SPSD = (1 << PCR_FSXM) //設(shè)置FSX引腳為輸出,控制LCD12864的片選信號SS | (0 << PCR_FSXP) //FSX引腳平時輸出低電平(LCD12864的片選信號SS無效) | (1 << PCR_CLKXM) //設(shè)置CLKX引腳為輸出 | (1 << PCR_CLKXP);//CLKXP引腳平時輸出高電平 _delay_loop_(1);//延時等待 McBSP1->SPSA = SRGR1; McBSP1->SPSD = (0x07 << SRGR1_FWID) //0x00~0x07~0xff | (0x80 << SRGR1_CLKGDV);//速率0x80 _delay_loop_(1);//延時等待 McBSP1->SPSA = SRGR2; McBSP1->SPSD = (1 << SRGR2_CLKSM);// _delay_loop_(1);//延時等待 McBSP1->SPSA = RCR1; McBSP1->SPSD = (0x00 << RCR1_RFRLEN1);//8BIT _delay_loop_(1);//延時等待 McBSP1->SPSA = XCR1;//延時等待 McBSP1->SPSD = (0x00 << XCR1_RFRLEN1);//8BIT _delay_loop_(1);//延時等待 McBSP1->SPSA = RCR2; McBSP1->SPSD = (0x02 << RCR2_RDATDLY);//0x01 _delay_loop_(1);//延時等待 McBSP1->SPSA = XCR2; McBSP1->SPSD = (0x02 << XCR2_RDATDLY);//0x01 _delay_loop_(1);//延時等待 McBSP1->SPSA = SPCR2; McBSP1->SPSD |= (1 << SPCR2_GRST) | (1 << SPCR2_XRST) | (1 << SPCR2_FRST); _delay_loop_(1);//延時等待 #else /*----------------------------------------------------------- 硬件McBSP模塊配置為普通IO軟件模擬SPI時序 實驗?zāi)康模?br> 演練硬件McBSP模塊配置為普通IO的應(yīng)用.以備IO緊缺時急用。 ------------------------------------------------------------*/ McBSP1->SPSA = SPCR1; McBSP1->SPSD = 0; McBSP1->SPSD &= ~(1 << SPCR1_RRST);//禁止串口接收 McBSP1->SPSA = SPCR2; McBSP1->SPSD = 0; McBSP1->SPSD &= ~(1 << SPCR2_XRST);//禁止串口發(fā)送 &  | 
  
| 2樓: | >>參與討論 | 
| 作者: hotpower 于 2006/7/1 12:24:00 發(fā)布:
         為何選用波特率自適應(yīng)同步字符"?" http://blog.21ic.com/more.asp?NAME=hotpower&id=20789  | 
  |
| 3樓: | >>參與討論 | 
| 作者: dengm 于 2006/7/1 12:49:00 發(fā)布:
         re: "?" 的uart為 stop bit 1 ----+ +--+--+--+--+--+--+ +--+-------- | | | | 0 +--+ +--+--+ start bit | | |時間?| 當(dāng)用較高(比正常用最高bps 還高)時接受這個信號,會怎么樣?  | 
  |
| 4樓: | >>參與討論 | 
| 作者: hotpower 于 2006/7/1 13:05:00 發(fā)布:
         哈哈~~~鄧苗的文字圖不錯~~~ 由于問號的精華在于三個不同的脈寬互成比例1:6:2.(不管停止位) 再高的bps也必須滿足這三者的比例關(guān)系,所以"時間?"不是問題~~~ 三者的比例關(guān)系實際隱含了一種密碼校對關(guān)系~~`,三者的比例不對就休想聯(lián)機(jī)~~` 所謂"寧愿錯殺一千,也不放過一個"~~~ 而且在系統(tǒng)各自的通訊協(xié)議中還需采用校驗機(jī)制,所以你的擔(dān)心是有些多余~~` 由于本程序采用軟件模擬,在進(jìn)出中斷都會產(chǎn)生時間偏移,何況我未將另一定時器TINT0關(guān)閉(為了不影響系統(tǒng)的實時和LCD的顯示及其他等程序的運行). 本程序最高BPS可達(dá)到57600,這就滿足了一般的工控通訊要求~~~~ 實際上工控一般采用9600~19200  * - 本貼最后修改時間:2006-7-1 13:07:52 修改者:hotpower  | 
  |
| 5樓: | >>參與討論 | 
| 作者: dengm 于 2006/7/1 13:36:00 發(fā)布:
         1:6:2, 先接收“1” + 部分“6”, 再關(guān)閉所有中斷來測量“2”的時間。  | 
  |
| 6樓: | >>參與討論 | 
| 作者: boy364 于 2006/7/1 14:17:00 發(fā)布:
         雖然看不懂,我還是頂 俺也是西安出來的,見了西安人就親切  | 
  |
| 7樓: | >>參與討論 | 
| 作者: hotpower 于 2006/7/1 14:24:00 發(fā)布:
         一般聯(lián)機(jī)在初始化階段,關(guān)閉所有中斷來測量后再工作很正常~~~  | 
  |
| 8樓: | >>參與討論 | 
| 作者: 開發(fā)板之家 于 2006/7/7 16:43:00 發(fā)布:
         hotpower大俠就是厲害 佩服佩服  | 
  |
| 9樓: | >>參與討論 | 
| 作者: hotpower 于 2006/7/7 20:25:00 發(fā)布:
         暈水~~~什么大俠???純粹一屆布衣~~~ 哈哈~~~連開發(fā)板也買不起的窮書生~~~  | 
  |
| 10樓: | >>參與討論 | 
| 作者: bin2bin 于 2006/8/13 23:29:00 發(fā)布:
         剛開始學(xué)如何做,多謝  | 
  |
| 11樓: | >>參與討論 | 
| 作者: hotpower 于 2006/8/15 0:19:00 發(fā)布:
         先掌握IO,定時和中斷這三個最基本且最重要的部分 任何MCU/ARM/DSP都應(yīng)該先掌握這些~~~  | 
  |
| 12樓: | >>參與討論 | 
| 作者: gudeng614 于 2006/12/23 18:55:00 發(fā)布:
         這是C編的,有點看不懂啊  | 
  |
  | 
    
 
  | 
  
| 免費注冊為維庫電子開發(fā)網(wǎng)會員,參與電子工程師社區(qū)討論,點此進(jìn)入 | 
Copyright © 1998-2006 udpf.com.cn 浙ICP證030469號  |