#include "ch32fun.h" #include "i2c_driver.h" #include "fan_driver.h" #include "i2c.h" volatile uint8_t i2c_registers[16] = {0x00}; void onWrite(const uint8_t reg, const uint8_t length) { if (length == 0) return; switch (reg) { case I2C_REG_TARGET_RPM: fan_driver_target_rpm = i2c_get_register_word(i2c_registers, I2C_REG_TARGET_RPM); printf("set tgt fan speed to %d\n", fan_driver_target_rpm); break; case I2C_REG_CURRENT_DUTY: printf("set duty cycle to %d\n", i2c_get_register_word(i2c_registers, I2C_REG_CURRENT_DUTY)); break; case I2C_REG_MODE: fan_driver_control_mode = (i2c_registers[I2C_REG_MODE] & 0x01); fan_driver_fan_type = (i2c_registers[I2C_REG_MODE] & 0x02) >> 1; fan_driver_powered_down = (i2c_registers[I2C_REG_MODE] & 0x04) >> 2; printf("set mode register to %x. control mode is %d, type is %d, powered down is %d\n", i2c_registers[I2C_REG_MODE], fan_driver_control_mode, fan_driver_fan_type, fan_driver_powered_down); break; default: i2c_registers_reinit(i2c_registers); break; } printf("wrote %d bytes to reg 0x%0x\n", length, reg); } int main() { SystemInit(); printf("System bootup\n"); fan_driver_init(); fan_driver_pwm_set_duty(1000); // Initialize I2C slave funGpioInitC(); funPinMode(PC1, GPIO_CFGLR_OUT_10Mhz_AF_OD); // SDA funPinMode(PC2, GPIO_CFGLR_OUT_10Mhz_AF_OD); // SCL i2c_registers_reinit(i2c_registers); i2c_registers_set_defaults(i2c_registers); fan_driver_target_rpm = i2c_get_register_word(i2c_registers, I2C_REG_TARGET_RPM); SetupI2CSlave(I2C_DEVICE_ADDR, i2c_registers, sizeof(i2c_registers), onWrite, NULL, false); while (1) { fan_driver_control_loop(); i2c_set_register_word(i2c_registers, I2C_REG_CURRENT_RPM, fan_driver_current_rpm); i2c_set_register_word(i2c_registers, I2C_REG_CURRENT_DUTY, fan_driver_pwm_get_duty()); i2c_registers[I2C_REG_STATE] = (fan_driver_is_steady) | (fan_driver_is_stalled << 1); Delay_Ms(200); } }