188610329 发表于 2022-4-16 15:25 感谢降解 明白了 1302的意思理解 但感觉有点浪费 哈哈 595暂时还没用到 因为牵涉到端口扩展之类的应用很少 所以没怎么接触 广播的说法受益了 你说的分组广播我还真没想过 感觉是个挺有用的方法 不过还好 我做了个配置文件 里边会定义单片机型号 比如STC12系是6 15系是11 8系是15 如果15系之后并且定义9位传输 编译时自动用SADDR中断服务 如果之前则自动用非SADDR中断服务 将来遇到需要分组广播 可以比较容易的改回去 |
dzbj 发表于 2022-4-16 12:44 串口1的 "同步寄存器模式" 是把 TX 用作时钟线(CLK), RX用作数据线(IO)来进行传送的。 当 SCON = 0x00; 的时候, 你把要发送的数据 写入 SBUF, 就会触发 串口开始工作,从TX发出8个时钟,并且从RX 按 低位在前(LSB)的格式,把数据发出去,发送完一整个字节之后,会TI置1,你查询方式也好,中断方式也好,得到TI == 1 这个信号之后, 继续清TI 写 SBUF 发送下一位, 这是一个非常高效的方式,在用连续写,连续读的方式的时候,完全不影响单片机的其他工作,不用像 模拟方式那样,用for循环 一个一个位的发出去。接收的时候,一样道理,当RI =0, REN =1 则会TX发出8个时钟, RX依次读取 外部IO 的电平, 全部接收后 写入SBUF 并且 RI 置1, 你查询也好,中断也好,继续后续操作即可。 驱动 DS1302 需要多用一个单片机 IO 来控制 CE, 不过,这里有一个问题,就是DS1302 速度比较慢,而串口1的同步移位寄存器速率不可调,需要把晶振调到 6MHz 以下才能比较稳定传输,不是非常合算。(我前文提到DS1302主要是举个例子,并不推荐这样操作DS1302) 实际上,串口1我主要是 操作HC595, 他速率高到27MHz 就算 我MCU 主频开到最高,也能稳定传输,对于驱动大面积点阵,用串口1可以有效避免在定时器中断里耗费大量的时间。 然后说一下,串口的“广播” ,我的意思是,如果是非硬件地址判断,你可以自由的建立广播小组,比如:0xFF 是所有从机, 0x1F 是,1号到20号机 0x3f 是21到40 号机,也不需要什么掩码去限制,甚至完全不需要去考虑掩码等等,这些完全可以自由定义,甚至 可以把从机数量 增加到 65000 台 用16位从机地址。而不需要 受到 硬件SADDR + SADEN 的束缚,主要想表达,有失也有得的意思。 |
188610329 发表于 2022-4-16 02:58 收到 多谢回复 请教一下 串口1只有2根线 怎么操作DS1302 那东西不是要3根线吗 而且也不是串口通讯 你意思是通讯线占用串口1的两根线吗 那意义何在呢 1302并不会主动发送靠中断产生响应吧 这样相当于占用一个通讯口和一个中断 是不是反而浪费了 中断开销的问题 有你的解释我就释然多了 看来串口234还可以再挖一下潜力 另外互通一下信息 硬件地址判断可以广播 FF是默认的广播地址 线上的所有串口都会响应 |
dzbj 发表于 2022-4-16 00:26 你说的这些都对。所以,我也只是说在如今单片机速度越来越快的今天, 硬件SADDR+SADEN 帮助不大,不是完全没有用。 以下这个是建议,供你在非串口1前提下参考。(我串口1多用作同步移位寄存器,硬件操作HC595或者DS1302这些,这一点也是属于榨干单片机的性能,应该属于和你类似的强迫症吧) 串口中断,没有你想象的那么消耗资源,如果,你只是进入中断 读一下RB8 的话,其实这个动作可以忽略不计。所以,当用串口2,3,4, 做从机的话,先读RB8, 如果不是送地址,直接抛弃。继续休息,如果是地址才比较地址,然后,决定,是否接受余下的数据。那么,对于1T单片机来说,这个串口中断的影响可以忽略不计。而这种软件的 SADDR +SADEN 方式,有一个硬件方式没有的优势,可以接受广播地址(类似TCP/IP)。你可以判断,是否是针对所有从机的广播。而硬件方式,就无法实现这个功能了…… |
188610329 发表于 2022-4-15 16:23 你说的是 可能我有点强迫症吧 总是担心 记得和你说过 我有一套自己用的系统 基本是以太网的概念 只不过用485传输 不用局域网是转LAN模块体积大 成本高 另外资源开销 耗电量 以及速度 实际上TCP/IP是一个效率非常低的协议 大概只有30%吧 因为有很多固有信息层 这个系统分三层 主控 子控和执行 之间的协调指令 数据传输 都是靠串口 先不说速率和带宽问题 起码是需要很频繁的产生串口中断 最早用8位通讯 软件判断地址 后来用9位 先判断地址 那么其实每次接收都会产生中断 不管是不是呼叫自己 至少要收一位来判断地址用 用单片机硬件功能的话 至少可以不产生中断了 我用cpu都是往死里用 只要还能干就让它多干 频繁的中断总是有可能影响其它函数 因此有点喜欢这功能 |
dzbj 发表于 2022-4-15 10:51 这个功能, 其实现在用处已经不大了, 只不过被保留了下来, 现在单片机速度都很快了, 自己写几行代码, 利用 8+1的传输方式,自己判断一下,其实并不复杂, 而实际使用中, 硬件的 SADDR + SADEN 对串口的性能提升,帮助其实不大。所以,没有什么好可惜的。 |
yzwzfyz 发表于 2022-4-15 10:46 感谢回复 这功能还不错 但只能串口1 其他口都没用 有点遗憾 |
| 我也常发生这样的事,自己一个人找许久找不出。把问题与别人一提,却发现是个低级失误。 |
|
各位看帖的兄弟 不用回复了 我自己把赋值写反了 为此 声明一个变量 uint 打脸=低级错误; |
188610329 发表于 2022-4-14 17:31 找到问题了 低级错误 两个寄存器赋值反了 再次感谢回复 |
188610329 发表于 2022-4-14 17:31 感谢回复 试了一下 还是0x10~0x1f 是我哪没写对么 在main里 while(1)之前写了以下两句 SADEN = 0x10; //0001 0000 SADDR = 0xff; //0001 1111 |
| saden = 0xff; 即需要完全匹配。 |