没有合适的资源?快使用搜索试试~ 我知道了~
首页在STM32上通过UART+DMA实现One-Wire总线
在STM32上通过UART+DMA实现One-Wire总线
661 浏览量
更新于2023-05-26
评论
收藏 135KB PDF 举报
One-wire总线使用一根并联总线完成对于多个设备的访问,通过上拉的OD门实现多设备的读写操作,通过ID区别设备,通过CRC5完成数据校验。
资源详情
资源评论
资源推荐

在在STM32上通过上通过UART+DMA实现实现One-Wire总线总线
One-wire总线使用一根并联总线完成对于多个设备的访问,通过上拉的OD门实现多设备的读写操作,通过ID区别设
备,通过CRC5完成数据校验。
One-wire总线使用一根并联总线完成对于多个设备的访问,通过上拉的OD门实现多设备的读写操作,通过ID区别设备,通过CRC5
完成数据校验。
常见对于one-wire总线的操作代码主要使用包含基础循环的延时函数实现位读写时序控制,进而实现总线读写(字节读写)。随着
MCU主时钟速度不断加速(STM32F4xx主时钟MCLK为168MHz),延时循环次数变得很巨大,产生了以下的问题:
1.浪费了大量的MCU时钟周期做等待。
2.在不同编译器优化级别下,设定的延时计数值常量有可能产生不精确的延时。
3.需要针对时序设定每个状态机的延时参数,参数调整复杂且不稳定。
1.物理连接方法(PCB设计)
2. UART实现位操作的原理
1)总线复位
使用9600-8-N-1的UART配置,发送0XF0并返回0X10~0X90实现总线复位时序。返回其他值标示总线上无设备挂载。
2)总线位读操作
使用115200-8-N-1的UART配置,发送0XFF并返回0XFF(表示读取bit为1)或其他(表示读取为0)实现总线读时序。
1)总线位写操作
使用115200-8-N-1的UART配置,发送0XFF并返回0XFF(表示写入bit为1)或发送0X00并返回0X00(表示写入为0)实现总线位写
时序。
3. DMA方式实现One-wire总线读写实现
除了复位操作外,对于one-wire总线的操作通常以1个字节为读写单位,即连续的8个位操作。如果由用户代码实现多位操作,则需要
用户代码不断响应UART中断函数,实现对于UART发送、接收数据寄存器的读写。这会导致代码复杂且打断OS系统其它操作。
而采用DMA方式则很容易实现one-wire总线8bit数据的连续读写。
其原理如下:
1.设定一个宽度为byte容量为8的缓冲。UART的TX/RX DMA传输存储器地址都指向此缓冲。
2.对于byte写操作,将要写入的byte通过上述的位写操作将每一bit转换成发送数据byte顺序存入缓冲,启动两个DMA,通过等待RX
DMA的完成标志(TC)完成一次写操作。
3.对于byte读操作,将0xFF连续8次存入缓冲,启动两个DMA,通过等待RX DMA完成标志(TC)完成一次读操作,读取的数据通过


















安全验证
文档复制为VIP权益,开通VIP直接复制

评论0