init

Dependencies:   aconno_I2C Lis2dh12 WatchdogTimer

NRFuart.cpp

Committer:
pathfindr
Date:
2020-02-17
Revision:
58:8d4a354816b1
Parent:
51:9078e6928412

File content as of revision 58:8d4a354816b1:

#include "NRFuart.h"

void NRFuart_init_nohwfc() {
    if(NRF_UART0->ENABLE == UART_ENABLE_ENABLE_Disabled) {
        nrf_gpio_cfg_output(PN_UART_TX);
        nrf_gpio_cfg_input(PN_UART_RX, NRF_GPIO_PIN_NOPULL);
        NRF_UART0->PSELTXD = PN_UART_TX;
        NRF_UART0->PSELRXD = PN_UART_RX;
        NRF_UART0->CONFIG = (UART_CONFIG_PARITY_Excluded << UART_CONFIG_PARITY_Pos) | UART_CONFIG_HWFC_Disabled;
        NRF_UART0->BAUDRATE = NRF_UART_BAUDRATE_115200;
        NRF_UART0->ENABLE = UART_ENABLE_ENABLE_Enabled;
        NRF_UART0->EVENTS_RXDRDY = 0;
        NRF_UART0->EVENTS_TXDRDY = 0;
        NRF_UART0->EVENTS_ERROR  = 0;
        NRF_UART0->EVENTS_TXDRDY = 0;
        NRF_UART0->TASKS_STARTRX = 1;
        NRF_UART0->TASKS_STARTTX = 1;
        //NRF_UART0->INTENCLR = 0xffffffffUL;
        //NRF_UART0->INTENSET = UART_INTENSET_RXDRDY_Msk; //or
        //NRF_UART0->INTENSET = (UART_INTENSET_RXDRDY_Set << UART_INTENSET_RXDRDY_Pos) |
        //                      (UART_INTENSET_TXDRDY_Set << UART_INTENSET_TXDRDY_Pos) |
        //                      (UART_INTENSET_ERROR_Set << UART_INTENSET_ERROR_Pos); 
        //NVIC_ClearPendingIRQ(UART0_IRQn);
        //NVIC_SetPriority(UART0_IRQn, 1); //3
        //NVIC_EnableIRQ(UART0_IRQn);
        //NVIC_SetVector(UART0_IRQn, (uint32_t) UART0_IRQHandler);
    }
};
void NRFuart_init_hwfc() {
    if(NRF_UART0->ENABLE == UART_ENABLE_ENABLE_Disabled) {
        nrf_gpio_cfg_output(PN_UART_TX);
        nrf_gpio_cfg_input(PN_UART_RX, NRF_GPIO_PIN_NOPULL);
        NRF_UART0->PSELTXD = PN_UART_TX;
        NRF_UART0->PSELRXD = PN_UART_RX;
        NRF_UART0->PSELCTS = PN_UART_CTS;
        NRF_UART0->PSELRTS = PN_UART_RTS;
        NRF_UART0->CONFIG = (UART_CONFIG_PARITY_Excluded << UART_CONFIG_PARITY_Pos) | UART_CONFIG_HWFC_Enabled;
        NRF_UART0->BAUDRATE = NRF_UART_BAUDRATE_115200;
        NRF_UART0->ENABLE = UART_ENABLE_ENABLE_Enabled;
        NRF_UART0->EVENTS_RXDRDY = 0;
        NRF_UART0->EVENTS_TXDRDY = 0;
        NRF_UART0->EVENTS_ERROR  = 0;
        NRF_UART0->EVENTS_TXDRDY = 0;
        NRF_UART0->TASKS_STARTRX = 1;
        NRF_UART0->TASKS_STARTTX = 1;
        //NRF_UART0->INTENCLR = 0xffffffffUL;
        //NRF_UART0->INTENSET = UART_INTENSET_RXDRDY_Msk; //or
        //NRF_UART0->INTENSET = (UART_INTENSET_RXDRDY_Set << UART_INTENSET_RXDRDY_Pos) |
        //                      (UART_INTENSET_TXDRDY_Set << UART_INTENSET_TXDRDY_Pos) |
        //                      (UART_INTENSET_ERROR_Set << UART_INTENSET_ERROR_Pos);   
        //NVIC_ClearPendingIRQ(UART0_IRQn);
        //NVIC_SetPriority(UART0_IRQn, 1); //3
        //NVIC_EnableIRQ(UART0_IRQn);
        //NVIC_SetVector(UART0_IRQn, (uint32_t) UART0_IRQHandler);
    }
};
void NRFuart_uninit() {
    if (NRF_UART0->ENABLE == UART_ENABLE_ENABLE_Enabled) {
        NVIC_DisableIRQ(UART0_IRQn);
        NRF_UART0->INTENCLR = 0xffffffffUL;
        NRF_UART0->TASKS_STOPRX = 1;
        NRF_UART0->TASKS_STOPTX = 1;
        NRF_UART0->ENABLE = UART_ENABLE_ENABLE_Disabled;
        NRF_UART0->PSELTXD = 0xFFFFFFFF;
        NRF_UART0->PSELRXD = 0xFFFFFFFF;
        NRF_UART0->PSELRTS = 0xFFFFFFFF;
        NRF_UART0->PSELCTS = 0xFFFFFFFF;
    }
};
void NRFuart_putc(char byte) {
    if (!NRF_UART0->ENABLE) NRFuart_init_nohwfc();
    NRF_UART0->TXD = byte;
    uint32_t safetycounter = 0;
    while(NRF_UART0->EVENTS_TXDRDY != 1 && safetycounter < 10000) {
        safetycounter ++; // Wait for the current TXD data to be sent.
    }
    NRF_UART0->EVENTS_TXDRDY = 0;
};
void NRFuart_puts(char* bytes) {
    if (!NRF_UART0->ENABLE) NRFuart_init_nohwfc();
    uint32_t safetycounter = 0;
    for(int i = 0; bytes[i] != 0x00; i++) {
        NRFuart_putc(bytes[i]);
        safetycounter ++;
        if (safetycounter > 10000) break;   
    }
};
void NRFuart_puts_debug(char* bytes) {
    if (!NRF_UART0->ENABLE) NRFuart_init_nohwfc();
    uint32_t safetycounter = 0;
    for(int i = 0; bytes[i] != 0x00; i++) {
        NRFuart_putc(bytes[i]);
        safetycounter ++;
        if (safetycounter > 10000) break; 
    }
    NRFuart_putc('\n');
};
void debug_prep(){
    memset(GLOBAL_debug_buffer, 0x00, sizeof(GLOBAL_debug_buffer));   
}
void debug_exe(){
    NRFuart_puts_debug(GLOBAL_debug_buffer);
}
char NRFuart_getc() {
    if (!NRF_UART0->ENABLE) NRFuart_init_nohwfc();
    uint32_t safetycounter = 0;
    while(NRF_UART0->EVENTS_RXDRDY != 1 && safetycounter < 10000){
        safetycounter ++;
    }
    NRF_UART0->EVENTS_RXDRDY = 0;
    return (uint8_t)NRF_UART0->RXD;
};
char* NRFuart_gets(char terminator) {
    if (!NRF_UART0->ENABLE) NRFuart_init_nohwfc();
    static char buffer[200];
    int charindex = 0;
    memset(buffer,0x00,sizeof(buffer));
    uint32_t safetycounter = 0;
    while(1 && safetycounter < 10000) {
        if (NRF_UART0->EVENTS_RXDRDY == 0) {
            safetycounter ++;
            //Nothing available from the UART.
            continue;
        } else {
            char inbyte = NRFuart_getc();
            if (inbyte == terminator) {
                break;
            } else {
                buffer[charindex] = inbyte;
                charindex++;
            }
        }
    }
    buffer[charindex] = '\n'; //make sure we end with whitespace lf
    return buffer;
};
void NRFuart_flush() {
    if (!NRF_UART0->ENABLE) NRFuart_init_nohwfc();
    uint32_t safetycounter = 0;
    while (NRFuart_readable() && safetycounter < 10000) {
        safetycounter ++;
        char char1 = NRFuart_getc();
    }
};
bool NRFuart_readable() {
    if (!NRF_UART0->ENABLE) NRFuart_init_nohwfc();
    return (NRF_UART0->EVENTS_RXDRDY == 1);
};