diff --git a/src/uart-transmit/esp32-c3-uart-interface.c b/src/uart-transmit/esp32-c3-uart-interface.c index a5ec44ef947ae1972666fcb1459f6034fb372524..39f53a1630595711eebbd79b7bdc5b3486973d22 100644 --- a/src/uart-transmit/esp32-c3-uart-interface.c +++ b/src/uart-transmit/esp32-c3-uart-interface.c @@ -1,46 +1,52 @@ #include "esp32-c3-uart-interface.h" +static void clearBits(volatile uint32_t *registerAddress, uint32_t bitPositions, uint32_t numBits) { + uint32_t mask = (uint32_t)(1 << numBits) - 1; // Create a mask with the specified number of bits set to 1 + mask <<= bitPositions; // Shift the mask to the correct bit positions + *registerAddress &= ~mask; // Clear the bits in the register using bitwise AND with the inverse of the mask +} + static void init_uart_enable_clk(){ // enable the clock for UART RAM by setting SYSTEM_UART_MEM_CLK_EN to 1; // enable APB_CLK for UARTn by setting SYSTEM_UARTn_CLK_EN to 1; - uint32_t perip_clk_en0_reg = *C3_SYSTEM_PERIP_CLK_EN0_REG; - perip_clk_en0_reg |= 1<<24; - perip_clk_en0_reg |= 1<<5; - perip_clk_en0_reg |= 1<<2; - *C3_SYSTEM_PERIP_CLK_EN0_REG = perip_clk_en0_reg; + uint32_t perip_clk_en0 = *C3_SYSTEM_PERIP_CLK_EN0_REG; + perip_clk_en0 |= 1<<24; + perip_clk_en0 |= 1<<5; + perip_clk_en0 |= 1<<2; + *C3_SYSTEM_PERIP_CLK_EN0_REG = perip_clk_en0; } static void init_uart_toggle_rst(){ // Detailed steps explained in 26.5.2.1 // for resetting and initilizing of uart // get current regestry values - uint32_t rx_filt_reg = *C3_UART_RX_FILT_REG; - uint32_t core_value = *C3_UART_CLK_CONF_REG; + uint32_t rx_filt = *C3_UART_RX_FILT_REG_UART0; + uint32_t core_value = *C3_UART_CLK_CONF_REG_UART0; // clear UARTn_RST - rx_filt_reg &= (uint32_t)~(1<<5); - rx_filt_reg &= (uint32_t)~(1<<2); - *C3_UART_RX_FILT_REG = rx_filt_reg; + rx_filt &= (uint32_t)~(1<<5); + rx_filt &= (uint32_t)~(1<<2); + *C3_UART_RX_FILT_REG_UART0 = rx_filt; // set UART_RST_CORE core_value |= 1<<23; - *C3_UART_CLK_CONF_REG = core_value; + *C3_UART_CLK_CONF_REG_UART0 = core_value; // set UARTn_RST - rx_filt_reg |= 1<<5; - rx_filt_reg |= 1<<2; - *C3_UART_RX_FILT_REG = rx_filt_reg; + rx_filt |= 1<<5; + rx_filt |= 1<<2; + *C3_UART_RX_FILT_REG_UART0 = rx_filt; // clear UARTn_RST - rx_filt_reg &= (uint32_t)~(1<<5); - rx_filt_reg &= (uint32_t)~(1<<2); - *C3_UART_RX_FILT_REG = rx_filt_reg; + rx_filt &= (uint32_t)~(1<<5); + rx_filt &= (uint32_t)~(1<<2); + *C3_UART_RX_FILT_REG_UART0 = rx_filt; // clear UART_RST_CORE core_value &= (uint32_t)~(1<<23); - *C3_UART_CLK_CONF_REG = core_value; + *C3_UART_CLK_CONF_REG_UART0 = core_value; } static void init_uart_clear_update(){ // enable register synchronization by clearing UART_UPDATE_CTRL. - uint32_t id_value = *C3_UART_ID_REG; + uint32_t id_value = *C3_UART_ID_REG_UART0; id_value &= (uint32_t)~(1<<30); - *C3_UART_ID_REG = id_value; + *C3_UART_ID_REG_UART0 = id_value; } static void config_clock_freq(){ @@ -48,7 +54,7 @@ static void config_clock_freq(){ // baud rate = freq / (UART_CLKDIV + UART_CLKDIV_FRAG / 16) // select the clock source via UART_SCLK_SEL; - uint32_t clockSelect = *C3_UART_CLK_CONF_REG; + uint32_t clockSelect = *C3_UART_CLK_CONF_REG_UART0; // making sure we start with 0 clockSelect &= (uint32_t)~(1<<20); clockSelect &= (uint32_t)~(1<<21); @@ -56,7 +62,7 @@ static void config_clock_freq(){ // 10 is RC_FAST_CLK with default of 17.5 MHz // 11 is XTAL_CLK with 40 MHz clockSelect |= 1<<20; - *C3_UART_CLK_CONF_REG = clockSelect; + *C3_UART_CLK_CONF_REG_UART0 = clockSelect; // selected ABP_CLK with 80 MHz // dividing clock to 6 Mhz (divisor should be 13+1/3) @@ -72,36 +78,36 @@ static void config_clock_freq(){ clockSelect |= 1<<1; clockSelect |= 1<<0; - *C3_UART_CLK_CONF_REG = clockSelect; + *C3_UART_CLK_CONF_REG_UART0 = clockSelect; // calculate Baud rate to be 9600 (6Mhz/625) - uint32_t baudRateDivs = *C3_UART_CLKDIV_REG; + uint32_t baudRateDivs = *C3_UART_CLKDIV_REG_UART0; baudRateDivs |= 1<<0; baudRateDivs |= 1<<4; baudRateDivs |= 1<<5; baudRateDivs |= 1<<6; baudRateDivs |= 1<<9; - *C3_UART_CLKDIV_REG = baudRateDivs; + *C3_UART_CLKDIV_REG_UART0 = baudRateDivs; } static void disable_parity(){ - uint32_t uart_conf_reg = *C3_UART_CONF0_REG; - uart_conf_reg &= (uint32_t)~(1<<0); - uart_conf_reg &= (uint32_t)~(1<<1); - *C3_UART_CONF0_REG = uart_conf_reg; + uint32_t uart_conf = *C3_UART_CONF0_REG_UART0; + uart_conf &= (uint32_t)~(1<<0); + uart_conf &= (uint32_t)~(1<<1); + *C3_UART_CONF0_REG_UART0 = uart_conf; } static void set_max_data_lenght(){ - uint32_t uart_conf_reg = *C3_UART_CONF0_REG; - uart_conf_reg |= (1<<2); - uart_conf_reg |= (1<<3); - *C3_UART_CONF0_REG = uart_conf_reg; + uint32_t uart_conf = *C3_UART_CONF0_REG_UART0; + uart_conf |= (1<<2); + uart_conf |= (1<<3); + *C3_UART_CONF0_REG_UART0 = uart_conf; } void config_uart(){ printf("Try to config %d\n", 1); - // wait for UART_REG_UPDATE to become 0, which indicates the completion of the last synchronization; - uint32_t reg_update = *C3_UART_ID_REG; + // wait for UART_REG_UART0_UPDATE to become 0, which indicates the completion of the last synchronization; + uint32_t reg_update = *C3_UART_ID_REG_UART0; if ((bool)(reg_update & (uint32_t)(1<<31))){ return; } @@ -122,13 +128,28 @@ void config_uart(){ // synchronize the configured values to the Core Clock domain by writing 1 to UART_REG_UPDATE. reg_update |= (uint32_t)(1<<31); - *C3_UART_ID_REG = reg_update; + *C3_UART_ID_REG_UART0 = reg_update; +} + +static void set_65_to_rd_byte(){ + uint32_t rx_fifo = *C3_UART_FIFO_REG_UART0; + // making sure we start with 0 + rx_fifo |= 1<<0; + rx_fifo |= 1<<6; + *C3_UART_FIFO_REG_UART0 = rx_fifo; + } void enable_uart_transmitter(){ // configure TX FIFO’s empty threshold via UART_TXFIFO_EMPTY_THRHD; + clearBits(C3_UART_CONF1_REG_UART0, 9, 9); + // disable UART_TXFIFO_EMPTY_INT interrupt by clearing UART_TXFIFO_EMPTY_INT_ENA; + clearBits(C3_UART_INT_ENA_REG_UART0, 1, 1); + // write data to be sent to UART_RXFIFO_RD_BYTE; + set_65_to_rd_byte(); + // clear UART_TXFIFO_EMPTY_INT interrupt by setting UART_TXFIFO_EMPTY_INT_CLR; // enable UART_TXFIFO_EMPTY_INT interrupt by setting UART_TXFIFO_EMPTY_INT_ENA; // detect UART_TXFIFO_EMPTY_INT and wait for the completion of data transmission.