Attiny2313 UART回显字节最高位异常置位问题排查求助
问题根因
你的UART初始化代码没有正确设置UCSRC寄存器,导致帧格式配置错误:
Attiny2313的UCSRC寄存器和UBRRH寄存器共用同一个地址,写操作时必须将URSEL位(寄存器第7位)置1,才能将数据写入UCSRC,否则实际写入的是UBRRH寄存器。你当前的配置代码UCSRC = (1 << USBS) | (3 << UCSZ0); 没有设置URSEL位,因此帧格式根本没有生效,实际运行的是默认的帧格式(7位数据+奇校验),校验位被当成了数据的最高位,才会出现所有低7位正确、最高位被异常置1的情况。
修复方案
- 修改
init_uart函数中的UCSRC配置代码,加上URSEL位:
// 原错误代码 // UCSRC = (1 << USBS) | (3 << UCSZ0); // asynchron 8n1 // 修改为 UCSRC = (1 << URSEL) | (1 << USBS) | (3 << UCSZ0); // 正确配置8N1帧格式
- 额外优化:你的系统时钟是1MHz,9600波特率的计算误差约8.5%,接近UART通信的误差容忍上限,若修复后仍偶发通信错误,可将波特率降低为4800,此时误差仅0.15%,通信稳定性会大幅提升。
修复完成后,你在C代码中直接用if (c == 0x01)、if (c == 0x05)即可正确匹配你从Python端发送的字节,不需要做额外的位处理。
内容的提问来源于stack exchange,提问作者jonas
相关产品推荐
相关产品推荐

