STM32下开发的TDC—GP2激光测距源代码
这是在上学期接的一个激光的项目,用的是TDC-GP21测量模块。自己写的基于32下的源代码和大家分享啦。优秀的人才! 楼主,优秀了!
有兴趣我们聊聊 谢谢分析,学习 你好,我在调试GP21,SPI通信测试一直通不过。目前我只初始化了IO口,复位,测试(给寄存器1写入数据、写入操作码0xb5,读取8位数据)
#include "gp21.h"
void DelayNS(unsigned long dly)
{
unsigned inti;
for(i=0;i<dly;i++);
}
void SPI2_TDC_INIT(void)
{
GPIO_InitTypeDefGPIO_Initure;
__HAL_RCC_GPIOE_CLK_ENABLE();
GPIO_Initure.Pin=GPIO_PIN_12|GPIO_PIN_14;
GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP; //推挽输出
GPIO_Initure.Pull=GPIO_PULLUP; //上拉
GPIO_Initure.Speed=GPIO_SPEED_HIGH; //高速
HAL_GPIO_Init(GPIOE,&GPIO_Initure);
GPIO_Initure.Pin=GPIO_PIN_13;
GPIO_Initure.Mode=GPIO_MODE_INPUT; //输入
GPIO_Initure.Pull=GPIO_PULLUP; //上拉
HAL_GPIO_Init(GPIOE,&GPIO_Initure);
}
void TDC_Configuration(void)
{
GPIO_InitTypeDef GPIO_Initure;
__HAL_RCC_GPIOD_CLK_ENABLE();
__HAL_RCC_GPIOG_CLK_ENABLE();
GPIO_Initure.Pin=GPIO_PIN_11;//GPIO_PIN_9|GPIO_PIN_10|
GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP; //推挽输出
GPIO_Initure.Pull=GPIO_PULLUP; //上拉
GPIO_Initure.Speed=GPIO_SPEED_HIGH; //高速
HAL_GPIO_Init(GPIOD,&GPIO_Initure);
GPIO_Initure.Pin=GPIO_PIN_5;//|GPIO_PIN_7
GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP; //推挽输出
GPIO_Initure.Pull=GPIO_PULLUP; //上拉
GPIO_Initure.Speed=GPIO_SPEED_HIGH; //高速
HAL_GPIO_Init(GPIOG,&GPIO_Initure);
}
void TDC_RESET(void)
{
SET_TDC_RESET();
DelayNS(100);
CLR_TDC_RESET();
DelayNS(100);
SET_TDC_RESET();
DelayNS(100);
}
unsigned char Test_SPI_Communicate(void)
{
int register1 = 0x81ffffff;
unsigned char test_reg=0xb4; //读结果寄存器5,反映寄存器1 的高8 位
unsigned char test_reg0=0x00;
// unsigned char test_reg1=0x81; //读结果寄存器5,反映寄存器1 的高8 位
DelayNS(500);
CLR_TDC_NSS();
DelayNS(5);
for (int i=0;i<32;i++)
{
SET_TDC_SCK();
DelayNS(5);
if (register1&0x80000000)
{
SET_TDC_SI();
}
else
CLR_TDC_SI();
DelayNS(5);
CLR_TDC_SCK();
DelayNS(5);
register1=register1<<1;
}
DelayNS(5);
SET_TDC_NSS();
DelayNS(500);
CLR_TDC_NSS();
DelayNS(5);
for (int i=0;i<8;i++)
{
SET_TDC_SCK();
DelayNS(5);
if (test_reg&0x80)
SET_TDC_SI();
else
CLR_TDC_SI();
DelayNS(5);
CLR_TDC_SCK();
DelayNS(5);
test_reg=test_reg<<1;
}
for(int j=0;j<8;j++)
{
SET_TDC_SCK();
DelayNS(5);
test_reg0=test_reg0<<1;
if (HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_13) ==0)
{
test_reg0 &=0x01;
}
else
{
test_reg0 |=0x01;
}
CLR_TDC_SCK();
DelayNS(5);
}
SET_TDC_NSS();
return test_reg0;
}
可以帮我分析以下问题在哪吗 问一下你用的是什么激光传感器呢? 楼主很厉害啊,现在还在做激光测距吗? 这个我是要来支持一下的 问下为啥我用程序控制TDC-GP21,读出来的结果始终不变的哇? 学习下。。。