请教一下ATmega128串口0 的问题
是这样的,我的串口0和串口1都在用,但是串口0的接受中断总有问题,发数据时进入中断了但是没有接收到数据而且UCSR0A寄存器的值为70,帧错误标志位一直是1,while(!(UCSR0A & (1<<RXC0)));
RX0_data=UDR0;
TX_data(RX0_data);这段程序返回的数据一直是00,并且在for循环中
for(i=0;i<11;i++)
{},第二次进入循环就在while循环里卡死了,
串口初始化是这样的;
void usart0_init(void)
{ //UCSR0A=0x00;
UBRR0L = ((F_CPU0/ 16) / (BAUDRATE0) - 1) % 256; //设置波特率寄存器低位字节
UBRR0H = ((F_CPU0/ 16) / (BAUDRATE0) - 1) / 256; //设置波特率寄存器高位字节
UCSR0B = (1 << RXEN0) | (1 << TXEN0) | (1 << RXCIE0); //允许发送接收
UCSR0C = (1 << UCSZ01) | (1 << UCSZ00); //8位数据
}和串口1的初始化程序一样,UCSR0A=0x00;
这一句写进去寄存器值也没什么变化所以注释了。
开机UCSR0A=60,UCSR1A=20
然后分别给串口0,1发送数据,UCSR0A=70,UCSR1A=60
串口1发的数据返回正常,串口0返回00;
看了很多资料,用的isp下载器,但是把下载器拔下在重新上电还是这样 两串口都改为把接受的字节返回,串口1正常工作,串口0还是返回00,串口因为在主函数里发寄存器的值所以本身寄存器为60,接收一次数据后变成70
Bit 7 6 5 4 3 2 1 0
RXCn TXCn UDREn FEn DORn UPEn U2Xn MPCMn
读 / 写R R/W R R R R R/W R/W
初始值 0 0 1 0 0 0 0 0
这里把寄存器附上 熔丝位配置BF C9 FF 又试了下,问题就是FE0这一位一直提示帧错误,但是波特率也没问题,发送OK,串口1收发都OK 没有大神指点一下吗,测了一下无数据时的串口,R和T一个高电平一个低电平 串口0的r一直是低电平,按说没有起始位的,但是还是可以进入中断,越来越懵逼了 检查硬件电路呀,帧错误,都这么明显了。
还有引脚配置都正确吧?
串口正常不发送都是高电平。一直低电平要查电路,或者烧了。 叶春勇 发表于 2019-7-12 16:36
检查硬件电路呀,帧错误,都这么明显了。
还有引脚配置都正确吧?
串口正常不发送都是高电平。一直低电平要 ...
因为串口0和ISP下载复用,所以就想着是不是下载器的关系,但是板子没有留jtag口,没法禁止spi,有几次ISP下载器插着板子上,把线揉了揉自己就好了,再试又不行了,拔了也不行,在考虑是不是是能spi的时候rxd内部拉低了 我有一只小可爱 发表于 2019-7-12 23:07
因为串口0和ISP下载复用,所以就想着是不是下载器的关系,但是板子没有留jtag口,没法禁止spi,有几次ISP ...
我用过mega128,isp下载不影响的。
要不下载后,拔掉isp,然后重启。应该不影响。另外串口设计的时候串电阻,单片机很脆弱的。 叶春勇 发表于 2019-7-13 08:19
我用过mega128,isp下载不影响的。
要不下载后,拔掉isp,然后重启。应该不影响。另外串口设计的时候串电 ...
拔掉再上电还是一样,不知道哪里的原因rxd一直低电平,下载器下载的时候就OK,示波器看正常接收,然后就一直是低电平,配置和串口1用的一样的函数,串口1就OK。中间碰过不知道哪,rxd正常高电平了就好了,重新上电又变成低电平 解决了,配置问题 学习了
页:
[1]