MSP430与TDC-GP2脉冲式激光测距中的例程代码_压接机液压压接机分体压接 ...
MSP430与TDC-GP2脉冲式激光测距中的例程代码_压接机液压压接机分体压接机_百度空间
2010-03-30 14:39:48
阅读
7
评论
0
字号:
大
中
小
MSP430与TDC-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_on
e(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_on
e();//发送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_on
e();//发送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_on
e();发送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 个.计算{dy}个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();
引文来源
this.p={ m:2, b:2, id:'fks_080064084082088075085080094095085085083064081084080070080', blogTitle:'MSP430与TDC-GP2脉冲式激光测距中的例程代码_压接机液压压接机分体压接机_百度空间', blogUrl:'blog/static/132352654201023023948155', isPublished:1, istop:false, type:2, modifyTime:0, permalink:'blog/static/132352654201023023948155', commentCount:0, mainCommentCount:0, recommendCount:0, friendstatus:'none', followstatus:'unFollow', pubSucc:'' }
{list a as x} {if !!x} {/if} {/list}
{if !!a} {/if}
<#--{zx1}日志-->
{list a as x} {if !!x}
{/if} {/list}
<#--推荐日志-->
推荐过这篇日志的人:
{if !!b&&b.length>0}
他们还推荐了:
{list b as y} {if !!y}
·
{/if} {/list}
{/if}
<#--引用记录-->
引用记录:
{list d as x}
·
{/list}
<#--相关日志-->
{list a as x} {if !!x}
{/if} {/list}
<#--推荐日志-->
{list a as x} {if !!x}
{/if} {/list}
<#--右边模块结构-->
{zx1}日志
推荐日志
相关日志
<#--评论模块结构-->
<#--引用模块结构-->
#--引用模块结构-->#--评论模块结构-->#--右边模块结构-->#--推荐日志-->#--相关日志-->#--引用记录-->#--推荐日志-->#--{zx1}日志-->
郑重声明:资讯 【MSP430与TDC-GP2脉冲式激光测距中的例程代码_压接机液压压接机分体压接 ...】由 发布,版权归原作者及其所在单位,其原创性以及文中陈述文字和内容未经(企业库qiyeku.com)证实,请读者仅作参考,并请自行核实相关内容。若本文有侵犯到您的版权, 请你提供相关证明及申请并与我们联系(qiyeku # qq.com)或【
在线投诉
】,我们审核后将会尽快处理。
——
相关资讯
——
武汉华轩7月份3家商混站减胶剂(增效剂)实现生产转化
2018/8/17
百度快速排名原理 Q5738538 陈默外推
2017/1/15
番禺南村切包皮大概费用
2015/11/5
调查显示12%的广州学生初中阶段发生性关系
2009/4/22
难忘那童年的摇摆机_helanmingyue的空间_百度空间
2010/2/10
四川谋划开展甩挂运输试点工作-想你的夜晚_ 那季暖风_ 中金博客
2010/3/24
叶面肥磷酸二氢钾_whnanqing的空间_百度空间
2010/4/24
激光祛斑的全过程
2015/3/10
女人xx大了怎么办ぇ
2015/3/23
种子包装袋
1900/1/1
优惠的云南鸭苗哪里有_昆明鹅苗价格如何
1900/1/1