哎,国庆节就这样过去了,但项目的bug迟迟没有得到解决,实感惭愧。
代码如下:
void udelay(uint32_t nTime)
{
uwTick = nTime;
while(0U != uwTick){
}
}
void GPIO_Init(uint32_t gpio_periph,GPIO_InitPara *Para)
{
rcu_periph_clock_enable(RCU_GPIOB);
GPIO_BOP(gpio_periph) = Para->GPIO_Pin;
GPIO_OSPD0(gpio_periph) = Para->GPIO_Speed;
GPIO_OMODE(gpio_periph) = Para->GPIO_Mode;
GPIO_BC(gpio_periph) = Para->GPIO_Pin;
}
void TempGPIOInit(void)
{
rcu_periph_clock_enable(RCU_GPIOB);
GPIO_InitStructure.GPIO_Pin = GPIO_PIN_12;
GPIO_InitStructure.GPIO_Mode = GPIO_MODE_OUT_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_SPEED_50MHZ;
GPIO_Init(GPIOB,&GPIO_InitStructure);
}
void TempGPIOin(void)
{
GPIO_InitStructure.GPIO_Pin = GPIO_PIN_12;
GPIO_InitStructure.GPIO_Mode = GPIO_MODE_IN_FLOATING;
GPIO_InitStructure.GPIO_Speed = GPIO_SPEED_50MHZ;
GPIO_Init(GPIOB,&GPIO_InitStructure);
}
void TempGPIOout(void)
{
GPIO_InitStructure.GPIO_Pin = GPIO_PIN_12;
GPIO_InitStructure.GPIO_Mode = GPIO_MODE_OUT_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_SPEED_50MHZ;
GPIO_Init(GPIOB,&GPIO_InitStructure);
}
static void ds18b20_write8(unsigned char data)
{
int i;
unsigned long flags;
TempGPIOout();
for (i = 0; i < 8; i++) {
if ((data & 0x1) == 1) {
gpio_bit_reset(GPIOB, GPIO_PIN_12);
udelay(3);
gpio_bit_set(GPIOB, GPIO_PIN_12);
udelay(80);
} else {
gpio_bit_reset(GPIOB, GPIO_PIN_12);
udelay(80);
gpio_bit_set(GPIOB, GPIO_PIN_12);
udelay(3);
}
data >>= 1;
}
}
static unsigned char ds18b20_read8(void)
{
int i;
unsigned char bit;
unsigned char data = 0;
for (i = 0; i < 8; i++) {
TempGPIOout();
gpio_bit_reset(GPIOB, GPIO_PIN_12);
udelay(2);
TempGPIOin();
bit = gpio_input_bit_get(GPIOB, GPIO_PIN_12);
data |= (bit << i);
udelay(60);
}
return data;
}
static void ds18b20_reset(void)
{
unsigned char ret;
TempGPIOout();
gpio_bit_reset(GPIOB, GPIO_PIN_12);
udelay(500);
gpio_bit_set(GPIOB, GPIO_PIN_12);
udelay(30);
gpio_bit_write(GPIOB, GPIO_PIN_12,0x00);
TempGPIOin();
ret = (gpio_input_bit_get(GPIOB, GPIO_PIN_12));
udelay(500);
if (ret == 0) {
EvbUart1Printf("reset ok.\n");
} else {
EvbUart1Printf("reset failed.\n");
}
}
static uint32_t ds18b20_read()
{
unsigned char h8, l8;
int temp = 0;
ds18b20_reset();
ds18b20_write8(DS18B20_SKIP_ROM);
ds18b20_write8(DS18B20_COVERTT);
ds18b20_reset();
ds18b20_write8(DS18B20_SKIP_ROM);
ds18b20_write8(DS18B20_READ_MEM);
l8 = ds18b20_read8();
h8 = ds18b20_read8();
temp = (h8 << 8) | l8;
temp *= 625;
return temp;
}
以上不知道是gpio的初始化有问题还是延时精准度不对,毕竟对于单线式通讯协议时钟的设置精度要求比较高。
测试的结果总是如图所示,请高人指点,谢谢!
-
路过,鼓励一下,加油!
专注智能产品的研究与开发,专注于电子电路的生产与制造……QQ:2912615383,电子爱好者群: void