Renesas R7FA8D1BH (Cortex®-M85) 控制DS18B20

目录

概述

1 软硬件

1.1 软硬件环境信息

1.2 开发板信息

1.3 调试器信息

2 FSP和KEIL配置

2.1 硬件接口电路

2.2  FSB配置DS18B20的IO

2.3 生成Keil工程文件

3 DS18B20驱动代码

3.1 DS18B20介绍

3.2 DS18B20驱动实现

3.2.1 IO状态定义

3.2.2 读IO状态函数

3.2.3 其他函数

4 测试程序

4.1 应用程序设计

4.2 测试 

5 附件


Renesas R7FA8D1BH (Cortex®-M85) 控制DS18B20和ADC,实现两个页面的跳转功能

概述

本文主要介绍Renesas R7FA8D1BH (Cortex®-M85)设计一个综合的应用案例:应用R7FA8D1BH的IO实现单总线协议,实现驱动ds18b20的功能,其主要完成读取温度值,并将该值格式化显示在OLED屏幕上。还通过串口终端将温度数据发送至串口终端上。

1 软硬件

1.1 软硬件环境信息

软硬件信息版本信息
Renesas MCUR7FA8D1BH
KeilMDK ARM 5.38
FSP 版本5.3.0
调试工具:N32G45XVL-STBDAP-LINK

1.2 开发板信息

笔者选择使用野火耀阳开发板_瑞萨RA8,该板块的主控MCU为R7FA8D1BHECBD,7FA8D1BHECBD的内核为ARM Contex-M85。

1.3 调试器信息

对于R7FA8D1BHECBD芯片,其使用的内核为Cortex®-M85 Core, ST-LINK-V2或者J-LINK-V9不支持下载和调试功能。笔者经过多次尝试,发现N32G45XVL-STB板卡上自带的DAP-LINK可以下载和调试R7FA8D1BHECBD。

下图为N32G45XVL-STB开发板实物图:

2 FSP和KEIL配置

2.1 硬件接口电路

耀阳开发板_瑞萨RA8上已经设计了DS18B20的接口电路,其使用P809接口作为DS18B20的DQ控制信号。

2.2  FSB配置DS18B20的IO

配置P809为普通的IO接口,然后在代码中动态配置该IO的输出或者输出状态

2.3 生成Keil工程文件

 完成FSP的参数配置之后,就可以Generate Project。打开项目文件,其架构如下:

创建ds18b20.c文件,实现驱动代码

3 DS18B20驱动代码

3.1 DS18B20介绍

笔者在之前的文章中,已经详细分析过DS18B20的时序以及实现逻辑,这里不在做介绍。

DS18B20应用笔记_ds18b20读取数据的波形-CSDN博客

3.2 DS18B20驱动实现

3.2.1 IO状态定义

代码第14行:定义us步长延时函数

代码第15行:定义ms步长延时函数

代码第18行:定义DS18B20的IO PIN

代码第21行:输入端口配置

代码第22行:输出端口配置

代码第24行:设置IO低电平

代码第25行:设置IO高电平

3.2.2 读IO状态函数

代码第47行:读取输入模式下IO的状态

 3.2.3 其他函数

函数:ds18b20Init, 检测DS18B20是否在线

函数:ds18b20BlockModeProcess。 读取DS18B20的数值

/*** @brief  reset DS18B20* @note   if reset ds18b20 sucess, the return value is TRUE* @param  None* @retval True or Flalse*/
static uint8_t ds18b20Init( void )
{uint16_t tempCnt = 0;bsp_io_level_t status;// Set PIN mode outputDS_Mode_Out_PP();// Master pin is high DQ_SET_HIGH;timeDelayUS(10);// Master pin is low DQ_SET_LOW;// wait for 600 us timeDelayUS(750);// Set PIN mode inputDS_Mode_IN_PUT();while(1){status = DQ_RAD_PIN();if( status == 0){tempCnt = 0;return TRUE;}else{timeDelayUS(1);tempCnt++;if( tempCnt > 480 )return FALSE;}}
}static uint8_t readBit( void )
{uint8_t readCnt = 2;uint8_t bitVal = 1;DQ_SET_LOW;timeDelayUS(3);DQ_SET_HIGH;timeDelayUS(5); // 15 us while(readCnt-- ){//read DQ value if( DQ_RAD_PIN() == 0){bitVal = 0;}timeDelayUS(2);  // 15 us }timeDelayUS(30);      // 15 us return  bitVal;
}static uint8_t ds18b20ReadByte( void )
{uint8_t byteVal = 0;for ( uint8_t i = 0; i < 8; i++ ){byteVal >>= 1;uint8_t bitVal = readBit(); if( bitVal > 0){byteVal |= 0x80;}}return  byteVal;
}/*** @brief  write one byte to DS18B20* @note   * @param  byte: the data that is sended to ds18b20* @retval None*/
void ds18b20WriteByte( uint8_t byte)
{unsigned char k;// Set PIN mode outputDS_Mode_Out_PP();for ( k = 0; k < 8; k++ ){if (byte & (1<<k)){DQ_SET_LOW;timeDelayUS(2); DQ_SET_HIGH;timeDelayUS(65); }else{DQ_SET_LOW;timeDelayUS(65); DQ_SET_HIGH;timeDelayUS(2); }}
}uint8_t ds18b20BlockModeProcess( void )
{uint16_t tempValue;uint8_t tempL, tempH;if (ds18b20Init() == FALSE){return FALSE;}// wait for 600 us timeDelayUS(600);ds18b20WriteByte(0xcc);ds18b20WriteByte(0x44);  // start convert temperature if (ds18b20Init() == FALSE){return FALSE;}// wait for 600 us timeDelayUS(600);ds18b20WriteByte(0xcc);ds18b20WriteByte(0xbe);  // read temperature data registertempL = ds18b20ReadByte();tempH = ds18b20ReadByte();if (tempH > 0x7f) {tempL    = ~tempL;tempH    = ~tempH+1; st_ds1b20val.sign = 1;}tempValue = (uint16_t)((tempH << 8) | tempL);st_ds1b20val.temperatureVal = (float)(tempValue * 0.0625);return TRUE;
}// NO blocking mode operate ds18b20 
uint8_t ds18b20NoBlockingProcess( void )
{uint16_t tempValue;static uint16_t waitCnt = 0;uint8_t tempL, tempH;static  uint8_t runState = 0;switch( runState ){default:case INIT_DQ:if (ds18b20Init() == FALSE){return FALSE;}runState = WAIT_READY;break;case WAIT_READY:timeDelayUS(2);       // IDEL runState = SKIDROM_CMD;break;case SKIDROM_CMD:ds18b20WriteByte(0xcc);ds18b20WriteByte(0x44);  // begin to convert temperature datawaitCnt = 0;runState = WAIT_CONVERT;break;case WAIT_CONVERT:waitCnt++;if( waitCnt > WAIT_CNT_CONVERT){waitCnt = 0;runState = RESET_CMD;}break;case RESET_CMD:if (ds18b20Init() == FALSE){return FALSE;}runState = WAIT_DATA_READY;break;case WAIT_DATA_READY: timeDelayUS(2);     // IDEL runState = READ_CMD;break;case READ_CMD:ds18b20WriteByte(0xcc);ds18b20WriteByte(0xbe);  // read temperature data registerrunState = GET_VALUE;break;case GET_VALUE:tempL = ds18b20ReadByte();tempH = ds18b20ReadByte();if (tempH > 0x7f) {tempL    = ~tempL;tempH    = ~tempH+1; st_ds1b20val.sign = 1;}tempValue = (uint16_t)((tempH << 8) | tempL);st_ds1b20val.temperatureVal = (float)(tempValue * 0.0625);runState = INIT_DQ;return TRUE;}return FALSE;
}

4 测试程序

4.1 应用程序设计

代码113行:读取ds18b20的值

代码130行:获得ds18b20的结果数据

代码131行:格式化显示数据

代码132行:显示数据到OLED上

4.2 测试 

编译代码,并下载代码到板卡中,其运行结果如下:

5 附件

DS18B20的驱动代码

1)创建ds18b20.c文件,编写如下代码

 /*FILE NAME  :  ds18b20.cDescription:  user ds18b20 interface Author     :  tangmingfei2013@126.comDate       :  2024/06/03*/
#include "ds18b20.h" 
#include "hal_data.h"typedef enum{INPUT = 0,OUTPUT = 1,
}IO_TYPE;typedef enum{FALSE = 0,TRUE = 1,
}RETURN_RESULT;typedef enum{INIT_DQ = 0,WAIT_READY,SKIDROM_CMD,WAIT_CONVERT,RESET_CMD,READ_CMD,WAIT_DATA_READY,GET_VALUE,IDLE_NULL
}RUN_STATE;ds18b20Struc st_ds1b20val;ds18b20Struc get_ds18b20_value( void )
{return st_ds1b20val;
}static bsp_io_level_t DQ_RAD_PIN(void)
{bsp_io_level_t state;// READ ioR_IOPORT_PinRead(&g_ioport_ctrl, DS_IO_PORT_PIN, &state);return state;
}/*** @brief  reset DS18B20* @note   if reset ds18b20 sucess, the return value is TRUE* @param  None* @retval True or Flalse*/
static uint8_t ds18b20Init( void )
{uint16_t tempCnt = 0;bsp_io_level_t status;// Set PIN mode outputDS_Mode_Out_PP();// Master pin is high DQ_SET_HIGH;timeDelayUS(10);// Master pin is low DQ_SET_LOW;// wait for 600 us timeDelayUS(750);// Set PIN mode inputDS_Mode_IN_PUT();while(1){status = DQ_RAD_PIN();if( status == 0){tempCnt = 0;return TRUE;}else{timeDelayUS(1);tempCnt++;if( tempCnt > 480 )return FALSE;}}
}static uint8_t readBit( void )
{uint8_t readCnt = 2;uint8_t bitVal = 1;DQ_SET_LOW;timeDelayUS(3);DQ_SET_HIGH;timeDelayUS(5); // 15 us while(readCnt-- ){//read DQ value if( DQ_RAD_PIN() == 0){bitVal = 0;}timeDelayUS(2);  // 15 us }timeDelayUS(30);      // 15 us return  bitVal;
}static uint8_t ds18b20ReadByte( void )
{uint8_t byteVal = 0;for ( uint8_t i = 0; i < 8; i++ ){byteVal >>= 1;uint8_t bitVal = readBit(); if( bitVal > 0){byteVal |= 0x80;}}return  byteVal;
}/*** @brief  write one byte to DS18B20* @note   * @param  byte: the data that is sended to ds18b20* @retval None*/
void ds18b20WriteByte( uint8_t byte)
{unsigned char k;// Set PIN mode outputDS_Mode_Out_PP();for ( k = 0; k < 8; k++ ){if (byte & (1<<k)){DQ_SET_LOW;timeDelayUS(2); DQ_SET_HIGH;timeDelayUS(65); }else{DQ_SET_LOW;timeDelayUS(65); DQ_SET_HIGH;timeDelayUS(2); }}
}uint8_t ds18b20BlockModeProcess( void )
{uint16_t tempValue;uint8_t tempL, tempH;if (ds18b20Init() == FALSE){return FALSE;}// wait for 600 us timeDelayUS(600);ds18b20WriteByte(0xcc);ds18b20WriteByte(0x44);  // start convert temperature if (ds18b20Init() == FALSE){return FALSE;}// wait for 600 us timeDelayUS(600);ds18b20WriteByte(0xcc);ds18b20WriteByte(0xbe);  // read temperature data registertempL = ds18b20ReadByte();tempH = ds18b20ReadByte();if (tempH > 0x7f) {tempL    = ~tempL;tempH    = ~tempH+1; st_ds1b20val.sign = 1;}tempValue = (uint16_t)((tempH << 8) | tempL);st_ds1b20val.temperatureVal = (float)(tempValue * 0.0625);return TRUE;
}// NO blocking mode operate ds18b20 
uint8_t ds18b20NoBlockingProcess( void )
{uint16_t tempValue;static uint16_t waitCnt = 0;uint8_t tempL, tempH;static  uint8_t runState = 0;switch( runState ){default:case INIT_DQ:if (ds18b20Init() == FALSE){return FALSE;}runState = WAIT_READY;break;case WAIT_READY:timeDelayUS(2);       // IDEL runState = SKIDROM_CMD;break;case SKIDROM_CMD:ds18b20WriteByte(0xcc);ds18b20WriteByte(0x44);  // begin to convert temperature datawaitCnt = 0;runState = WAIT_CONVERT;break;case WAIT_CONVERT:waitCnt++;if( waitCnt > WAIT_CNT_CONVERT){waitCnt = 0;runState = RESET_CMD;}break;case RESET_CMD:if (ds18b20Init() == FALSE){return FALSE;}runState = WAIT_DATA_READY;break;case WAIT_DATA_READY: timeDelayUS(2);     // IDEL runState = READ_CMD;break;case READ_CMD:ds18b20WriteByte(0xcc);ds18b20WriteByte(0xbe);  // read temperature data registerrunState = GET_VALUE;break;case GET_VALUE:tempL = ds18b20ReadByte();tempH = ds18b20ReadByte();if (tempH > 0x7f) {tempL    = ~tempL;tempH    = ~tempH+1; st_ds1b20val.sign = 1;}tempValue = (uint16_t)((tempH << 8) | tempL);st_ds1b20val.temperatureVal = (float)(tempValue * 0.0625);runState = INIT_DQ;return TRUE;}return FALSE;
}/* End of this file */

2)创建ds18b20.h文件,编写如下代码

/*FILE NAME  :  ds18b20.hDescription:  user ds18b20 interface Author     :  tangmingfei2013@126.comDate       :  2024/06/03
*/
#ifndef DS18B20_H
#define DS18B20_H
#include "hal_data.h"#define WAIT_CNT_CONVERT     500 #define timeDelayUS(us)      R_BSP_SoftwareDelay(us, BSP_DELAY_UNITS_MICROSECONDS);
#define DS_DELAY_MS(ms)      R_BSP_SoftwareDelay(ms, BSP_DELAY_UNITS_MILLISECONDS);#define DS_IO_PORT_PIN       BSP_IO_PORT_08_PIN_09#define DS_Mode_IN_PUT()     R_IOPORT_PinCfg(&g_ioport_ctrl, DS_IO_PORT_PIN, IOPORT_CFG_PORT_DIRECTION_INPUT)
#define DS_Mode_Out_PP()     R_IOPORT_PinCfg(&g_ioport_ctrl, DS_IO_PORT_PIN, IOPORT_CFG_PORT_DIRECTION_OUTPUT)#define DQ_SET_LOW           R_IOPORT_PinWrite(&g_ioport_ctrl, DS_IO_PORT_PIN, BSP_IO_LEVEL_LOW)
#define DQ_SET_HIGH          R_IOPORT_PinWrite(&g_ioport_ctrl, DS_IO_PORT_PIN, BSP_IO_LEVEL_HIGH)typedef struct{float  temperatureVal; bool sign;
}ds18b20Struc;uint8_t ds18b20BlockModeProcess( void );
ds18b20Struc get_ds18b20_value( void );#endif   /* DS18B20_H */

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/45214.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OpenCV:python图像旋转,cv2.getRotationMatrix2D 和 cv2.warpAffine 函数

前言 仅供个人学习用&#xff0c;如果对各位朋友有参考价值&#xff0c;给个赞或者收藏吧 ^_^ 一. cv2.getRotationMatrix2D(center, angle, scale) 1.1 参数说明 parameters center&#xff1a;旋转中心坐标&#xff0c;是一个元组参数(col, row) angle&#xff1a;旋转角度…

Go-知识测试-模糊测试

Go-知识测试-模糊测试 1. 定义2. 例子3. 数据结构4. tesing.F.Add5. 模糊测试的执行6. testing.InternalFuzzTarget7. testing.runFuzzing8. testing.fRunner9. FuzzXyz10. RunFuzzWorker11. CoordinateFuzzing12. 总结 建议先看&#xff1a;https://blog.csdn.net/a1879272183…

一文入门【NestJs】Providers

Nest学习系列 ✈️一文入门【NestJS】 ✈️一文入门【NestJs】Controllers 控制器 &#x1f6a9; 前言 在NestJS的世界里&#xff0c;理解“Providers”是构建健壮、可维护的后端服务的关键。NestJS&#xff0c;作为Node.js的一个现代框架&#xff0c;采用了Angular的一些核…

Redis的安装配置及IDEA中使用

目录 一、安装redis&#xff0c;配置redis.conf 1.安装gcc 2.将redis的压缩包放到指定位置解压 [如下面放在 /opt 目录下] 3.编译安装 4.配置redis.conf文件 5.开机自启 二、解决虚拟机本地可以连接redis但是主机不能连接redis 1.虚拟机网络适配器网络连接设置为桥接模式…

VSCode上通过C++实现单例模式

单例模式实际上就是为了确保一个类最多只有一个实例&#xff0c;并且在程序的任何地方都可以访问这个实例&#xff0c;也就是提供一个全局访问点&#xff0c;单例对象不需要手动释放&#xff0c;交给系统来释放就可以了&#xff0c;单例模式的设计初衷就是为了在整个应用程序的…

vue 下拉菜单树形结构——vue-treeselect的组件使用

参考&#xff1a; https://www.cnblogs.com/syjtiramisu/p/17672866.htmlhttps://www.cnblogs.com/syjtiramisu/p/17672866.html vue-treeselect的使用 - 简书下载依赖 使用https://www.jianshu.com/p/459550e1477d 实际项目使用&#xff1a;

uni-app iOS上架相关App store App store connect 云打包有次数限制

相册权限 uni-app云打包免费有次数 切换一个账号继续

华为手机联系人不见了怎么恢复?3个解决方案

华为手机联系人列表就像是我们精心编织的社交网络之网。然而&#xff0c;有时&#xff0c;这张网可能会因为各种原因而意外破损&#xff0c;联系人信息消失得无影无踪&#xff0c;让我们陷入“人脉孤岛”的困境。华为手机联系人不见了怎么恢复&#xff1f;别担心&#xff0c;我…

构建高质量数据集与智能数据工程平台:播客AI Odyssey深度对话实录

对话整数智能联创和前IDEA研究员&#xff1a;构建高质量数据集与智能数据工程平台 - AI Odyssey | 小宇宙 - 听播客&#xff0c;上小宇宙 人工智能技术的日益深远发展&#xff0c;对人工智能的性能提升与技术迭代提出了新的要求。在大模型训练中&#xff0c;已有的研究和实践表…

【操作系统】进程管理——用信号量机制解决问题,以生产者-消费者问题为例(个人笔记)

学习日期&#xff1a;2024.7.10 内容摘要&#xff1a;利用信号量机制解决几个经典问题模型 目录 引言 问题模型 生产者-消费者问题&#xff08;经典&#xff09; 多生产者-多消费者问题 吸烟者问题 读者写者问题&#xff08;难点&#xff09; 哲学家进餐问题&#xff0…

解决POST请求中文乱码问题

解决POST请求中文乱码问题 1、乱码原因2、解决方法3、具体步骤 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 在Web开发中&#xff0c;处理POST请求时经常遇到中文乱码问题&#xff0c;这主要是由于服务器在接收到POST请求的数据后&#x…

BUG解决:postman可以请求成功,但Python requests请求报403

目录 问题背景 问题定位 问题解决 问题背景 使用Python的requests库对接物联数据的接口之前一直正常运行&#xff0c;昨天突然请求不通了&#xff0c;通过进一步验证发现凡是使用代码调用接口就不通&#xff0c;而使用postman就能调通&#xff0c;请求参数啥的都没变。 接口…

SSL 证书错误:如何修复以及错误发生的原因

SSL证书可以提升网站的可信度。然而&#xff0c;如果您的SSL证书出现错误&#xff0c;您可能会得到一个“不安全”的标签&#xff0c;这可能会导致访问者失去对您网站的信任并转向竞争对手。 本文将介绍SSL证书错误的原因及其对用户的潜在影响。随后&#xff0c;我们将提供详细…

MybatisPlus 核心功能

MybatisPlus 核心功能 文章目录 MybatisPlus 核心功能1. 条件构造器1.1 QueryWrapper1.2 LambdaQueryWrapper&#xff08;推荐&#xff09;1.3 UpdateWrapper1.4 LambdaUpdateWrapper 2. 自定义SQL3. Service接口 1. 条件构造器 当涉及到查询或修改语句时&#xff0c;MybatisP…

界面组件Kendo UI for React 2024 Q2亮点 - 生成式AI集成、设计系统增强

随着最新的2024年第二季度发布&#xff0c;Kendo UI for React为应用程序开发设定了标准&#xff0c;包括生成式AI集成、增强的设计系统功能和可访问的数据可视化。新的2024年第二季度版本为应用程序界面提供了人工智能(AI)提示&#xff0c;从设计到代码的生产力增强、可访问性…

Java毕业设计 基于SSM vue图书管理系统小程序 微信小程序

Java毕业设计 基于SSM vue图书管理系统小程序 微信小程序 SSM 图书管理系统小程序 功能介绍 用户 登录 注册 首页 图片轮播 图书信息推荐 图书详情 赞 踩 评论 收藏 系统公告 公告详情 用户信息修改 我的待还 图书归还 催还提醒 我的收藏管理 意见反馈 管理员 登录 个人中心…

绝地求生PUBG奇幻大乱斗怎么玩 奇幻大乱斗什么时候回归

《绝地求生》(PUBG) 是由韩国开发的一款战术竞技型射击类沙盒游戏&#xff0c;游戏中我们需要和队友组队乘坐飞机跳伞到达一座空岛&#xff0c;之后我们需要搜索一切我们可以用到的物资&#xff0c;之后我们于敌人进行对战&#xff0c;期间不断躲避毒圈的追击&#xff0c;最后当…

Redis+Caffeine 实现两级缓存实战

RedisCaffeine 实现两级缓存 背景 ​ 事情的开始是这样的&#xff0c;前段时间接了个需求&#xff0c;给公司的商城官网提供一个查询预计送达时间的接口。接口很简单&#xff0c;根据请求传的城市仓库发货时间查询快递的预计送达时间。因为商城下单就会调用这个接口&#xff…

防火墙安全策略及用户认证实验

目录 一、实验拓扑 二、实验要求 三、实验思路 四、实验配置 1、配置vlan 2、配置路由器、防火墙IP地址&#xff0c;划分区域 3、配置安全策略 ​策略一&#xff1a; 策略二&#xff1a; 策略三&#xff1a; 4、配置用户认证 策略一&#xff1a; 策略二&#xff1a…

WebGIS基础原理

该部分内容与部分插图、学习框架的主要参考的网站与博主如下&#xff08;也趁机分享给大家&#xff09;&#xff1a; OSGeo开源WebGIS在线教程&#xff1a;http://webgis.cn/ OSGeo《地理信息系统原理》&#xff1a;https://www.osgeo.cn/gis-tutorial/index.html OSGeo《Pyth…