init
Dependencies: aconno_I2C Lis2dh12 WatchdogTimer
NRFuart.cpp@51:9078e6928412, 2019-05-23 (annotated)
- Committer:
- pathfindr
- Date:
- Thu May 23 11:39:28 2019 +0000
- Revision:
- 51:9078e6928412
- Parent:
- 48:64b1613941d5
init
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
pathfindr | 36:8e359069192b | 1 | #include "NRFuart.h" |
pathfindr | 36:8e359069192b | 2 | |
pathfindr | 36:8e359069192b | 3 | void NRFuart_init_nohwfc() { |
pathfindr | 36:8e359069192b | 4 | if(NRF_UART0->ENABLE == UART_ENABLE_ENABLE_Disabled) { |
pathfindr | 36:8e359069192b | 5 | nrf_gpio_cfg_output(PN_UART_TX); |
pathfindr | 36:8e359069192b | 6 | nrf_gpio_cfg_input(PN_UART_RX, NRF_GPIO_PIN_NOPULL); |
pathfindr | 36:8e359069192b | 7 | NRF_UART0->PSELTXD = PN_UART_TX; |
pathfindr | 36:8e359069192b | 8 | NRF_UART0->PSELRXD = PN_UART_RX; |
pathfindr | 36:8e359069192b | 9 | NRF_UART0->CONFIG = (UART_CONFIG_PARITY_Excluded << UART_CONFIG_PARITY_Pos) | UART_CONFIG_HWFC_Disabled; |
pathfindr | 36:8e359069192b | 10 | NRF_UART0->BAUDRATE = NRF_UART_BAUDRATE_115200; |
pathfindr | 36:8e359069192b | 11 | NRF_UART0->ENABLE = UART_ENABLE_ENABLE_Enabled; |
pathfindr | 36:8e359069192b | 12 | NRF_UART0->EVENTS_RXDRDY = 0; |
pathfindr | 36:8e359069192b | 13 | NRF_UART0->EVENTS_TXDRDY = 0; |
pathfindr | 36:8e359069192b | 14 | NRF_UART0->EVENTS_ERROR = 0; |
pathfindr | 36:8e359069192b | 15 | NRF_UART0->EVENTS_TXDRDY = 0; |
pathfindr | 36:8e359069192b | 16 | NRF_UART0->TASKS_STARTRX = 1; |
pathfindr | 36:8e359069192b | 17 | NRF_UART0->TASKS_STARTTX = 1; |
pathfindr | 36:8e359069192b | 18 | //NRF_UART0->INTENCLR = 0xffffffffUL; |
pathfindr | 36:8e359069192b | 19 | //NRF_UART0->INTENSET = UART_INTENSET_RXDRDY_Msk; //or |
pathfindr | 51:9078e6928412 | 20 | //NRF_UART0->INTENSET = (UART_INTENSET_RXDRDY_Set << UART_INTENSET_RXDRDY_Pos) | |
pathfindr | 51:9078e6928412 | 21 | // (UART_INTENSET_TXDRDY_Set << UART_INTENSET_TXDRDY_Pos) | |
pathfindr | 51:9078e6928412 | 22 | // (UART_INTENSET_ERROR_Set << UART_INTENSET_ERROR_Pos); |
pathfindr | 36:8e359069192b | 23 | //NVIC_ClearPendingIRQ(UART0_IRQn); |
pathfindr | 36:8e359069192b | 24 | //NVIC_SetPriority(UART0_IRQn, 1); //3 |
pathfindr | 36:8e359069192b | 25 | //NVIC_EnableIRQ(UART0_IRQn); |
pathfindr | 36:8e359069192b | 26 | //NVIC_SetVector(UART0_IRQn, (uint32_t) UART0_IRQHandler); |
pathfindr | 36:8e359069192b | 27 | } |
pathfindr | 37:505ef618f06c | 28 | }; |
pathfindr | 37:505ef618f06c | 29 | void NRFuart_init_hwfc() { |
pathfindr | 37:505ef618f06c | 30 | if(NRF_UART0->ENABLE == UART_ENABLE_ENABLE_Disabled) { |
pathfindr | 37:505ef618f06c | 31 | nrf_gpio_cfg_output(PN_UART_TX); |
pathfindr | 37:505ef618f06c | 32 | nrf_gpio_cfg_input(PN_UART_RX, NRF_GPIO_PIN_NOPULL); |
pathfindr | 37:505ef618f06c | 33 | NRF_UART0->PSELTXD = PN_UART_TX; |
pathfindr | 37:505ef618f06c | 34 | NRF_UART0->PSELRXD = PN_UART_RX; |
pathfindr | 37:505ef618f06c | 35 | NRF_UART0->PSELCTS = PN_UART_CTS; |
pathfindr | 37:505ef618f06c | 36 | NRF_UART0->PSELRTS = PN_UART_RTS; |
pathfindr | 37:505ef618f06c | 37 | NRF_UART0->CONFIG = (UART_CONFIG_PARITY_Excluded << UART_CONFIG_PARITY_Pos) | UART_CONFIG_HWFC_Enabled; |
pathfindr | 37:505ef618f06c | 38 | NRF_UART0->BAUDRATE = NRF_UART_BAUDRATE_115200; |
pathfindr | 37:505ef618f06c | 39 | NRF_UART0->ENABLE = UART_ENABLE_ENABLE_Enabled; |
pathfindr | 37:505ef618f06c | 40 | NRF_UART0->EVENTS_RXDRDY = 0; |
pathfindr | 37:505ef618f06c | 41 | NRF_UART0->EVENTS_TXDRDY = 0; |
pathfindr | 37:505ef618f06c | 42 | NRF_UART0->EVENTS_ERROR = 0; |
pathfindr | 37:505ef618f06c | 43 | NRF_UART0->EVENTS_TXDRDY = 0; |
pathfindr | 37:505ef618f06c | 44 | NRF_UART0->TASKS_STARTRX = 1; |
pathfindr | 37:505ef618f06c | 45 | NRF_UART0->TASKS_STARTTX = 1; |
pathfindr | 37:505ef618f06c | 46 | //NRF_UART0->INTENCLR = 0xffffffffUL; |
pathfindr | 37:505ef618f06c | 47 | //NRF_UART0->INTENSET = UART_INTENSET_RXDRDY_Msk; //or |
pathfindr | 51:9078e6928412 | 48 | //NRF_UART0->INTENSET = (UART_INTENSET_RXDRDY_Set << UART_INTENSET_RXDRDY_Pos) | |
pathfindr | 51:9078e6928412 | 49 | // (UART_INTENSET_TXDRDY_Set << UART_INTENSET_TXDRDY_Pos) | |
pathfindr | 51:9078e6928412 | 50 | // (UART_INTENSET_ERROR_Set << UART_INTENSET_ERROR_Pos); |
pathfindr | 37:505ef618f06c | 51 | //NVIC_ClearPendingIRQ(UART0_IRQn); |
pathfindr | 37:505ef618f06c | 52 | //NVIC_SetPriority(UART0_IRQn, 1); //3 |
pathfindr | 37:505ef618f06c | 53 | //NVIC_EnableIRQ(UART0_IRQn); |
pathfindr | 37:505ef618f06c | 54 | //NVIC_SetVector(UART0_IRQn, (uint32_t) UART0_IRQHandler); |
pathfindr | 37:505ef618f06c | 55 | } |
pathfindr | 36:8e359069192b | 56 | }; |
pathfindr | 36:8e359069192b | 57 | void NRFuart_uninit() { |
pathfindr | 36:8e359069192b | 58 | if (NRF_UART0->ENABLE == UART_ENABLE_ENABLE_Enabled) { |
pathfindr | 36:8e359069192b | 59 | NVIC_DisableIRQ(UART0_IRQn); |
pathfindr | 36:8e359069192b | 60 | NRF_UART0->INTENCLR = 0xffffffffUL; |
pathfindr | 36:8e359069192b | 61 | NRF_UART0->TASKS_STOPRX = 1; |
pathfindr | 36:8e359069192b | 62 | NRF_UART0->TASKS_STOPTX = 1; |
pathfindr | 36:8e359069192b | 63 | NRF_UART0->ENABLE = UART_ENABLE_ENABLE_Disabled; |
pathfindr | 36:8e359069192b | 64 | NRF_UART0->PSELTXD = 0xFFFFFFFF; |
pathfindr | 36:8e359069192b | 65 | NRF_UART0->PSELRXD = 0xFFFFFFFF; |
pathfindr | 36:8e359069192b | 66 | NRF_UART0->PSELRTS = 0xFFFFFFFF; |
pathfindr | 36:8e359069192b | 67 | NRF_UART0->PSELCTS = 0xFFFFFFFF; |
pathfindr | 36:8e359069192b | 68 | } |
pathfindr | 36:8e359069192b | 69 | }; |
pathfindr | 36:8e359069192b | 70 | void NRFuart_putc(char byte) { |
pathfindr | 36:8e359069192b | 71 | if (!NRF_UART0->ENABLE) NRFuart_init_nohwfc(); |
pathfindr | 36:8e359069192b | 72 | NRF_UART0->TXD = byte; |
pathfindr | 36:8e359069192b | 73 | uint32_t safetycounter = 0; |
pathfindr | 36:8e359069192b | 74 | while(NRF_UART0->EVENTS_TXDRDY != 1 && safetycounter < 10000) { |
pathfindr | 36:8e359069192b | 75 | safetycounter ++; // Wait for the current TXD data to be sent. |
pathfindr | 36:8e359069192b | 76 | } |
pathfindr | 36:8e359069192b | 77 | NRF_UART0->EVENTS_TXDRDY = 0; |
pathfindr | 36:8e359069192b | 78 | }; |
pathfindr | 36:8e359069192b | 79 | void NRFuart_puts(char* bytes) { |
pathfindr | 36:8e359069192b | 80 | if (!NRF_UART0->ENABLE) NRFuart_init_nohwfc(); |
pathfindr | 37:505ef618f06c | 81 | uint32_t safetycounter = 0; |
pathfindr | 37:505ef618f06c | 82 | for(int i = 0; bytes[i] != 0x00; i++) { |
pathfindr | 36:8e359069192b | 83 | NRFuart_putc(bytes[i]); |
pathfindr | 37:505ef618f06c | 84 | safetycounter ++; |
pathfindr | 37:505ef618f06c | 85 | if (safetycounter > 10000) break; |
pathfindr | 36:8e359069192b | 86 | } |
pathfindr | 36:8e359069192b | 87 | }; |
pathfindr | 36:8e359069192b | 88 | void NRFuart_puts_debug(char* bytes) { |
pathfindr | 36:8e359069192b | 89 | if (!NRF_UART0->ENABLE) NRFuart_init_nohwfc(); |
pathfindr | 37:505ef618f06c | 90 | uint32_t safetycounter = 0; |
pathfindr | 37:505ef618f06c | 91 | for(int i = 0; bytes[i] != 0x00; i++) { |
pathfindr | 36:8e359069192b | 92 | NRFuart_putc(bytes[i]); |
pathfindr | 37:505ef618f06c | 93 | safetycounter ++; |
pathfindr | 37:505ef618f06c | 94 | if (safetycounter > 10000) break; |
pathfindr | 36:8e359069192b | 95 | } |
pathfindr | 36:8e359069192b | 96 | NRFuart_putc('\n'); |
pathfindr | 36:8e359069192b | 97 | }; |
pathfindr | 36:8e359069192b | 98 | void debug_prep(){ |
pathfindr | 37:505ef618f06c | 99 | memset(GLOBAL_debug_buffer, 0x00, sizeof(GLOBAL_debug_buffer)); |
pathfindr | 36:8e359069192b | 100 | } |
pathfindr | 36:8e359069192b | 101 | void debug_exe(){ |
pathfindr | 36:8e359069192b | 102 | NRFuart_puts_debug(GLOBAL_debug_buffer); |
pathfindr | 36:8e359069192b | 103 | } |
pathfindr | 36:8e359069192b | 104 | char NRFuart_getc() { |
pathfindr | 36:8e359069192b | 105 | if (!NRF_UART0->ENABLE) NRFuart_init_nohwfc(); |
pathfindr | 36:8e359069192b | 106 | uint32_t safetycounter = 0; |
pathfindr | 36:8e359069192b | 107 | while(NRF_UART0->EVENTS_RXDRDY != 1 && safetycounter < 10000){ |
pathfindr | 36:8e359069192b | 108 | safetycounter ++; |
pathfindr | 36:8e359069192b | 109 | } |
pathfindr | 36:8e359069192b | 110 | NRF_UART0->EVENTS_RXDRDY = 0; |
pathfindr | 36:8e359069192b | 111 | return (uint8_t)NRF_UART0->RXD; |
pathfindr | 36:8e359069192b | 112 | }; |
pathfindr | 36:8e359069192b | 113 | char* NRFuart_gets(char terminator) { |
pathfindr | 36:8e359069192b | 114 | if (!NRF_UART0->ENABLE) NRFuart_init_nohwfc(); |
pathfindr | 36:8e359069192b | 115 | static char buffer[200]; |
pathfindr | 36:8e359069192b | 116 | int charindex = 0; |
pathfindr | 36:8e359069192b | 117 | memset(buffer,0x00,sizeof(buffer)); |
pathfindr | 37:505ef618f06c | 118 | uint32_t safetycounter = 0; |
pathfindr | 37:505ef618f06c | 119 | while(1 && safetycounter < 10000) { |
pathfindr | 36:8e359069192b | 120 | if (NRF_UART0->EVENTS_RXDRDY == 0) { |
pathfindr | 37:505ef618f06c | 121 | safetycounter ++; |
pathfindr | 36:8e359069192b | 122 | //Nothing available from the UART. |
pathfindr | 36:8e359069192b | 123 | continue; |
pathfindr | 36:8e359069192b | 124 | } else { |
pathfindr | 36:8e359069192b | 125 | char inbyte = NRFuart_getc(); |
pathfindr | 36:8e359069192b | 126 | if (inbyte == terminator) { |
pathfindr | 36:8e359069192b | 127 | break; |
pathfindr | 36:8e359069192b | 128 | } else { |
pathfindr | 36:8e359069192b | 129 | buffer[charindex] = inbyte; |
pathfindr | 36:8e359069192b | 130 | charindex++; |
pathfindr | 36:8e359069192b | 131 | } |
pathfindr | 36:8e359069192b | 132 | } |
pathfindr | 36:8e359069192b | 133 | } |
pathfindr | 36:8e359069192b | 134 | buffer[charindex] = '\n'; //make sure we end with whitespace lf |
pathfindr | 36:8e359069192b | 135 | return buffer; |
pathfindr | 36:8e359069192b | 136 | }; |
pathfindr | 36:8e359069192b | 137 | void NRFuart_flush() { |
pathfindr | 36:8e359069192b | 138 | if (!NRF_UART0->ENABLE) NRFuart_init_nohwfc(); |
pathfindr | 36:8e359069192b | 139 | uint32_t safetycounter = 0; |
pathfindr | 36:8e359069192b | 140 | while (NRFuart_readable() && safetycounter < 10000) { |
pathfindr | 36:8e359069192b | 141 | safetycounter ++; |
pathfindr | 51:9078e6928412 | 142 | char char1 = NRFuart_getc(); |
pathfindr | 36:8e359069192b | 143 | } |
pathfindr | 36:8e359069192b | 144 | }; |
pathfindr | 36:8e359069192b | 145 | bool NRFuart_readable() { |
pathfindr | 36:8e359069192b | 146 | if (!NRF_UART0->ENABLE) NRFuart_init_nohwfc(); |
pathfindr | 36:8e359069192b | 147 | return (NRF_UART0->EVENTS_RXDRDY == 1); |
pathfindr | 36:8e359069192b | 148 | }; |