DS18B20在CH32V307上一直初始化失败
[复制链接]
int main(void)
{
u16 temp;
int i;
// USARTx_Init(USART1,72,115200);//串口1的初始化
USART_Printf_Init(115200);
DS18B20_Init(); //DS18B20初始化
/*1. 读取DS18B20的64位ROM编码*/
//发送复位脉冲、检测存在脉冲
while(DS18B20_CheckDevice())
{
printf("DS18B20设备不存在!\n");
Delay_Ms(500);
}
//发送读取64为ROM编码的命令
printf("chu");
DS18B20_WriteByte(0x33);
//循环读取64位ROM编码
for(i=0;i<8;i++)
{
DS18B20_ROM[i]= DS18B20_ReadByte();
printf("DS18B20_ROM[%d]=0x%X\n",i,DS18B20_ROM[i]);
}
while(1)
{
/*2. 同时操作总线上所有的DS18B20开始转换温度*/
DS18B20_CheckDevice(); //发送复位脉冲、检测存在脉冲
DS18B20_WriteByte(0xCC); //跳过ROM序列检测
DS18B20_WriteByte(0x44); //启动一次温度转换(让总线上所有的DS18B20都转换温度)
Delay_Ms(500); //等待线上所有的DS18B20温度转换完成
/*3. 单个针对性读取每个DS18B20的温度*/
DS18B20_CheckDevice(); //发送复位脉冲、检测存在脉冲
DS18B20_WriteByte(0x55); //发送匹配ROM的命令
for(i=0;i<8;i++) //发送64位编码
{
DS18B20_WriteByte(DS18B20_ROM[i]);
}
DS18B20_WriteByte(0xBE); //读取温度
temp=DS18B20_ReadByte(); //读取的温度低位数据
temp|=DS18B20_ReadByte()<<8; //读取的温度高位数据
printf("temp1=%d.%d\n",temp>>4,temp&0xF);
printf("temp2=%f\n",temp*0.0625);
Delay_Ms(500);
}
}
void DS18B20_Init(void)
{
RCC->APB2PCENR|=1<<3; //PB
GPIOB->CFGHR&=0x0FFFFFFF;
GPIOB->CFGHR|=0x30000000;
GPIOB->OUTDR|=1<<15; //上拉
}
/*
函数功能: 检测DS18B20设备是否存在
返回值 : 1表示设备不存在 0表示设备正常
*/
u8 DS18B20_CheckDevice(void) //包含了复位脉冲、检测存在脉冲
{
DS18B20_OUTPUT_MODE();//初始化为输出模式
DS18B20_OUT_RESET();
Delay_Us(750); //产生750us的低电平
DS18B20_OUT_SET();
Delay_Us(15); //等待DS18B20回应
if(DS18B20_CleckAck())//检测存在脉冲
{
return 1;
}//检测到了脉冲
return 0;
}
/*
函数功能: 检测DS18B20设备的存在脉冲
返回值 : 1表示错误 0表示正常
*/
u8 DS18B20_CleckAck(void)
{
u8 cnt=0;
DS18B20_INPUT_MODE();//初始化为输入模式
while(DS18B20_IN&&cnt<200) //等待DS18B20响应存在脉冲
{
Delay_Us(1);
cnt++;
}
if(cnt>=200)return 1; //错误
else cnt=0;
while((!DS18B20_IN)&&cnt<240) //等待DS18B20释放总线
{
Delay_Us(1);
cnt++;
}
if(cnt>=240)return 1; //错误
return 0;
}
void Delay_Us(uint32_t n)
{
uint32_t i;
SysTick->SR &= ~(1 << 0);
i = (uint32_t)n * p_us;
SysTick->CMP = i;
SysTick->CTLR |= (1 << 4);
SysTick->CTLR |= (1 << 5) | (1 << 0);
while((SysTick->SR & (1 << 0)) != (1 << 0))
;
SysTick->CTLR &= ~(1 << 0);
}
|