完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
1.GPIO口软件模拟协议通信
物理层:TX RX 5V GND TX和RX加外部上拉,GND加滤波电容 协议层:双机异步全双工通信 协议内容:2ms高电平2ms低电平表示数据0, 2ms高电平6ms低电平表示数据1. 以帧为单位,一帧16个字节,第一个字节是固定的0x5A,最后一个字节是前十五字节按位求和取反做校验,每帧开始有2ms高电平10ms低电平的帧头,每帧结束后多发一个数据0做缓冲。先发高位。 代码实现: 发送过程:主要是严格按照协议内容控制TX的电平高低的时间(字节数据的赋值放在主循环里,电平高低时间控制放在定时器中断里,专门写一个发送函数实现协议内容) 1.先发帧头 把发送实现函数放到1ms定时中断里,每次执行加1,帧头标志位 2.给字节数据赋值,字节数据拆分成bit(字节数据逐步按位与(0x80<<1)) 3.发送帧尾,一帧数据结束,等待主循环给字节数据赋新值 接收过程:主要是严格按照协议内容解析RX收到的高低电平的时间(电平高低时间控制放在定时器中断里,专门写一个接收函数解析协议内容,字节数据不断更新) 1.接收函数放在1ms中断,接收高低电平数都有计数,每次上升沿清零计数(每接收完一位) 2.先收帧头,帧头标志位,最低位不断更新数据,逐次移位,更新完8位字节数加1(高位优先) 3.一帧数据接收完成,清标志位,等下一个上升沿(数据0缓冲)和帧头。 优缺点:不占用串口接收和发送的中断资源,软件实现移位寄存器和SBUFF功能,相当于串口中断的底层实现,但需要一个1ms定时器中断,速率:6816+10+4=782ms,平均每0.782s发送一帧数据。 2.标准串口通信 物理层:TX和RX(标准串口高+5低0) 协议标准常用的有RS-232C(高-12低12)、RS-422A(差分全双工四线有效抑制干扰和噪声1200m)、RS-485 (差分半双工两线有效抑制干扰和噪声1200m)两线压差+(2-6)表示逻辑1 协议层(以标准串口通信为例):TTL电平高表示数据位1,TTL电平低表示数据位0,以字节为单位,有效数据位数和校验位可根据芯片配置,每发送或接收一个字节数据都触发中断处理当前字节数据(也可使用查询方式)。数据包的起始信号由一个逻辑== 0== 的数据位表示,而数据包的停止信号可由 0.5、1、1.5 或 2 个逻辑 1 的数据位表示。起始信号和停止信号不用关心具体实现。高低位优先一般也可配置。 代码实现: 1.配置RX和TX的输入输出及输入输出模式和异步时钟源选择 2.波特率设置:1.定时计数器选择,定时计数器工作方式选择,开定时计数器中断,查询溢出还是(溢出触发中断以及中断处理),溢出中断处理装载计数初值 3.确定串口工作方式,高低位优先,校验位有无,有效数据位长停止位位长,还可以控制串口寄存器实现多机通信 4…启动定时器中断,串口中断,串口接收允许位,查询或中断处理溢出标志位(发送和接收完一个字节数据都可以触发中断),给SBUFF赋值(接收SBUFF数据),清溢出标志位 3.I2C通信 物理层:I2C双线(SCL时钟线SDA数据线)半双工同步通信 I2C线与——开漏输出配置上拉电阻——开漏输出与推挽输出——NPN和PNP三极管的相应知识 协议层:起始信号(SCL高电平SDA下降沿)设备地址七位一位读写位(1读0写 ) 一位应答位(0应答1非应答)内存地址八位(从机属性决定的)一位应答位 数据八位(一位应答位)停止信号(SCL高电平SDA上升沿)SCL高电平期间检测数据位SCL低电平期间数据位变化高位优先 代码实现: 4.SPI通信 物理层:串口全双工同步通信(NSS片选线、MOSI、MISO、SCK) 协议层:1.片选信号线低电平有效一般直接使用普通IO口控制 2.MOSI主机输出信号线,可以设置数据位长,高低位优先 3.MISO主机输入从机输出信号线 4.时钟信号线,波特率设置 5.CPOL/CPHA 及通讯模式 实际经常采用模式0和模式3 这些选择也要配合从机设备的属性 代码实现: 时钟选择,IO功能复用,配置工作参数,起始和停止信号、写按字节收发的函数(可以通过查询或者中断方式来实现数据收发,注意发送超时处理) 注意:写入完毕后等待 RXNE 事件,即接收缓冲区非空事件。由于 SPI 双线全双工模式下 MOSI 与 MISO 数据传输是同步的,当接收缓冲区非空时,表示上面的数据发送完毕,且接收缓冲区也收到新的数据 |
|
|
|
只有小组成员才能发言,加入小组>>
3311 浏览 9 评论
2994 浏览 16 评论
3493 浏览 1 评论
9058 浏览 16 评论
4087 浏览 18 评论
1176浏览 3评论
604浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
598浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2334浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1895浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-22 22:48 , Processed in 1.180338 second(s), Total 79, Slave 59 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号