×
嵌入式 > 技术百科 > 详情

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

发布时间:2020-06-20 发布时间:
|
例程代码:
下面是用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();
}

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
分布式光纤温度传感器(DTS)系统的应用