actual project
This commit is contained in:
64
src/main.c
Normal file
64
src/main.c
Normal file
@@ -0,0 +1,64 @@
|
||||
#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);
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user