傳統(tǒng)的DSP程序開發(fā)包含兩方面程序:即配置、控制、中斷等管理DSP片內(nèi)外設(shè)、接口的硬件相關(guān)程序和基于應(yīng)用的算法程序。這樣的系統(tǒng)結(jié)構(gòu),應(yīng)用程序與硬件相關(guān)程序緊密的結(jié)合一起,限制了程序的可移植性和通用性,軟件開發(fā)總要從零開始,存在諸多重復(fù)工作。一旦硬件平臺(tái)有變化,往往與硬件程序捆綁一起的應(yīng)用程序也需改動(dòng),代碼的維護(hù)性和可移植性均不高。
通過(guò)建立硬件驅(qū)動(dòng)程序的開發(fā)模式,可使上述現(xiàn)象得到改善。因此,本文介紹一種開發(fā)TI公司DSP片內(nèi)及片外硬件外設(shè)驅(qū)動(dòng)程序的方法,并以C5000 DSP的McBSP/DMA及TMS320C5509的USB驅(qū)動(dòng)程序開發(fā)為具體對(duì)象,介紹這種方法的應(yīng)用。
ad9850程序
//***************************************************//
//函數(shù)1: ad9850_reset() //
//函數(shù)2: ad9850_reset_serial() //
//函數(shù)3: ad9850_wr_parrel(unsigned char w0,double frequence)//
//函數(shù)4: ad9850_wr_serial(unsigned char w0,double frequence)//
//版本: V1.1 //
//***************************************************//
// 子程序說(shuō)明 //
//***************************************************//
//函數(shù)1: ad9850_reset()
// 復(fù)位ad9850,之后為并口寫入模式
//函數(shù)2: ad9850_reset_serial()
// 復(fù)位ad9850,之后為串口寫入模式
//函數(shù)3: ad9850_wr_parrel(unsigned char w0,double frequence)
// 并口寫ad9850數(shù)據(jù),w0為ad9850中w0的數(shù)據(jù),frequence
// 為寫入的頻率
//函數(shù)4: ad9850_wr_serial(unsigned char w0,double frequence)
// 串口寫ad9850數(shù)據(jù),w0為ad9850中w0的數(shù)據(jù),frequence
// 為寫入的頻率
//需定義的位:
//ad9850_w_clk ;
//ad9850_fq_up ;
//ad9850_rest ;
//ad9850_bit_data ;
//例:
//sbit ad9850_w_clk =P2^2;
//sbit ad9850_fq_up =P2^1;
//sbit ad9850_rest =P2^0;
//sbit ad9850_bit_data =P1^7;
//***************************************************//
// 寫數(shù)據(jù)說(shuō)明 //
//***************************************************//
//寫數(shù)據(jù)例:
// ad9850_reset()
// wr_lcd02_data(unsigned char x)
// ad9850_wr_parrel(0x01,1000)
// ad9850_wr_serial(0x01,1000)
//***************************************************//
//---------------------------------------------------//
// 程序 //
//---------------------------------------------------//
# include 《reg51.h》
# include 《stdio.h》
# include 《intrins.h》
sbit ad9850_w_clk =P1^0; //P2.2口接ad9850的w_clk腳/PIN7
sbit ad9850_fq_up =P1^1; //P2.1口接ad9850的fq_up腳/PIN8
sbit ad9850_rest =P1^2; //P2.0口接ad9850的rest腳/PIN12
sbit ad9850_bit_data =P1^7; //P1.7口接ad9850的D7腳/PIN25
//P1為8位數(shù)據(jù)口
//***************************************************//
// ad9850復(fù)位(并口模式) //
//---------------------------------------------------//
void ad9850_reset()
{
ad9850_w_clk=0;
ad9850_fq_up=0;
//rest信號(hào)
ad9850_rest=0;
ad9850_rest=1;
ad9850_rest=0;
}
//***************************************************//
// ad9850復(fù)位(串口模式) //
//---------------------------------------------------//
void ad9850_reset_serial()
{
ad9850_w_clk=0;
ad9850_fq_up=0;
//rest信號(hào)
ad9850_rest=0;
_nop_();
ad9850_rest=1;
_nop_();
_nop_();
_nop_();
_nop_();
ad9850_rest=0;
_nop_();
_nop_();
//w_clk信號(hào)
ad9850_w_clk=0;
ad9850_w_clk=1;
_nop_();
ad9850_w_clk=0;
//fq_up信號(hào)
ad9850_fq_up=0;
ad9850_fq_up=1;
_nop_();
ad9850_fq_up=0;
}
//***************************************************//
// 向ad9850中寫命令與數(shù)據(jù)(并口) //
//---------------------------------------------------//
void ad9850_wr_parrel(unsigned char w0,double frequence)
{
unsigned char w;
long int y;
double x;
//計(jì)算頻率的HEX值
x=4294967295/125;//適合125M晶振
//如果時(shí)鐘頻率不為125MHZ,修改該處的頻率值,單位MHz !!!
frequence=frequence/1000000;
frequence=frequence*x;
y=frequence;
//寫w0數(shù)據(jù)
w=w0;
P3=w; //w0
ad9850_w_clk=1;
ad9850_w_clk=0;
//寫w1數(shù)據(jù)
w=(y》》24);
P3=w; //w1
ad9850_w_clk=1;
ad9850_w_clk=0;
//寫w2數(shù)據(jù)
w=(y》》16);
P3=w; //w2
ad9850_w_clk=1;
ad9850_w_clk=0;
//寫w3數(shù)據(jù)
w=(y》》8);
P3=w; //w3
ad9850_w_clk=1;
ad9850_w_clk=0;
//寫w4數(shù)據(jù)
w=(y》》0);
P3=w; //w4
ad9850_w_clk=1;
ad9850_w_clk=0;
//移入始能
ad9850_fq_up=1;
ad9850_fq_up=0;
}
//***************************************************//
// 向ad9850中寫命令與數(shù)據(jù)(串口) //
//---------------------------------------------------//
void ad9850_wr_serial(unsigned char w0,double frequence)
{
unsigned char i,w;
long int y;
double x;
//計(jì)算頻率的HEX值
x=4294967296/125;//適合125M晶振
//如果時(shí)鐘頻率不為125MHZ,修改該處的頻率值,單位MHz !!!
frequence=frequence/1000000;
frequence=frequence*x;
y=frequence;
//寫w4數(shù)據(jù)
w=(y》》=0);
for(i=0;i《8;i++)
{
ad9850_bit_data=(w》》i)&0x01;
ad9850_w_clk=1;
ad9850_w_clk=0;
}
//寫w3數(shù)據(jù)
w=(y》》8);
for(i=0;i《8;i++)
{
ad9850_bit_data=(w》》i)&0x01;
ad9850_w_clk=1;
ad9850_w_clk=0;
}
//寫w2數(shù)據(jù)
w=(y》》16);
for(i=0;i《8;i++)
{
ad9850_bit_data=(w》》i)&0x01;
ad9850_w_clk=1;
ad9850_w_clk=0;
}
//寫w1數(shù)據(jù)
w=(y》》24);
for(i=0;i《8;i++)
{
ad9850_bit_data=(w》》i)&0x01;
ad9850_w_clk=1;
ad9850_w_clk=0;
}
//寫w0數(shù)據(jù)
w=w0;
for(i=0;i《8;i++)
{
ad9850_bit_data=(w》》i)&0x01;
ad9850_w_clk=1;
ad9850_w_clk=0;
}
//移入始能
ad9850_fq_up=1;
_nop_();
_nop_();
ad9850_fq_up=0;
}
//***************************************************//
// 測(cè)試程序1000Hz //
//---------------------------------------------------//
main()
{
P0=0x00;
P1=0x00;
P2=0x00;
P3=0x00;
//---------------------------------------------------//
//并行寫1000Hz程序
//ad9850_reset();
//ad9850_wr_parrel(0x00,1000);
ad9850_reset_serial();
ad9850_wr_serial(0x00,10000);
//---------------------------------------------------//
while(1)
{
}
}
評(píng)論
查看更多