无法从我自己的 usart 发送和接收数据 - SAM4SD16C

Posted

技术标签:

【中文标题】无法从我自己的 usart 发送和接收数据 - SAM4SD16C【英文标题】:Can't send and receive data from my own usart - SAM4SD16C 【发布时间】:2018-09-25 15:10:59 【问题描述】:

我正在尝试在 SAM4SD16C 处理器上使用 USART 0。 我从这个网站得到了一些帮助:SAM4S Xplained USART

这是我正在使用的代码(可编译):

#define COM_Handler             USART0_Handler

#define USART_SERIAL                 USART0
#define USART_SERIAL_ID              ID_USART0  
#define USART_SERIAL_BAUDRATE        115200
#define USART_SERIAL_CHAR_LENGTH     US_MR_CHRL_8_BIT
#define USART_SERIAL_PARITY          US_MR_PAR_NO
#define USART_SERIAL_STOP_BIT        US_MR_NBSTOP_1_BIT

#define PINS_USART0_PIO      PIOA
#define PINS_USART0_ID       ID_USART0
#define PINS_USART0_TYPE     PIO_PERIPH_A
#define PINS_USART0_ATTR     PIO_DEFAULT
#define PINS_USART0_MASK     (PIO_PA5A_RXD0| PIO_PA6A_TXD0)


uint32_t received_byte;
uint32_t dw_status ;

int main(void)

    sysclk_init();
    board_init();
    sysclk_enable_peripheral_clock(USART_SERIAL_ID);
    pio_configure(PINS_USART0_PIO, PINS_USART0_TYPE, PINS_USART0_MASK, PINS_USART0_ATTR);

    const sam_usart_opt_t usart_console_settings = 
        USART_SERIAL_BAUDRATE,
        USART_SERIAL_CHAR_LENGTH,
        USART_SERIAL_PARITY,
        USART_SERIAL_STOP_BIT,
        US_MR_CHMODE_NORMAL
    ;
    
    usart_init_rs485(USART_SERIAL, &usart_console_settings, sysclk_get_peripheral_hz());
    usart_enable_tx(USART_SERIAL);
    usart_enable_rx(USART_SERIAL);
    usart_enable_interrupt(USART_SERIAL, US_IER_RXRDY);
    NVIC_EnableIRQ(USART0_IRQn);
    
    while (1) 
    
        
        while(US_CSR_TXRDY != 0 );
        do
        
            usart_write(USART_SERIAL, 1);
        while(US_CSR_RXRDY==0);
        /*dw_status = usart_get_status(USART_SERIAL);
        if(dw_status & US_CSR_RXRDY)
            usart_read(USART_SERIAL, &received_byte);
        */
        
    

当我调试程序时,它停留在 while(US_CSR_TXRDY != 0) 循环中... 我写了这一行,因为我在 asf 库中的某个地方看到我应该在发送任何内容之前检查 TX 是否准备好发送.. 一旦解决了这个问题,我将尝试通过将 RX 和 TX 连接在一起来在同一块板上接收我正在传输的内容。 我才开始研究这个处理器,我对它不是很熟悉......

感谢您的帮助

【问题讨论】:

我有类似的代码,但我使用usart_serial_init 而不是usart_init_rs485。您应该检查usart_init_rs485 的返回值。函数usart_serial_init 已经调用sysclk_enable_peripheral_clock 【参考方案1】:

US_CSR_TXRDY 是一个常数,所以while(US_CSR_TXRDY != 0 ) 是一个无限循环。我觉得应该是while( (USART0->US_CSR & US_CSR_TXRDY) != 0 )

【讨论】:

以上是关于无法从我自己的 usart 发送和接收数据 - SAM4SD16C的主要内容,如果未能解决你的问题,请参考以下文章

STM32串口通讯程序

STM32单片机通过USART1接收到数据后,怎么把接收到的数据通过单片机的CAN口发送出去啊?

05 USART发送和接收数据(查询模式)

USART通信

STM32:通过 USART 接收数据

STM32 USART接收中断程序问题