static void uart_event_handler(nrf_drv_uart_event_t * p_event, void* p_context) { if (p_event->type == NRF_DRV_UART_EVT_RX_DONE) { app_uart_evt_t app_uart_event; app_uart_event.evt_type = APP_UART_DATA; app_uart_event.data.value = p_event->data.rxtx.p_data[0]; (void)nrf_drv_uart_rx(&app_uart_inst, rx_buffer, 1); rx_done = true; m_event_handler(&app_uart_event); } else if (p_event->type == NRF_DRV_UART_EVT_ERROR) { app_uart_evt_t app_uart_event; app_uart_event.evt_type = APP_UART_COMMUNICATION_ERROR; app_uart_event.data.error_communication = p_event->data.error.error_mask; (void)nrf_drv_uart_rx(&app_uart_inst, rx_buffer, 1); m_event_handler(&app_uart_event); } else if (p_event->type == NRF_DRV_UART_EVT_TX_DONE) { // Last byte from FIFO transmitted, notify the application. // Notify that new data is available if this was first byte put in the buffer. app_uart_evt_t app_uart_event; app_uart_event.evt_type = APP_UART_TX_EMPTY; m_event_handler(&app_uart_event); } }
static void uart_event_handler(nrf_drv_uart_event_t * p_event, void* p_context) { app_uart_evt_t app_uart_event; if (p_event->type == NRF_DRV_UART_EVT_RX_DONE) { // Write received byte to FIFO uint32_t err_code = app_fifo_put(&m_rx_fifo, p_event->data.rxtx.p_data[0]); if (err_code != NRF_SUCCESS) { app_uart_event.evt_type = APP_UART_FIFO_ERROR; app_uart_event.data.error_code = err_code; m_event_handler(&app_uart_event); } // Notify that new data is available if this was first byte put in the buffer. else if (FIFO_LENGTH(m_rx_fifo) == 1) { app_uart_event.evt_type = APP_UART_DATA_READY; m_event_handler(&app_uart_event); } else { // Do nothing, only send event if first byte was added or overflow in FIFO occurred. } if (FIFO_LENGTH(m_rx_fifo) <= m_rx_fifo.buf_size_mask) { (void)nrf_drv_uart_rx(rx_buffer,1); } } else if (p_event->type == NRF_DRV_UART_EVT_ERROR) { app_uart_event.evt_type = APP_UART_COMMUNICATION_ERROR; app_uart_event.data.error_communication = p_event->data.error.error_mask; (void)nrf_drv_uart_rx(rx_buffer,1); m_event_handler(&app_uart_event); } else if (p_event->type == NRF_DRV_UART_EVT_TX_DONE) { // Get next byte from FIFO. if (app_fifo_get(&m_tx_fifo, tx_buffer) == NRF_SUCCESS) { (void)nrf_drv_uart_tx(tx_buffer,1); } if (FIFO_LENGTH(m_tx_fifo) == 0) { // Last byte from FIFO transmitted, notify the application. // Notify that new data is available if this was first byte put in the buffer. app_uart_event.evt_type = APP_UART_TX_EMPTY; m_event_handler(&app_uart_event); } } }
uint32_t ser_phy_hci_slip_open(ser_phy_hci_slip_event_handler_t events_handler) { uint32_t err_code; if (events_handler == NULL) { return NRF_ERROR_NULL; } // Check if function was not called before. if (m_ser_phy_hci_slip_event_handler != NULL) { return NRF_ERROR_INVALID_STATE; } m_ser_phy_hci_slip_event_handler = events_handler; err_code = nrf_drv_uart_init(&m_uart, &m_uart_config, uart_event_handler); if (err_code != NRF_SUCCESS) { return NRF_ERROR_INVALID_PARAM; } ser_phy_hci_slip_reset(); APP_ERROR_CHECK(nrf_drv_uart_rx(&m_uart, m_rx_buf, 1)); return NRF_SUCCESS; }
uint32_t app_uart_init(const app_uart_comm_params_t * p_comm_params, app_uart_buffers_t * p_buffers, app_uart_event_handler_t event_handler, app_irq_priority_t irq_priority) { nrf_drv_uart_config_t config = NRF_DRV_UART_DEFAULT_CONFIG; config.baudrate = (nrf_uart_baudrate_t)p_comm_params->baud_rate; config.hwfc = (p_comm_params->flow_control == APP_UART_FLOW_CONTROL_DISABLED) ? NRF_UART_HWFC_DISABLED : NRF_UART_HWFC_ENABLED; config.interrupt_priority = irq_priority; config.parity = p_comm_params->use_parity ? NRF_UART_PARITY_INCLUDED : NRF_UART_PARITY_EXCLUDED; config.pselcts = p_comm_params->cts_pin_no; config.pselrts = p_comm_params->rts_pin_no; config.pselrxd = p_comm_params->rx_pin_no; config.pseltxd = p_comm_params->tx_pin_no; m_event_handler = event_handler; rx_done = false; if (p_comm_params->flow_control == APP_UART_FLOW_CONTROL_LOW_POWER) { return NRF_ERROR_NOT_SUPPORTED; } uint32_t err_code = nrf_drv_uart_init(&config, uart_event_handler); if (err_code != NRF_SUCCESS) { return err_code; } nrf_drv_uart_rx_enable(); return nrf_drv_uart_rx(rx_buffer,1); }
uint32_t app_uart_init(const app_uart_comm_params_t * p_comm_params, app_uart_buffers_t * p_buffers, app_uart_event_handler_t event_handler, app_irq_priority_t irq_priority) { nrf_drv_uart_config_t config = NRF_DRV_UART_DEFAULT_CONFIG; config.baudrate = (nrf_uart_baudrate_t)p_comm_params->baud_rate; config.hwfc = (p_comm_params->flow_control == APP_UART_FLOW_CONTROL_DISABLED) ? NRF_UART_HWFC_DISABLED : NRF_UART_HWFC_ENABLED; config.interrupt_priority = irq_priority; config.parity = p_comm_params->use_parity ? NRF_UART_PARITY_INCLUDED : NRF_UART_PARITY_EXCLUDED; config.pselcts = p_comm_params->cts_pin_no; config.pselrts = p_comm_params->rts_pin_no; config.pselrxd = p_comm_params->rx_pin_no; config.pseltxd = p_comm_params->tx_pin_no; m_event_handler = event_handler; rx_done = false; uint32_t err_code = nrf_drv_uart_init(&app_uart_inst, &config, uart_event_handler); VERIFY_SUCCESS(err_code); // Turn on receiver if RX pin is connected if (p_comm_params->rx_pin_no != UART_PIN_DISCONNECTED) { return nrf_drv_uart_rx(&app_uart_inst, rx_buffer,1); } else { return NRF_SUCCESS; } }
uint32_t app_uart_init(const app_uart_comm_params_t * p_comm_params, app_uart_buffers_t * p_buffers, app_uart_event_handler_t event_handler, app_irq_priority_t irq_priority) { uint32_t err_code; m_event_handler = event_handler; if (p_buffers == NULL) { return NRF_ERROR_INVALID_PARAM; } // Configure buffer RX buffer. err_code = app_fifo_init(&m_rx_fifo, p_buffers->rx_buf, p_buffers->rx_buf_size); VERIFY_SUCCESS(err_code); // Configure buffer TX buffer. err_code = app_fifo_init(&m_tx_fifo, p_buffers->tx_buf, p_buffers->tx_buf_size); VERIFY_SUCCESS(err_code); nrf_drv_uart_config_t config = NRF_DRV_UART_DEFAULT_CONFIG; config.baudrate = (nrf_uart_baudrate_t)p_comm_params->baud_rate; config.hwfc = (p_comm_params->flow_control == APP_UART_FLOW_CONTROL_DISABLED) ? NRF_UART_HWFC_DISABLED : NRF_UART_HWFC_ENABLED; config.interrupt_priority = irq_priority; config.parity = p_comm_params->use_parity ? NRF_UART_PARITY_INCLUDED : NRF_UART_PARITY_EXCLUDED; config.pselcts = p_comm_params->cts_pin_no; config.pselrts = p_comm_params->rts_pin_no; config.pselrxd = p_comm_params->rx_pin_no; config.pseltxd = p_comm_params->tx_pin_no; err_code = nrf_drv_uart_init(&app_uart_inst, &config, uart_event_handler); VERIFY_SUCCESS(err_code); m_rx_ovf = false; // Turn on receiver if RX pin is connected if (p_comm_params->rx_pin_no != UART_PIN_DISCONNECTED) { #ifdef UARTE_PRESENT if (!config.use_easy_dma) #endif { nrf_drv_uart_rx_enable(&app_uart_inst); } return nrf_drv_uart_rx(&app_uart_inst, rx_buffer,1); } else { return NRF_SUCCESS; } }
/** * Initialize the RS232 port. * */ void uart0_init(unsigned long ubr) { nrf_drv_uart_config_t config = NRF_DRV_UART_DEFAULT_CONFIG; ret_code_t retcode = nrf_drv_uart_init(&config, uart_event_handler); APP_ERROR_CHECK(retcode); ringbuf_init(&txbuf, txbuf_data, sizeof(txbuf_data)); nrf_drv_uart_rx_enable(); nrf_drv_uart_rx(rx_buffer, 1); }
uint32_t app_uart_init(const app_uart_comm_params_t * p_comm_params, app_uart_buffers_t * p_buffers, app_uart_event_handler_t event_handler, app_irq_priority_t irq_priority) { uint32_t err_code; m_event_handler = event_handler; if (p_buffers == NULL) { return NRF_ERROR_INVALID_PARAM; } // Configure buffer RX buffer. err_code = app_fifo_init(&m_rx_fifo, p_buffers->rx_buf, p_buffers->rx_buf_size); if (err_code != NRF_SUCCESS) { // Propagate error code. return err_code; } // Configure buffer TX buffer. err_code = app_fifo_init(&m_tx_fifo, p_buffers->tx_buf, p_buffers->tx_buf_size); if (err_code != NRF_SUCCESS) { // Propagate error code. return err_code; } nrf_drv_uart_config_t config = NRF_DRV_UART_DEFAULT_CONFIG; config.baudrate = (nrf_uart_baudrate_t)p_comm_params->baud_rate; config.hwfc = (p_comm_params->flow_control == APP_UART_FLOW_CONTROL_DISABLED) ? NRF_UART_HWFC_DISABLED : NRF_UART_HWFC_ENABLED; config.interrupt_priority = irq_priority; config.parity = p_comm_params->use_parity ? NRF_UART_PARITY_INCLUDED : NRF_UART_PARITY_EXCLUDED; config.pselcts = p_comm_params->cts_pin_no; config.pselrts = p_comm_params->rts_pin_no; config.pselrxd = p_comm_params->rx_pin_no; config.pseltxd = p_comm_params->tx_pin_no; err_code = nrf_drv_uart_init(&config, uart_event_handler); if (err_code != NRF_SUCCESS) { return err_code; } nrf_drv_uart_rx_enable(); return nrf_drv_uart_rx(rx_buffer,1); }
uint32_t app_uart_get(uint8_t * p_byte) { ASSERT(p_byte); // If FIFO was full new request to receive one byte was not scheduled. Must be done here. if (FIFO_LENGTH(m_rx_fifo) == m_rx_fifo.buf_size_mask) { uint32_t err_code = nrf_drv_uart_rx(rx_buffer,1); if (err_code != NRF_SUCCESS) { return NRF_ERROR_NOT_FOUND; } } return app_fifo_get(&m_rx_fifo, p_byte); }
static __INLINE void on_rx_complete(serial_dfu_t * p_dfu, uint8_t * p_data, uint8_t len) { ret_code_t ret_code; ret_code = slip_decode_add_byte(&p_dfu->slip, p_data[0]); if (ret_code == NRF_SUCCESS) { on_packet_received(p_dfu); // reset the slip decoding p_dfu->slip.current_index = 0; p_dfu->slip.state = SLIP_STATE_DECODING; } (void)nrf_drv_uart_rx(&m_dfu.uart_instance, &m_dfu.uart_buffer, 1); }
uint32_t serial_dfu_transport_init(void) { uint32_t err_code; leds_init(); m_dfu.slip.p_buffer = m_dfu.recv_buffer; m_dfu.slip.current_index = 0; m_dfu.slip.buffer_len = sizeof(m_dfu.recv_buffer); m_dfu.slip.state = SLIP_STATE_DECODING; nrf_drv_uart_config_t uart_config = NRF_DRV_UART_DEFAULT_CONFIG; uart_config.pseltxd = TX_PIN_NUMBER; uart_config.pselrxd = RX_PIN_NUMBER; uart_config.pselcts = CTS_PIN_NUMBER; uart_config.pselrts = RTS_PIN_NUMBER; uart_config.hwfc = NRF_UART_HWFC_ENABLED; uart_config.p_context = &m_dfu; nrf_drv_uart_t instance = NRF_DRV_UART_INSTANCE(0); memcpy(&m_dfu.uart_instance, &instance, sizeof(instance)); err_code = nrf_drv_uart_init(&m_dfu.uart_instance, &uart_config, uart_event_handler); if (err_code != NRF_SUCCESS) { NRF_LOG_ERROR("Failed initializing uart\n"); return err_code; } nrf_drv_uart_rx_enable(&m_dfu.uart_instance); err_code = nrf_drv_uart_rx(&m_dfu.uart_instance, &m_dfu.uart_buffer, 1); if (err_code != NRF_SUCCESS) { NRF_LOG_ERROR("Failed initializing rx\n"); } NRF_LOG_DEBUG("UART initialized\n"); return err_code; }
/*---------------------------------------------------------------------------*/ static void uart_event_handler(nrf_drv_uart_event_t * p_event, void * p_context) { ENERGEST_ON(ENERGEST_TYPE_IRQ); if (p_event->type == NRF_DRV_UART_EVT_RX_DONE) { if (uart0_input_handler != NULL) { uart0_input_handler(p_event->data.rxtx.p_data[0]); } (void)nrf_drv_uart_rx(rx_buffer, 1); } else if (p_event->type == NRF_DRV_UART_EVT_TX_DONE) { if (ringbuf_elements(&txbuf) > 0) { uint8_t c = ringbuf_get(&txbuf); nrf_drv_uart_tx(&c, 1); } } ENERGEST_OFF(ENERGEST_TYPE_IRQ); }
uint32_t app_uart_get(uint8_t * p_byte) { ASSERT(p_byte); bool rx_ovf = m_rx_ovf; ret_code_t err_code = app_fifo_get(&m_rx_fifo, p_byte); // If FIFO was full new request to receive one byte was not scheduled. Must be done here. if (rx_ovf) { m_rx_ovf = false; uint32_t uart_err_code = nrf_drv_uart_rx(&app_uart_inst, rx_buffer, 1); // RX resume should never fail. APP_ERROR_CHECK(uart_err_code); } return err_code; }
static void uart_event_handler(nrf_drv_uart_event_t * p_event, void * p_context) { (void)p_context; switch (p_event->type) { case NRF_DRV_UART_EVT_ERROR: // Process the error only if this is a parity or overrun error. // Break and framing errors will always occur before the other // side becomes active. if (p_event->data.error.error_mask & (NRF_UART_ERROR_PARITY_MASK | NRF_UART_ERROR_OVERRUN_MASK)) { // Pass error source to upper layer m_ser_phy_hci_slip_event.evt_type = SER_PHY_HCI_SLIP_EVT_HW_ERROR; m_ser_phy_hci_slip_event.evt_params.hw_error.error_code = p_event->data.error.error_mask; m_ser_phy_hci_slip_event_handler(&m_ser_phy_hci_slip_event); } APP_ERROR_CHECK(nrf_drv_uart_rx(&m_uart, m_rx_buf, 1)); break; case NRF_DRV_UART_EVT_TX_DONE: // If there is a pending transfer (the second buffer is ready to // be sent), start it immediately. if (m_tx_pending) { APP_ERROR_CHECK(nrf_drv_uart_tx(&m_uart, mp_tx_buf, m_tx_bytes)); // Switch to the buffer that has just been sent completely // and now can be filled again. mp_tx_buf = (mp_tx_buf == m_tx_buf0) ? m_tx_buf1 : m_tx_buf0; m_tx_bytes = 0; m_ser_phy_hci_slip_event.evt_type = m_tx_evt_type; m_tx_evt_type = m_tx_pending_evt_type; m_tx_pending = false; } else { m_tx_in_progress = false; m_ser_phy_hci_slip_event.evt_type = m_tx_evt_type; } // If needed, notify the upper layer that the packet transfer is // complete (note that this notification may result in another // packet send request, so everything must be cleaned up above). if (m_ser_phy_hci_slip_event.evt_type != NO_EVENT) { m_ser_phy_hci_slip_event_handler(&m_ser_phy_hci_slip_event); } // And if the sending process is not yet finished, look what is // to be done next. if (m_tx_phase != PHASE_IDLE) { tx_buf_fill(); } break; case NRF_DRV_UART_EVT_RX_DONE: { uint8_t rx_byte = m_rx_buf[0]; APP_ERROR_CHECK(nrf_drv_uart_rx(&m_uart, m_rx_buf, 1)); ser_phi_hci_rx_byte(rx_byte); } break; default: APP_ERROR_CHECK(NRF_ERROR_INTERNAL); } }
void uart_read(char *data, uint8_t length) { uint32_t errCode; errCode = nrf_drv_uart_rx((uint8_t *)data, length); APP_ERROR_CHECK(errCode); }
static void uart_event_handler(nrf_drv_uart_event_t * p_event, void* p_context) { app_uart_evt_t app_uart_event; uint32_t err_code; switch (p_event->type) { case NRF_DRV_UART_EVT_RX_DONE: // Write received byte to FIFO. err_code = app_fifo_put(&m_rx_fifo, p_event->data.rxtx.p_data[0]); if (err_code != NRF_SUCCESS) { app_uart_event.evt_type = APP_UART_FIFO_ERROR; app_uart_event.data.error_code = err_code; m_event_handler(&app_uart_event); } // Notify that there are data available. else if (FIFO_LENGTH(m_rx_fifo) != 0) { app_uart_event.evt_type = APP_UART_DATA_READY; m_event_handler(&app_uart_event); } // Start new RX if size in buffer. if (FIFO_LENGTH(m_rx_fifo) <= m_rx_fifo.buf_size_mask) { (void)nrf_drv_uart_rx(&app_uart_inst, rx_buffer, 1); } else { // Overflow in RX FIFO. m_rx_ovf = true; } break; case NRF_DRV_UART_EVT_ERROR: app_uart_event.evt_type = APP_UART_COMMUNICATION_ERROR; app_uart_event.data.error_communication = p_event->data.error.error_mask; (void)nrf_drv_uart_rx(&app_uart_inst, rx_buffer, 1); m_event_handler(&app_uart_event); break; case NRF_DRV_UART_EVT_TX_DONE: // Get next byte from FIFO. if (app_fifo_get(&m_tx_fifo, tx_buffer) == NRF_SUCCESS) { (void)nrf_drv_uart_tx(&app_uart_inst, tx_buffer, 1); } else { // Last byte from FIFO transmitted, notify the application. app_uart_event.evt_type = APP_UART_TX_EMPTY; m_event_handler(&app_uart_event); } break; default: break; } }
/*====================================================================================================*/ uint8_t Serial_RecvByte( void ) { uint8_t recvByte = 0; nrf_drv_uart_rx(&recvByte, 1); return recvByte; }
int fgetc( FILE *f ) { uint8_t data = 0; nrf_drv_uart_rx(&data, 1); return (uint8_t)data; }
/*====================================================================================================*/ void Serial_RecvData( uint8_t *recvData, uint16_t lens ) { nrf_drv_uart_rx(recvData, lens); }