前言

One-wire总线使用一根并联总线完成对于多个设备的访问,通过上拉的OD门实现多设备的读写操作,通过ID区别设备,通过CRC5完成数据校验。常见对于one-wire总线的操作代码主要使用包含基础循环的延时函数实现位读写时序控制,进而实现总线读写(字节读写)。这也产生了以下的问题:

1. 浪费了大量的MCU时钟周期做等待。

2. 在不同编译器优化级别下,设定的延时计数值常量有可能产生不精确的延时。

3. 需要针对时序设定每个状态机的延时参数,参数调整复杂且不稳定。

4. 延时容易被中断任务介入,导致延时不准确,程序功能不稳定

本节将带领大家用单片机的串口实现OneWire总线操作,将stm32的串口的TX引脚与RX引脚短接后与1-Wire总线相连,其理论实现原理如下:

1) 总线复位

1-wrie总线复位时序图

使用9600-8-N-1的UART配置,在TX引脚发送0XF0并在RX引脚读取返回0X10~0X90实现总线复位时序。返回其他值标示总线上无设备挂载。

2) 总线位读操作

1-wrie总线读时序图

使用115200-8-N-1的UART配置,在TX引脚发送0XFF并在RX引脚读取返回0XFF(表示读取bit为1)或其他(表示读取为0)实现总线读时序。

3) 总线位写操作

1-wrie总线读时序图

使用115200-8-N-1的UART配置,在TX引脚发送0XFF并在RX引脚读取返回0XFF(表示写入bit为1)或发送0X00并返回0X00(表示写入为0)实现总线位写时序。

4)DMA方式实现One-wire总线读写实现

除了复位操作外,对于one-wire总线的操作通常以1个字节为读写单位,即连续的8个位操作。如果由用户代码实现多位操作,则需要用户代码不断响应UART中断函数,实现对于UART发送、接收数据寄存器的读写。这会导致代码复杂且打断系统其它操作。而采用DMA方式则很容易实现one-wire总线8bit数据的连续读写。其具体实现原理如下:

a. 设定一个宽度为byte容量为8的缓冲。UART的TX/RX DMA传输存储器地址都指向此缓冲。

b. 对于byte写操作,将要写入的byte通过上述的位写操作将每一bit转换成发送数据byte顺序存入缓冲,启动两个DMA,通过等待RX DMA的完成标志(TC)完成一次写操作。

c. 对于byte读操作,将0xFF连续8次存入缓冲,启动两个DMA,通过等待RX DMA完成标志(TC)完成一次读操作,读取的数据通过上述的位读操作,将bit转换成输出的byte数据。

下面开始具体实现!!

示例详解

基于硬件平台: STM32F10C8T6最小系统板, MCU 的型号是 STM32F103c8t6, 使用stm32cubemx 工具自动产生的配置工程,使用KEIL5编译代码。

本示例所用的最小系统板原理图:

  1. 从本节开始,关于CUBEMX工具及KEIL工具的操作将不再细讲,如果还有不熟悉的可以查看之前的教程文档。下面直接介绍工程配置:
  1. 系统时钟树

  1. 串口配置

开启发送DMA

开启中断

同时可以在后面生成代码时高级选项中可以勾选不生成代码:

  1. 引脚配置

  1. 工程代码

    1. 加入事先准备好的OneWire.c及.h文件到工程(头文件放在inc文件夹下即可):

同时在usart.c源文件中加入一个函数,并在头文件中申明函数:

  1. 在main.c 中加入如下图所示代码

  1. 接上DS18B20温度传感器看一下效果,记理将PA9,PA10引脚短接,仿真查看程序运行结果:

全速运行后可以看到变找到一个DS18B20设备,ROM为:28 2a fa df 0a 00 00 8d,当前温度为27.5度(下图显示2750是放大100倍后的温度)。

可以看到程序功能正常,再来看看用串口实现OneWire总线的代码:

是不是很简单,很清爽!!

OK,本期实验完成!下期见!同时如果大家有什么疑问或是有想了解的其它内容,也欢迎大家留言!!最后喜欢这个公众号的同学们记得加关注了,每天都会有技术干货推出!!

文中资料下载,在公众号里给十三发消息:

下载|STM32进阶教程 20

关注十三公众号

STM32 进阶教程 20 - 串口+DMA实现OneWire总线相关推荐

  1. STM32 进阶教程 15 - 串口DMA收发

    前言 串口操作相信大家一定很熟悉,如果你已经会串口的收发数据,并可以灵活使用轮询及中断方式对串口进行数据收发,那么恭喜你,学完本节内容后,也将可以学会串口的更高级操作方式,DMA方式,DMA操作串口可 ...

  2. STM32 进阶教程 19 - IQmath数学库的使用

    前言 STM32 M3 系列是不带浮点运算单元的,小数运算都是采用定点转浮点试式实现的,本节给大家介绍一个很好用的定点转浮点数学运算库,IQmath是德州仪器 (TI) 的一个高度优化的高精度数学函数 ...

  3. STM32 进阶教程 18 – ADC间断模式

    前言 STM32 的ADC拥有连续扫描模式,也有间断模式,间断模式较扫描模式需要更多的触发事件才能完成所有的通道转换操作,在实际工程应用中,可以利用间断模式实现一些特殊应用.关于间断模式,在STM32 ...

  4. STM32 进阶教程 17 - ADC注入通道

    前言 STM32 的ADC的一个强大功能是支持触发注入功能,在103中每个ADC模块支持4个注入通道,每个注入通道具有独立的结果突存器,注入通道具有较规划通道更高的优先级,在实际工程应用中,注入通道更 ...

  5. STM32 进阶教程 16 - ADC1与ADC2同步采样

    前言 STM32中在有2个或以上ADC模块的产品中,可以使用双ADC模式.在双ADC模式里,根据ADC1_CR1寄存器中DUALMOD[2:0]位所选的模式,转换的启动可以是ADC1主和ADC2从的交 ...

  6. STM32 进阶教程 12 - M4的硬件乘法器使用

    前言 Cortex-M4支持硬件浮点运算单元(有些厂商直接说成DSP模块),本节将给大家介绍STM32F407芯片中硬件浮点运算单元中的使用及带来的性能对比. 示例详解 基于硬件平台: 正点源子的st ...

  7. STM32 进阶教程 2 - micropython 使用

    前言 Python是一种解释型.面向对象.动态数据类型的高级程序设计语言. Python 是一个高层次的结合了解释性.编译性.互动性和面向对象的脚本语言.具有如下特点: 1.易于学习:Python有相 ...

  8. STM32 进阶教程 1 - micropython 移植

    前言 Python是一种解释型.面向对象.动态数据类型的高级程序设计语言. Python 是一个高层次的结合了解释性.编译性.互动性和面向对象的脚本语言.具有如下特点: 1.易于学习:Python有相 ...

  9. STM32 电机教程 20 - 基于ST MC Workbench 无感FOC

    前言 磁场定向控制又称矢量控制(FOC), 本质上为控制定子电流的幅度和相位,使之产生的磁场和转子的磁场正交,以产生最大的扭矩. PMSM的磁场定向控制框图如下图所示: 第19讲成功实现了基于NUCL ...

最新文章

  1. cv2.circle函数
  2. ElasticSearch日志删除命令
  3. IOS UITableView的点击展开隐藏功能的思路
  4. mysql判断数字的函数_Mysql必读MySql判断汉字、日期、数字的具体函数
  5. python classmethod static_python @classmethod 和 @staticmethod
  6. “Internet Explorer无法打开站点,已终止操作”解决
  7. maven项目添加新dependency jar后本地可正常运行,但打包后加载不上
  8. 新中大计算机知识,新中大财务软件操作步骤
  9. EBS API及接口
  10. 数据仓库工程师基本技能
  11. 利用幂级数性质解级数求和问题
  12. PDFJS跨域显示PDF文件的两种方法
  13. Teradata 数据库介绍
  14. 南昌大学 计算机面试题,南昌大学计算机应用技术专业调剂生复试经验
  15. 常用EMAIL的pop和smtp服务器地址
  16. 睿泽物联 Cat.1单灯控制器打造5G智慧灯杆新应用
  17. 浏览器的多进程与js单线程
  18. gdpr隐私保护_GDPR来袭,你知道如何保护个人和企业的隐私吗?(第2期)
  19. Android ASM 插桩实践
  20. QT学生信息管理系统

热门文章

  1. jquery的html代码中a的onclick的正确显示的代码
  2. OA学习笔记-001-项目介绍
  3. 你的第一个AngularJS应用--教程二:基架、建立和測试的工具
  4. Linux的关机与重启命令
  5. Normal-Inverse Gamma Mixture简介
  6. 使用超图桌面版制作点图层并发布为地图服务
  7. Appium进行iOS自动化测试时遇到的问题及解决办法
  8. [.NET开发] C#编程调用Cards.dll实现图形化发牌功能示例
  9. isotope == parallax 例子
  10. doctype的种类