【问题标题】:Atmega 2560 USART not giving correct value on terminalAtmega 2560 USART 在终端上没有给出正确的值
【发布时间】:2013-11-15 18:49:02
【问题描述】:

我正在开发基于 atmega2560 的 MultiWii Pro 板的串行通信。我正在使用 avr-gcc 来编译和 avrdude 来编程。

这是我的问题。我试图让 atmega2560 向终端发送一些东西(十六进制值)。但是,无论分配给 UDR2 的值如何,也无论我分配给 UBRR2L 和 UBRR2H 的值如何,如果我将终端波特率设置为 9600,则终端输出始终为 0xff,如果我将终端波特率设置为 115200,则终端输出始终为 0xff。

这是我的代码

#define F_CPU 8000000UL
#define BAUDRATE 19200        //The baudrate to use
#define BAUD_PRESCALLER ((F_CPU / (BAUDRATE * 16UL))-1)

static void InitializeUART()
{
    UBRR2L = (uint8_t)(BAUD_PRESCALLER);                               
    UBRR2H = (uint8_t)(BAUD_PRESCALLER>>8);
    UCSR2B |= (1<<RXEN2) | (1<<TXEN2);          //RX TX  Enable
    UCSR2C |= (1<<USBS2)|(1<<UCSZ21)|(1<<UCSZ20);
}

还有我的发送功能

void USART2Write(char data)
{
    while( !(UCSR2A & (1<<UDRE2)));

    UCSR2B &= ~(1<<TXB82); //in the case if there are more than 8 bits of data
    if(data & 0x100)
    {
        UCSR2B |= (1 << TXB82);    
    }

    UDR2 = data;
}

在我的例子中,我的代码的波特率是 19200。终端波特率也是 19200。无论我分配给 UDR2 什么,输出都将始终为 0x15。

这是我的保险丝设置

Low     High    Extended
0xFF    0xD8    0xFD

【问题讨论】:

  • 我假设您确实检查了终端端的帧格式(奇偶校验、停止位、流量控制等)?
  • 这是我在终端端的帧格式:波特:19200,数据位:8,流控制:无,奇偶校验:无,停止位:1。尽管如此,无论我的奇偶校验位和停止位如何设置,输出总是相同的。
  • 这不是你配置的框架(见我的回答)。如果您留下代码并设置波特:19200,数据位:9,流控制:无,奇偶校验:无,停止位:两个,会发生什么?
  • 我试过你的配置。输出值没有改变。因此,我通过删除 (1
  • 无论您的具体设置如何,您都应该在初始测试中尽量保持简单。您如何从 atmega2560 连接到终端(这是 PC 上的终端软件)?这可能是逻辑电平的问题。也许你在atmega2560端有UART TTL输出,直接与RS232接口?

标签: serial-port avr serial-communication atmega usart


【解决方案1】:
UCSR2C |= (1<<USBS2)|(1<<UCSZ21)|(1<<UCSZ20);

USBS2 设置 2 个停止位。这是故意的吗?

void USART2Write(char data){
    while( !(UCSR2A & (1<<UDRE2)));

    UCSR2B &= ~(1<<TXB82); //in the case if there are more than 8 bits of data
    if(data & 0x100) {
        UCSR2B |= (1 << TXB82);    
    }

    UDR2 = data;
}

如果真的要使用 9 个数据位,则必须设置 UCSZ22、UCSZ21 和 UCSZ20。你只设置 UCSZ21 和 UCSZ20

UCSR2C |= (1<<USBS2) | (1<<UCSZ21) | (1<<UCSZ20);

所以我猜USBS2确实不是你想要的。可能你很困惑,因为标志 UCSZ22 在 UCSR2B 寄存器中。

因此,假设您想要 9 个数据位和一个停止位,请使用以下内容:

static void InitializeUART() {
    UBRR2L = (uint8_t)(BAUD_PRESCALLER);                               
    UBRR2H = (uint8_t)(BAUD_PRESCALLER>>8);
    UCSR2B |= (1 << RXEN2) | (1 << TXEN2) | (1 << UCSZ22);
    UCSR2C |= (1 << UCSZ21) | (1 << UCSZ20);
}

另一件事:您的变量data 的类型为char,char 通常为8 位宽。所以条件if(data &amp; 0x100)永远不会满足。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-06
    • 2022-01-24
    • 1970-01-01
    • 2020-04-23
    • 1970-01-01
    • 2020-06-12
    相关资源
    最近更新 更多