From 5db0144d4caec634af535d09831a2e8d22e31786 Mon Sep 17 00:00:00 2001 From: Ajit Ananthadevan Date: Thu, 21 Aug 2025 04:04:37 +1000 Subject: [PATCH] pcf8574-blinky v2 --- myapps/misc/pcf8574-blinky-refac/Makefile | 167 ++++++++++++++++++ .../pcf8574-blinky-refac/src/inc/pcf8574.h | 17 ++ myapps/misc/pcf8574-blinky-refac/src/main.c | 24 +++ .../misc/pcf8574-blinky-refac/src/pcf8574.c | 62 +++++++ 4 files changed, 270 insertions(+) create mode 100644 myapps/misc/pcf8574-blinky-refac/Makefile create mode 100644 myapps/misc/pcf8574-blinky-refac/src/inc/pcf8574.h create mode 100644 myapps/misc/pcf8574-blinky-refac/src/main.c create mode 100644 myapps/misc/pcf8574-blinky-refac/src/pcf8574.c diff --git a/myapps/misc/pcf8574-blinky-refac/Makefile b/myapps/misc/pcf8574-blinky-refac/Makefile new file mode 100644 index 0000000..b9bd730 --- /dev/null +++ b/myapps/misc/pcf8574-blinky-refac/Makefile @@ -0,0 +1,167 @@ +###################################### +# target +###################################### +TARGET = ch592_blinky +# ../../ + + +###################################### +# building variables +###################################### +# debug build? +DEBUG = 1 +# optimization for size +OPT = -Os + + +####################################### +# paths +####################################### +# Build path +BUILD_DIR = build + +###################################### +# source +###################################### +# C sources +C_SOURCES = \ +src/main.c \ +src/pcf8574.c \ +../../../vendor/StdPeriphDriver/CH59x_clk.c \ +../../../vendor/StdPeriphDriver/CH59x_gpio.c \ +../../../vendor/StdPeriphDriver/CH59x_pwr.c \ +../../../vendor/StdPeriphDriver/CH59x_sys.c \ +../../../vendor/StdPeriphDriver/CH59x_i2c.c \ +../../../vendor/RVMSIS/core_riscv.c \ + + +# ASM sources +ASM_SOURCES = \ +../../../vendor/Startup/startup_CH592.S + +####################################### +# binaries +####################################### +#PREFIX = riscv-none-elf- +#PREFIX = riscv64-elf- +#debian +#PREFIX = riscv64-unknown-elf- +PREFIX = riscv-wch-elf- + +CC = $(PREFIX)gcc +AS = $(PREFIX)gcc -x assembler-with-cpp +CP = $(PREFIX)objcopy +SZ = $(PREFIX)size + +HEX = $(CP) -O ihex +BIN = $(CP) -O binary -S + +####################################### +# CFLAGS +####################################### +# cpu +CPU = -march=rv32imac_zicsr -mabi=ilp32 -msmall-data-limit=8 + +# For gcc version less than v12 +# CPU = -march=rv32imac -mabi=ilp32 -msmall-data-limit=8 + +# fpu +FPU = + +# float-abi +FLOAT-ABI = + +# mcu +MCU = $(CPU) $(FPU) $(FLOAT-ABI) + +# AS includes +AS_INCLUDES = + +# C includes +C_INCLUDES = \ +-I../../../vendor/StdPeriphDriver/inc \ +-I../../../vendor/RVMSIS \ +-I../../../vendor/Core \ +-Isrc/inc + +# compile gcc flags +ASFLAGS = $(MCU) $(AS_INCLUDES) $(OPT) -Wall -fdata-sections -ffunction-sections + +CFLAGS = $(MCU) $(C_INCLUDES) $(OPT) -Wall -fdata-sections -ffunction-sections + +ifeq ($(DEBUG), 1) +CFLAGS += -g -gdwarf-2 +endif + + +# Generate dependency information +CFLAGS += -MMD -MP -MF"$(@:%.o=%.d)" + + +####################################### +# LDFLAGS +####################################### +# link script +LDSCRIPT = ../../../vendor/Ld/Link.ld + +# libraries +LIBS = -lc -lm -lnosys ../../../vendor/StdPeriphDriver/libISP592.a +LIBDIR = +LDFLAGS = $(MCU) -mno-save-restore -fmessage-length=0 -fsigned-char -ffunction-sections -fdata-sections -Wunused -Wuninitialized -T $(LDSCRIPT) -nostartfiles -Xlinker --gc-sections -Wl,-Map=$(BUILD_DIR)/$(TARGET).map --specs=nano.specs $(LIBS) + +# default action: build all +all: $(BUILD_DIR)/$(TARGET).elf $(BUILD_DIR)/$(TARGET).hex $(BUILD_DIR)/$(TARGET).bin + + +####################################### +# build the application +####################################### +# list of objects +OBJECTS = $(addprefix $(BUILD_DIR)/,$(notdir $(C_SOURCES:.c=.o))) +vpath %.c $(sort $(dir $(C_SOURCES))) + +# list of ASM program objects +OBJECTS += $(addprefix $(BUILD_DIR)/,$(notdir $(ASM_SOURCES:.S=.o))) +vpath %.S $(sort $(dir $(ASM_SOURCES))) + +$(BUILD_DIR)/%.o: %.c Makefile | $(BUILD_DIR) + $(CC) -c $(CFLAGS) -Wa,-a,-ad,-alms=$(BUILD_DIR)/$(notdir $(<:.c=.lst)) $< -o $@ + +$(BUILD_DIR)/%.o: %.S Makefile | $(BUILD_DIR) + $(AS) -c $(CFLAGS) $< -o $@ +#$(LUAOBJECTS) $(OBJECTS) +$(BUILD_DIR)/$(TARGET).elf: $(OBJECTS) Makefile + $(CC) $(OBJECTS) $(LDFLAGS) -o $@ + $(SZ) $@ + +$(BUILD_DIR)/%.hex: $(BUILD_DIR)/%.elf | $(BUILD_DIR) + $(HEX) $< $@ + +$(BUILD_DIR)/%.bin: $(BUILD_DIR)/%.elf | $(BUILD_DIR) + $(BIN) $< $@ + +$(BUILD_DIR): + mkdir $@ + +####################################### +# Program +####################################### + +isp: $(BUILD_DIR)/$(TARGET).bin + wchisp flash $(BUILD_DIR)/$(TARGET).bin + +flash: $(BUILD_DIR)/$(TARGET).bin + wlink flash $(BUILD_DIR)/$(TARGET).bin + +####################################### +# clean up +####################################### +clean: + -rm -fR $(BUILD_DIR) + +####################################### +# dependencies +####################################### +-include $(wildcard $(BUILD_DIR)/*.d) + +# *** EOF *** diff --git a/myapps/misc/pcf8574-blinky-refac/src/inc/pcf8574.h b/myapps/misc/pcf8574-blinky-refac/src/inc/pcf8574.h new file mode 100644 index 0000000..5299f00 --- /dev/null +++ b/myapps/misc/pcf8574-blinky-refac/src/inc/pcf8574.h @@ -0,0 +1,17 @@ +// PCF8574 driver header + + +#define PCFP0 0x01 +#define PCFP1 0x02 +#define PCFP2 0x04 +#define PCFP3 0x08 +#define PCFP4 0x10 +#define PCFP5 0x20 +#define PCFP6 0x40 +#define PCFP7 0x80 //128 + +void pcf_init(); + +void pcf_setbits(uint8_t ports); +void pcf_resetbits(uint8_t ports); + diff --git a/myapps/misc/pcf8574-blinky-refac/src/main.c b/myapps/misc/pcf8574-blinky-refac/src/main.c new file mode 100644 index 0000000..0fee7cc --- /dev/null +++ b/myapps/misc/pcf8574-blinky-refac/src/main.c @@ -0,0 +1,24 @@ +// LED on PORT0 + + +#include "CH59x_common.h" +#include "pcf8574.h" + + +int main() +{ + SetSysClock(CLK_SOURCE_PLL_60MHz); + + pcf_init(); + + pcf_setbits(PCFP0); + + while (1) { + mDelaymS(400); + pcf_resetbits(PCFP0); + + mDelaymS(100); + pcf_setbits(PCFP0); + } +} + diff --git a/myapps/misc/pcf8574-blinky-refac/src/pcf8574.c b/myapps/misc/pcf8574-blinky-refac/src/pcf8574.c new file mode 100644 index 0000000..ca6db2c --- /dev/null +++ b/myapps/misc/pcf8574-blinky-refac/src/pcf8574.c @@ -0,0 +1,62 @@ +// PCF8574 driver + +#include "CH59x_common.h" +#include "pcf8574.h" + +#define I2C_OWNADD 0x0001 + + +void pcf_init() +{ + I2C_Init(I2C_Mode_I2C, 100000, I2C_DutyCycle_16_9, + I2C_Ack_Enable, I2C_AckAddr_7bit, I2C_OWNADD); + I2C_GenerateSTART(ENABLE); + while (!I2C_CheckEvent(I2C_EVENT_MASTER_MODE_SELECT)); + I2C_Send7bitAddress(0x40, I2C_Direction_Transmitter); + while (!I2C_CheckEvent(I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)); + I2C_SendData(0xFF); + while (!I2C_CheckEvent(I2C_EVENT_MASTER_BYTE_TRANSMITTED)); + I2C_GenerateSTOP(ENABLE); +} + +/* + * set the ports OR'd together like: PCFP0 | PCFP1 + */ +void pcf_setbits(uint8_t ports) +{ + I2C_GenerateSTART(ENABLE); + while (!I2C_CheckEvent(I2C_EVENT_MASTER_MODE_SELECT)); + I2C_Send7bitAddress(0x41, I2C_Direction_Receiver); + while (!I2C_CheckEvent(I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED)); + uint8_t curr = I2C_ReceiveData(); + while (!I2C_CheckEvent(I2C_EVENT_MASTER_BYTE_RECEIVED)); + I2C_GenerateSTOP(ENABLE); + + I2C_GenerateSTART(ENABLE); + while (!I2C_CheckEvent(I2C_EVENT_MASTER_MODE_SELECT)); + I2C_Send7bitAddress(0x40, I2C_Direction_Transmitter); + while (!I2C_CheckEvent(I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)); + I2C_SendData(curr | ports); + while (!I2C_CheckEvent(I2C_EVENT_MASTER_BYTE_TRANSMITTED)); + I2C_GenerateSTOP(ENABLE); +} + +void pcf_resetbits(uint8_t ports) +{ + I2C_GenerateSTART(ENABLE); + while (!I2C_CheckEvent(I2C_EVENT_MASTER_MODE_SELECT)); + I2C_Send7bitAddress(0x41, I2C_Direction_Receiver); + while (!I2C_CheckEvent(I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED)); + uint8_t curr = I2C_ReceiveData(); + while (!I2C_CheckEvent(I2C_EVENT_MASTER_BYTE_RECEIVED)); + I2C_GenerateSTOP(ENABLE); + + I2C_GenerateSTART(ENABLE); + while (!I2C_CheckEvent(I2C_EVENT_MASTER_MODE_SELECT)); + I2C_Send7bitAddress(0x40, I2C_Direction_Transmitter); + while (!I2C_CheckEvent(I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)); + I2C_SendData(curr & ~(ports)); + while (!I2C_CheckEvent(I2C_EVENT_MASTER_BYTE_TRANSMITTED)); + I2C_GenerateSTOP(ENABLE); +} +