From af0135bcce97950816236f82dc113fd566357da2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20van=20Dorst?= Date: Sun, 31 Aug 2025 20:08:24 +0200 Subject: [PATCH] Add sfr16 SFR_REG_ADDR_U16. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit So instead do it manual split a uint16_t in to two uint8_t. The compiler can do it, so reduces user error. Note: compiler writes the lower/LSB part first. When that is importent this can“t be used. Assembly is still the same except note above. --- rtl837x_sfr.h | 4 ++++ rtlplayground.c | 16 ++++++++-------- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/rtl837x_sfr.h b/rtl837x_sfr.h index 8aa3a8c..927aa70 100644 --- a/rtl837x_sfr.h +++ b/rtl837x_sfr.h @@ -1,8 +1,12 @@ /* SFR control registers for switch register access */ __sfr __at(0xa0) SFR_EXEC_GO; __sfr __at(0xa1) SFR_EXEC_STATUS; +__sfr16 __at(0xa2a3) SFR_REG_ADDR_U16; __sfr __at(0xa2) SFR_REG_ADDRH; __sfr __at(0xa3) SFR_REG_ADDRL; +__sfr16 __at(0xa4a5) SFR_DATA_U16; +__sfr32 __at(0xa4a5a6a7) SFR_DATA_U32; +__sfr32 __at(0xa7a6a5a4) SFR_DATA_U32LE; __sfr __at(0xa4) SFR_DATA_24; __sfr __at(0xa5) SFR_DATA_16; __sfr __at(0xa6) SFR_DATA_8; diff --git a/rtlplayground.c b/rtlplayground.c index 5075095..4e358b5 100644 --- a/rtlplayground.c +++ b/rtlplayground.c @@ -284,8 +284,8 @@ void setup_timer0(void) void reg_read(uint16_t reg_addr) { - SFR_REG_ADDRH = reg_addr >> 8; - SFR_REG_ADDRL = reg_addr; + SFR_REG_ADDR_U16 = reg_addr; + SFR_EXEC_GO = SFR_EXEC_READ_REG; do { } while (SFR_EXEC_STATUS != 0); @@ -298,8 +298,8 @@ void reg_read_m(uint16_t reg_addr) #ifdef REGDBG if (EA) { write_char('r'); print_byte(reg_addr >> 8); print_byte(reg_addr); write_char(':'); } #endif - SFR_REG_ADDRH = reg_addr >> 8; - SFR_REG_ADDRL = reg_addr; + SFR_REG_ADDR_U16 = reg_addr; + SFR_EXEC_GO = SFR_EXEC_READ_REG; do { } while (SFR_EXEC_STATUS != 0); @@ -316,8 +316,8 @@ void reg_read_m(uint16_t reg_addr) void reg_write(uint16_t reg_addr) { /* Data to write must be in SFR A4, A5, A6, A7 */ - SFR_REG_ADDRH = reg_addr >> 8; - SFR_REG_ADDRL = reg_addr; + SFR_REG_ADDR_U16 = reg_addr; + SFR_EXEC_GO = SFR_EXEC_WRITE_REG; do { } while (SFR_EXEC_STATUS != 0); @@ -332,8 +332,8 @@ void reg_write_m(uint16_t reg_addr) print_byte(sfr_data[0]); print_byte(sfr_data[1]); print_byte(sfr_data[2]); print_byte(sfr_data[3]); write_char(' '); } #endif - SFR_REG_ADDRH = reg_addr >> 8; - SFR_REG_ADDRL = reg_addr; + SFR_REG_ADDR_U16 = reg_addr; + SFR_DATA_24 = sfr_data[0] ; SFR_DATA_16 = sfr_data[1]; SFR_DATA_8 = sfr_data[2];