新手上路
- 积分
- 20
- 金钱
- 20
- 注册时间
- 2022-10-12
- 在线时间
- 3 小时
|
1金钱
有关DS18B20问题,我跟着时序图写的代码,
但是始终不明白是哪个环节出了问题,,我已经找了好好几天了,一直没找到具体问题,请大神帮忙看看
//DS18B20 data pin Connected GPIO PI4 GPIO端口输入输出选择
void Initializ_ds18b20_GPIO(u8 In_Out_Select)
{
if(1 == In_Out_Select) //输出模式
{
PI_DDR_DDR4 = 1; //1: Output mode
PI_CR1_C14 = 0; //Float output
PI_CR2_C24 = 0; //Low Speed Output
DS = 1;
}
else //输入模式
{
PI_DDR_DDR4 = 0; //1: input mode
PI_CR1_C14 = 0; //Input with pull-up
PI_CR2_C24 = 0; //External interrupt disabled
}
}
//初始化代码
u8 Reset_ds18b20(void)
{
u8 state = 1;
Initializ_ds18b20_GPIO(OUT); //DS18B20 数据线设为 输出模式
DS = 0; //拉低数据总线
delay_us(750); //保持750us
DS = 1; //释放总线
delay_us(50); //等待18B20 15~60us
Initializ_ds18b20_GPIO(IN); //设为输入模式
state = PI_IDR_IDR4; //获取DS18B20状态
delay_us(500); //延时500us
return state;
}
//写一个字节
void ds18b20_Write(u8 dat)
{
u8 i = 0;
Initializ_ds18b20_GPIO(OUT); //Ready Write Operaction
for(i = 0; i < 8;i++)
{
DS = 1;
if((dat & 0x01) == 1) //Write 1 Opetation
{
DS = 0;
delay_us(2); //Release Bus
DS = 1;
delay_us(60); //Wating ds18b20 Samples
}
else
{
DS = 0;
delay_us(65); //Wating ds18b20 Samples
}
dat = dat >> 1;
}
}
//读一个字节
u8 ds18b20_Read(void)
{
u8 i = 0;
u8 data = 0;
for(i = 0 ;i < 8; i++)
{
Initializ_ds18b20_GPIO(OUT); //输出模式
DS = 1; //释放总线 等待电平稳定
delay_us(2); // 等待电平稳定
data = data >> 1; // 临时用于存放数据,先低地位移除
DS = 0; //Tint > us
delay_us(2); //延时 us
DS = 1; //释放总线
delay_us(2); //延时TRC的时间
Initializ_ds18b20_GPIO(IN); //改为输入模式
if(1 == PI_IDR_IDR4) //判断总线 电平 分别取出电平
{
data = data | 0x80; //high bit Set
}
else
{
data = data & 0x7F; //higt bie Reset
}
}
return data;
}
我已将附件上传请大神协助!!谢谢!请指明错误点
|
|