18B20时序要点 stm32 72M环境

来源:互联网 发布:软件授权码商城 编辑:程序博客网 时间:2024/05/22 06:42

网上18B20的资料很多,但似乎都找不到要点。官方文档很详尽,但也是通篇不分段睡觉,官方文档就不能1、2、3的给出主要注意点嘛。

这里结合自己调试过程,总结要点如下,使用stm32 72Mhz主频。

本幅图包括复位时序与写时序要点。

复位时序

1、拉低至少480us

2、拉高15-60us,读取状态,为0则通过

3、再次延迟时间,实验时过短会影响后续结果的读出,这里实验最短120us左右。

写时序

1、一次写1bit操作最少持续60us

2、低到高的操作需在15us内完成

读时序

1、一次读1bit操作需至少持续60us

2、拉低操作持续1us~15us后释放,且在60us内完成读操作


总结:

这种串行操作的器件属于慢外设,一次温度读取包括两次复位,写4字节,读2字节,这里把所有时序压缩到几乎最短,一次读取也需要4.5ms左右,时间很长,因此如果实时性要求高的话,估计得用中断方式操作。

另外,期间感觉写1时序和读时序好像一样的,器件是怎么知道是写1还是读呢?判断应该是通过写“CC”“BE”成功才启动的读过程,而在此之前都是写过程,写完成启动读时序。因此,先调试写、再调试读,是合理的调试过程。


附代码:

#include "18B20.h"


#define DQ_1_H() GPIO_SetBits(GPIOB, GPIO_Pin_4)
#define DQ_1_L() GPIO_ResetBits(GPIOB, GPIO_Pin_4)
#define RD_DQ_1() GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_4)
#define DQ_2_H() GPIO_SetBits(GPIOB, GPIO_Pin_3)
#define DQ_2_L() GPIO_ResetBits(GPIOB, GPIO_Pin_3)
#define RD_DQ_2() GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_3)


void delay_nus(u16 time)
{
u16 i=0;
while(time--)
{
i=35;
while(i--);
}
}


u8 Waitready_1(void)
{
u8 presence = 0;

DQ_1_H();
delay_nus(1) ;


DQ_1_L();
delay_nus(105) ;


DQ_1_H();
delay_nus(2) ;


presence = RD_DQ_1();
delay_nus(30) ;
DQ_1_H();


return(presence) ;
}


void Init_18B20(void) {
GPIO_InitTypeDef GPIO_InitStructure;

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);
  ///PB4:channal 1
///PB3:channal 2
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOB, &GPIO_InitStructure);

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOB, &GPIO_InitStructure);

while(Waitready_1() != 0);
}


u8 ReadOneChar_1(void)
{
u8 i = 0 ;
u8 dat = 0 ;


for (i = 8 ; i > 0 ; i--)
  {
    DQ_1_L();
delay_nus(1) ;
    DQ_1_H();
    dat >>= 1 ;
//    DQ_1_H();
delay_nus(1) ;


    if(RD_DQ_1())
     dat |= 0x80 ;
delay_nus(11) ;
  }


return (dat) ;
}


void WriteOneChar_1(unsigned char dat)
{
  u8 i = 0 ;
  for (i = 8 ; i > 0 ; i--)
  {
    if (dat&0x01) {
DQ_1_L();
delay_nus(1) ;
DQ_1_H();
delay_nus(13) ;
}
else {
DQ_1_L();
delay_nus(13) ;
DQ_1_H();
delay_nus(1) ;
}


    dat>>=1 ;
  }
}


s8 Read_Temperature_1(void)
{
u8 temp_data[2];
s8 rtn = 0;

Waitready_1() ;


WriteOneChar_1(0xCC) ;
WriteOneChar_1(0x44) ;


Waitready_1() ;
WriteOneChar_1(0xCC) ;
WriteOneChar_1(0xBE) ;


temp_data[0] = ReadOneChar_1() ;
temp_data[1] = ReadOneChar_1() ;

rtn = (temp_data[1] << 4) | (temp_data[0] >> 4);

if ( rtn > 0 ) {

}
return (rtn);
}




原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 电脑强制关机后开不了机怎么办 受刺激后出现精神异常该怎么办 当屏幕出现暂时无法移动时怎么办 英雄联盟欧服连接不上服务器怎么办 试客联盟认证手机号成空号了怎么办 汽车脚垫不贴合翘起来了怎么办 版权保护迅雷下载不了的资源怎么办 30岁在外地城市找不到工作怎么办 新买的苹果爱拍充不进去电是怎么办 绝地求生东南亚服匹配不到人怎么办 电脑卡住了怎么办鼠标也点不动 幽灵行动荒野没有主线任务了怎么办 拼多多购买的东西下架了怎么办 电脑版的荒野行动玩的时候卡怎么办 欧洲卡车模拟2气压过低怎么办 word页眉和正文有段距离怎么办 酷派大神x7卡在开机界面怎么办 妹妹结婚跟领导请假不批怎么办 网页分享后不想显示连接网址怎么办 魔兽世界肉弹随从的任务断了怎么办 在美发店上班被小混混打了怎么办 孩子上四年级了不知道写作业怎么办 运动完第二天恶心想吐怎么办 吃减肥药皮肤变差了怎么办 生了孩子子宫没恢复好怎么办 cf我是新手不知道怎么报点怎么办 挑战人物已经有了又刷到怎么办 小米手机账户验证码隐藏了怎么办? 苹果手机绑定的邮箱密码忘了怎么办 魔域手机版不要的装备怎么办 魔域永恒多了的幻兽装备怎么办 魔域怀旧版70星以后宝宝怎么办 天猫确认收货后不寄发票怎么办 足球运动员踢了一半想撒尿了怎么办 17个月宝宝0型腿怎么办 走的路多了腿疼怎么办 如果新兵老被老兵打怎么办求求个位 做古董拍卖诈骗被警察抓了怎么办 武汉个人社保怎么办停转到海南来 狗狗车祸前脚软组织受伤了怎么办 6岁儿童夜里盗汗惊战发抖怎么办