#include"stm32f10x.h"
#include"PinInit.h"
#include"G_OS.h"
#include"Timer.h"
/*--------------------------------------------------------------------------
* 函数名称 : gUINT8 Ds18Init(void)
* 功能描述 : 18B20初始化函数
* 入口参数 : 无
* 出口参数 : 0 初始化成功
1 初始化失败
-----------------------------------------------------------*/
gUINT8 Ds18Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD; /*开漏输出,外加上拉双向IO*/
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_SetBits(DS18_PORT,DS18_IO); /*使初始状态是高电平20us*/
TimeDelayUs(20);
GPIO_ResetBits(DS18_PORT,DS18_IO); /*480us<拉低<960us 这里500us*/
TimeDelayUs(500);
GPIO_SetBits(DS18_PORT,DS18_IO); /*拉高等待ds18应答低电平,时序要求等待15-60us 这里60us 比较保险*/
TimeDelayUs(60);
if(GPIO_ReadInputDataBit(DS18_PORT,DS18_IO) == 0) /*读*/
{
TimeDelayUs(240); /*延时240us把ds18发出的低电平(时序指出:低电平时间60~240us)耽搁过去*/
if(GPIO_ReadInputDataBit(DS18_PORT,DS18_IO) == 1)
{
return 0; /*初始化成功*/
}
} /*初始化失败*/
return 1;
}
/*--------------------------------------------------------------------------
* 函数名称 : gUINT8 Ds18Read(void)
* 功能描述 : 18B20读函数
* 入口参数 : 无
* 出口参数 : 无
-----------------------------------------------------------*/
gUINT8 Ds18Read(void)
{
gUINT32 CPUStatus;
gUINT8 i,Temp;
for(i=0;i<8;i++)
{
G_ENTER_CRITICAL(); /*不想让G/OS心跳打断,不可以放到循环外,关中断时间太长,有闪烁感*/
Temp = Temp>>1;
GPIO_ResetBits(DS18_PORT,DS18_IO);
TimeDelayUs(4); /*时序要求至少1us这里拉低3-4us再拉高产生读时隙*/
GPIO_SetBits(DS18_PORT,DS18_IO); /*拉高,等数据*/
TimeDelayUs(8); /*时序要求从上次拉低算起15us后出数据,这里疑问。。。。。?过大导致读出错误*/
if(GPIO_ReadInputDataBit(DS18_PORT,DS18_IO))
{
Temp |= 0x80;
}
TimeDelayUs(60); /*读一位的时间是60us,还要至少1us的恢复时间,这里延时60us*/
G_EXIT_CRITICAL(); /*注意:这里开中断,有可能切换到其他任务,或者执行Tick中断*/
}
return Temp;
}
/*--------------------------------------------------------------------------
* 函数名称 : void Ds18Write(gUINT8 Data)
* 功能描述 : 18B20写函数
* 入口参数 : 无
* 出口参数 : 无
-----------------------------------------------------------*/
void Ds18Write(gUINT8 Data)
{
gUINT32 CPUStatus;
gUINT8 i;
for(i=0;i<8;i++)
{
G_ENTER_CRITICAL(); /*不想让G/OS心跳打断,不可以放到循环外,关中断时间太长,有闪烁感*/
if(Data & 0x01)
{
GPIO_ResetBits(DS18_PORT,DS18_IO); /*写1,时序要求拉低至少1us,这里4us*/
TimeDelayUs(4);
GPIO_SetBits(DS18_PORT,DS18_IO);
TimeDelayUs(60); /*写时间是60us + 至少1us恢复时间*/
}
else
{
GPIO_ResetBits(DS18_PORT,DS18_IO); /*写0,拉低60us*/
TimeDelayUs(60);
}
Data = Data>>1;
GPIO_SetBits(DS18_PORT,DS18_IO); /*最后拉高*/
TimeDelayUs(5); /*恢复时间至少1us,这里5us*/
G_EXIT_CRITICAL(); /*注意:这里开中断,有可能切换到其他任务,或者执行Tick中断*/
}
}
STM32 DS18B20 程序
最新推荐文章于 2024-08-17 01:23:17 发布