您的位置 首页 制造

MSP430与TDC-GP2脉冲式激光测距中的例程代码

例程代码:下面是用C语言编写的MSP430F135系列单片机对于gp2控制的一些控制函数的例程代码+注释,其中描述了一些对gp2功能上的控制…

例程代码:
下面是用C 言语编写的MSP430F135 系列单片机关于gp2 操控的一些操控函数的例程代码+注释,其间描绘了一些对gp2 功能上的操控,通讯为单片机用一般io 口模仿spi通讯操作,仅供参考:
//============端口设置程序================//
void port_init(void) //端口初始化
{
P5DIR |=BIT1;//EN_STOP
P5DIR |=BIT2;//START
P5DIR |=BIT3;//ENSTART
P5DIR &=~(BIT4);//INTN
P6DIR |=BIT5;//RSTN
P5OUT &=~(BIT1);
P5OUT &=~(BIT2);
P5OUT &=~(BIT3);
P5OUT &=~(BIT0);//stop
P6DIR |=BIT0;//SCK-输出方向
P6DIR |=BIT1;//SSN-输出方向
P6DIR &=~(BIT2);//SO-输入方向
P6DIR |=BIT3;//SI-输出方向
P6OUT &=~(BIT0);//SCK-空闲时低平,spi 时钟极性为0。
P6OUT |=BIT1;//SSN-片选在没有通讯情况下置高
}
void spi_enable(void) //敞开spi 通讯,将ssn 置低
{
P6OUT &=~(BIT1);//ssn 置低
_NOP();
return;
}

void spi_disable(void) //封闭spi 通讯,将ssn 置高
{
P6OUT |=BIT1;//ssn 置高
_NOP();
return;
}
void send_zero(void) //发送0
{
P6OUT |=BIT0;//SCK 高电平
_NOP();
P6OUT &=~(BIT3);//SI-输出一个低平
_NOP();
P6OUT &=~(BIT0);//SCK 低平
_NOP();
return;
}
void send_one(void) //发送1
{
P6OUT |=BIT0;//SCK 高电平
_NOP();
P6OUT |=BIT3;//SI-输出一个高平
_NOP();
P6OUT &=~(BIT0);//SCK 低平
_NOP();
return;
}
//============================================//
//=====================SPI 写数据=====================//
void spi_write8(unsigned char wbuf8) // spi 写入8 位数据
{
unsigned char cnt,tmp=0x80;
spi_enable();
for(cnt=8;cnt>0;cnt–)
{
if((wbuf8&tmp)>0)
send_one();//发送1
else
send_zero();//发送0
tmp /=2; //tmp 右移一位
} //没有spi 封闭指令,测验程序中代码封闭!
return;
}
void spi_write16(unsigned int wbuf16) // spi 写16 位数据
{
unsigned char cnt;
unsigned int tmp=0x8000;
spi_enable();
for(cnt=16;cnt>0;cnt–)
{
if((wbuf16&tmp)>0)
send_one();//发送1
else
send_zero();//发送0
tmp /=2; //tmp 右移一位
}
_NOP();
spi_disable();
return;
}
void spi_write32(unsigned long wbuf32) // spi 写32 位数据
{
unsigned char cnt;
unsigned long tmp=0x80000000;
spi_enable();
for(cnt=32;cnt>0;cnt–)
{
if((wbuf32&tmp)>0)
send_one();发送1
else
send_zero();//发送0
tmp /=2; //tmp 右移一位
}
_NOP();
spi_disable();
return;
}
//============================================//
//=====================SPI 读数据=====================//
unsigned long spi_read32()
{
unsigned char cnt;
unsigned long tmp=0x80000000;
unsigned long int rbuf32=0x00000000;
spi_enable();
for(cnt=32;cnt>0;cnt–)
{
P6OUT |=BIT0;//SCK
_NOP();
if((P6IN &0X04)>0X00)//P6.2 SO
rbuf32 |=tmp;
tmp /=2;
P6OUT &=~(BIT0);// SCK
_NOP();
}
_NOP();
spi_disable();
return(rbuf32);
}
//============================================//
//===========GP2 上电复位程序==================//
void GP2_RESET(void)
{
P6DIR |=BIT5; //设置p6.5 输出方向
P6OUT |=BIT5; //输出高平
_NOP();
P6OUT &=~(BIT5); //输出低平
_NOP();
P6OUT |=BIT5; //输出高平
_NOP();
}//给gp2RSTN 管脚一个Reset 的方波
//============================================//
//===========GP2 寄存器装备程序====================//
void GP2_init(void)
{
unsigned long REG0,REG1,REG2, REG3, REG4,REG5;
unsigned char PU=0X50;
unsigned char init=0x70;
REG0=0X80008420;//校准陶瓷晶振时刻为8 个32k 周期,244.14us.
//设置高速晶振上电后一直起振.设置丈量规模1,主动校准,上升沿灵敏
REG1=0X81014100;//预期stop1 脉冲数1 个.核算第一个stop1-start
REG2=0X82E00000;//敞开一切中止源
REG3=0x83080000;//
REG4=0x84200000;//
REG5=0X85080000;//
spi_write8(PU);//上电复位
_NOP();
spi_disable();
spi_write32(REG0);
_NOP();
spi_write32(REG1);
_NOP();
spi_write32(REG2);
_NOP();
spi_write32(REG3);
_NOP();
spi_write32(REG4);
_NOP();
spi_write32(REG5);
_NOP();
return;
}

//=============================================//
//===========GP2 时钟校准程序===================//
void GP2_cal(void)
{
unsigned char cal_start=0x03;
unsigned char read_reg0=0xb0;
unsigned long int CAL;
float CAL_f;
P5OUT |=(BIT3);//EN_START
spi_write8(cal_start);//发动校准
_NOP();
spi_disable();
while((P5IN&0x10)==0x10)//判别中止置位否
_NOP();
spi_write8(read_reg0); //读校准的时刻数据
_NOP();
CAL=spi_read32();//经过核算校准系数为244.146/(float(CAL)/65536*0.250))
_NOP();
return;
}
//=============================================//
//=========时刻丈量状况寄存器判别程序==========//
void GP2_TMSTAT()
{
unsigned char stat=0xb4;
unsigned long a;
unsigned int b;
while((P5IN&0x10)==0x10)//判别中止置位否
_NOP();
spi_write8(stat);
_NOP();
a=spi_read32();
b=(a>>16);
if((b&0x0600)==0)
BZ1 &=0XFE;
else
BZ1 |=0X01;//置溢出预计数器或溢出TDC 标志
}
//===========================================//
//=============用单片机口发生START 信号==========//
void GP2_START(void)
{
P5OUT &=~(BIT2);//START
_NOP();
P5OUT |=(BIT2);
_NOP();
P5OUT &=~(BIT2);
_NOP();
return;
//===========================================//
//============通讯测验===============//
void testcomunication(void)
{
unsigned long int REG1;
unsigned char cnt;
unsigned char tmp=0x80;
unsigned char test_reg=0xb5; //读成果寄存器5,反映寄存器1 的高8 位
unsigned char test_reg0=0x00;
REG1=0x81112233; //写寄存器1,随意输入,然后从成果寄存器5 读高8 位
spi_wriet32(REG1) ;
_NOP();
spi_write8(test_reg);
_NOP();
for(cnt=8;cnt>0;cnt–)
{
P6OUT |=BIT0;//SCL
_NOP();
if((P6IN &0X04)>0X00)//P6.2 SO
test_reg0 |=tmp;
tmp /=2;
P6OUT &=~(BIT0);//SCL
_NOP();
}
spi_disable();
}
//===================================//
//==========测验fire 脉冲发生测验=============//
void fire(void)
{
unsigned char TDC_init=0x70;
unsigned char start_cycle=0x01;
P5OUT |=(BIT3);//EN_START 敞开
spi_write8(TDC_init); //初始化TDC
_NOP();
spi_disable();
spi_write8(start_cycle); //发送fire 脉冲
_NOP();
spi_disable();
GP2_START(); //给start 信号,不然fire 信号只能发送一次,体系将会挂起
}
//===================================//
//======时刻丈量测验=========//
void timemeasurement(void)
{
unsigned long int M;
spi_write8(TDC_init); //初始化TDC
_NOP();
spi_disable();
P5OUT |=(BIT3);//EN_START
P5OUT |=(BIT1);//EN_STOP
GP2_START();//给start 信号
_NOP();
_NOP();
_NOP();
_NOP();
_NOP();
_NOP();
_NOP();
_NOP();
_NOP();
_NOP();
_NOP();
_NOP();
_NOP();//推迟
P5OUT |=BIT0;//给STOP 信号
_NOP();
while((P5IN&0x10)==0x10)//判别中止置位否
_NOP();
GP2_TMSTAT(); //GP2 状况读取
_NOP();
spi_write8(read_reg0); //读时刻丈量数据
_NOP();
M=spi_read32();
_NOP();
}

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/bandaoti/zhizao/272829.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部