123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242 |
- #include <stdint.h>
- #include <stdbool.h>
- #include "nrf.h"
- #include "ble_dtm.h"
- #include "nrf_gpio.h"
- #include "dtm_uart.h"
- #include "nrf_error.h"
- #include "app_util.h"
- #include "nrf_drv_uart.h"
- #include "nrf_peripherals.h"
- #include "app_util_platform.h"
- #define BITRATE UART_BAUDRATE_BAUDRATE_Baud57600
- static uint32_t m_baud_rates[] = {[UART_BAUD_RATE_1200] = NRF_UART_BAUDRATE_1200,
- [UART_BAUD_RATE_2400] = NRF_UART_BAUDRATE_2400,
- [UART_BAUD_RATE_4800] = NRF_UART_BAUDRATE_4800,
- [UART_BAUD_RATE_9600] = NRF_UART_BAUDRATE_9600,
- [UART_BAUD_RATE_14400] = NRF_UART_BAUDRATE_14400,
- [UART_BAUD_RATE_19200] = NRF_UART_BAUDRATE_19200,
- [UART_BAUD_RATE_28800] = NRF_UART_BAUDRATE_28800,
- [UART_BAUD_RATE_38400] = NRF_UART_BAUDRATE_38400,
- [UART_BAUD_RATE_57600] = NRF_UART_BAUDRATE_57600,
- [UART_BAUD_RATE_76800] = NRF_UART_BAUDRATE_76800,
- [UART_BAUD_RATE_115200] = NRF_UART_BAUDRATE_115200 };
- static uint32_t m_iteration[] = {[UART_BAUD_RATE_1200] = 51,
- [UART_BAUD_RATE_2400] = 35,
- [UART_BAUD_RATE_4800] = 27,
- [UART_BAUD_RATE_9600] = 23,
- [UART_BAUD_RATE_14400] = 21,
- [UART_BAUD_RATE_19200] = 21,
- [UART_BAUD_RATE_28800] = 20,
- [UART_BAUD_RATE_38400] = 20,
- [UART_BAUD_RATE_57600] = 19,
- [UART_BAUD_RATE_76800] = 19,
- [UART_BAUD_RATE_115200] = 19, };
- static uint32_t m_iterations_next_byte_max = 51;
- static nrf_drv_uart_t m_dtm_uart_driver = NRF_DRV_UART_INSTANCE(0);
- static uint32_t uart_init(app_uart_stream_comm_params_t * p_comm_params)
- {
- if (p_comm_params->baud_rate > UART_BAUD_RATE_115200)
- {
- return NRF_ERROR_INVALID_PARAM;
- }
- nrf_drv_uart_config_t config = NRF_DRV_UART_DEFAULT_CONFIG;
- config.pselrxd = p_comm_params->rx_pin_no;
- config.pseltxd = p_comm_params->tx_pin_no;
- config.baudrate = (nrf_uart_baudrate_t) m_baud_rates[p_comm_params->baud_rate];
- config.hwfc = NRF_UART_HWFC_DISABLED;
- config.parity = NRF_UART_PARITY_EXCLUDED;
- #if defined(NRF_DRV_UART_WITH_UARTE) && defined(NRF_DRV_UART_WITH_UART)
-
-
- config.use_easy_dma = false;
- #endif
- nrf_drv_uart_uninit(&m_dtm_uart_driver);
- uint32_t err_code = nrf_drv_uart_init(&m_dtm_uart_driver, &config, NULL);
- if (err_code != NRF_SUCCESS)
- {
- return err_code;
- }
- nrf_drv_uart_rx_enable(&m_dtm_uart_driver);
- m_iterations_next_byte_max = m_iteration[p_comm_params->baud_rate];
- return NRF_SUCCESS;
- }
- uint32_t dtm_start(app_uart_stream_comm_params_t uart_comm_params)
- {
- uint32_t current_time;
- uint32_t dtm_error_code;
- uint32_t msb_time = 0;
- bool is_msb_read = false;
- uint16_t dtm_cmd_from_uart = 0;
- uint8_t rx_byte;
- dtm_event_t result;
- uint32_t err_code;
- err_code = uart_init(&uart_comm_params);
- if (err_code != NRF_SUCCESS)
- {
- return err_code;
- }
- dtm_error_code = dtm_init();
- if (dtm_error_code != DTM_SUCCESS)
- {
-
- return NRF_ERROR_INTERNAL;
- }
- for (;; )
- {
-
- current_time = dtm_wait();
- if (NRF_SUCCESS != nrf_drv_uart_rx(&m_dtm_uart_driver, &rx_byte,1))
- {
- return NRF_ERROR_INTERNAL;
- }
- if (!is_msb_read)
- {
-
- is_msb_read = true;
- dtm_cmd_from_uart = ((dtm_cmd_t)rx_byte) << 8;
- msb_time = current_time;
-
- continue;
- }
-
- if (current_time > (msb_time + m_iterations_next_byte_max))
- {
-
-
-
- dtm_cmd_from_uart = ((dtm_cmd_t)rx_byte) << 8;
- msb_time = current_time;
- continue;
- }
-
- is_msb_read = false;
- dtm_cmd_from_uart |= (dtm_cmd_t)rx_byte;
- if (dtm_cmd(dtm_cmd_from_uart) != DTM_SUCCESS)
- {
-
-
-
- }
-
-
- if (dtm_event_get(&result))
- {
-
- uint8_t tx_byte = (result >> 8) & 0xFF;
-
- (void)nrf_drv_uart_tx(&m_dtm_uart_driver, &tx_byte, 1);
-
- tx_byte = result & 0xFF;
- (void)nrf_drv_uart_tx(&m_dtm_uart_driver, &tx_byte, 1);
- }
- }
- }
|