Creality K1 Max Error 0109: Throat Fan Fault, Diagnosis and Fix

Updated: 10 November 2026
Slug: k1-max-error-0109-throat-fan

The Creality K1 Max shows [0109] unknown exception when the throat fan reports no speed feedback. The touchscreen has no text label for code 109. The message therefore looks unrelated to the fan. This article gives the real meaning, the log locations, the test procedure, and the cause we found on our printer.

The symptom

The printer starts a job. The screen then shows an error box. The job pauses about once per second. The job finally cancels. The message reads [0109] unknown exception.

In our case each new job failed at the same point. The hotend also cooled down after the fault.

Code 109 is the throat fan

The screen text comes from the display service. The log gives the real message:

GetPrinter response data = 109	10	throat fan running abnormal
errorcode:109,k1_errorcode:10,error msg:throat fan running abnormal

Code 109 with sub-code 10 means throat fan running abnormal. The throat fan is the hotend heatsink fan. Creality documents this fault as CF0109.

Prove the fault with the printer API

Moonraker reports the measured fan speeds. Query the fan_feedback object:

GET http://<printer-address>:7125/printer/objects/query?fan_feedback
{"fan0_speed": 0, "fan1_speed": 3692, "fan2_speed": 0,
 "fan3_speed": 0, "fan4_speed": 0}

You can also ask Klipper directly. Run this command in the console:

QUERY_FAN_CHECK
// {'fan0_speed': 0, 'fan1_speed': 3692, 'fan2_speed': 0, 'fan3_speed': 0, 'fan4_speed': 0}

Compare the two values. In this example the backplane fan reports 3692 rpm and the throat fan reports 0 rpm. The measurement path works. The throat fan path does not.

The pin map is in printer_params.cfg:

[fan_feedback]
fan0_pin: nozzle_mcu:PB4 # throat fan
# fan0_pin: nozzle_mcu:PB3 # model fan
fan1_pin: PC6 # backplane fan
print_delay_time: 5
current_delay_time: 2

The fan_feedback module only measures. It publishes cx_fan_status through the get_cx_fan_status webhook. The Creality control service reads that status and raises code 109. A clean Klipper log therefore shows no error.

Find the fault record on the printer

The Creality services keep their own logs. These files help when the screen text is vague:

  • /usr/data/creality/userdata/fault_code/fault_code_info.json — fault history with codes and text
  • /usr/data/creality/userdata/log/master-server.log — control service, fan polling
  • /usr/data/creality/userdata/log/display-server.log — screen dialogs, error codes

The control service logs each fan poll:

handleFanStatus fanIndex: 3, fanSpeed:0, Error: throat fan running abnormal
handleFanStatus show fanIndex: 4, fanSpeed:3692, fanPercentage:0

A healthy fan only writes the show line. A faulty fan also writes the Error line.

Why code 109 cancels the job

The control service reacts to the fault. It sends a pause command in a loop:

control pause print file
control pause print file

The pause repeats about once per second. The job never resumes. Treat code 109 as a print stopper. Do not treat it as a warning.

The cause in our case: fan in the wrong header

We replaced a hotend after a filament blob. A thermistor wire broke during the repair. We then plugged the throat fan back into the toolhead board.

The fan ran. It ran slowly. The tachometer reported 0 rpm.

The toolhead board has more than one fan header. The headers look similar. Our fan went into a header with no tachometer connection. That header also supplied a lower voltage. The fan turned slowly and sent no pulses to nozzle_mcu:PB4.

The same fan on a bench supply at 24 V ran at full speed. The fan was good. The header was wrong.

Test the fan

The K1 Max throat fan is a 24 V blower. The toolhead board labels the three wires V, G and S:

  • V — +24 V DC
  • G — ground
  • S — signal, the tachometer output

Do not apply voltage to the S wire. The wire is an output. It switches to ground in pulses.

Check the header voltage

  1. Heat the nozzle above 60 °C. The throat fan starts at 40 °C.
  2. Unplug the fan. Do not touch the hotend.
  3. Measure each header pin to ground.
  4. The power pin reads about 24 V. The signal pin reads about 3.3 V. The ground pin reads 0 V.

A power pin at 12 V or 5 V shows a wrong header. A power pin at 0 V shows an inactive output.

Check the fan on the bench

  1. Set a bench supply to 24 V DC.
  2. Set the current limit to 300 mA.
  3. Connect V to +24 V and G to ground.
  4. The fan must spin fast. A healthy 4010 blower draws 0.08 A to 0.15 A.

Check the signal wire

  1. Fit a 10 kΩ resistor from S to +5 V.
  2. Power the fan at 24 V.
  3. Measure the frequency between S and ground.
  4. Expect 400 Hz to 533 Hz. Most of these fans give two pulses per revolution.

400 Hz equals 12000 rpm. 533 Hz equals 16000 rpm. A flat line at 0 Hz with the fan spinning shows a dead tachometer. Replace the fan.

The fix

  1. Move the fan connector to the throat fan header.
  2. Check each wire against the board labels.
  3. Power the printer on.
  4. Heat the nozzle above 60 °C.
  5. Query fan_feedback again.

The corrected value appears at once:

{"fan0_speed": 12000, "fan1_speed": 3692, "fan2_speed": 0,
 "fan3_speed": 0, "fan4_speed": 0}

The control service clears the fault by itself:

handleFanStatus fanIndex: 3, fanSpeed:12000, fanIsRunning: 1 => Fan state changed, Reset

Check the repair

Run one test job. Pause the job. Resume the job. Code 109 used to fail at the pause. Confirm these points:

  • fan0_speed stays above 10000 for the whole job
  • fault_code_info.json gets no new entry
  • the screen shows no error box

Notes

  • A slow fan reduces heatsink airflow. Stop printing until the fan runs at full speed. Heat creep can clog the hotend.
  • The fault clears on the next job only when the tachometer reports speed.
  • Creality lists these checks for CF0109: heat the nozzle, inspect the fan wiring, remove objects from the blades, loosen the fan screws, and update the firmware. Firmware 1.1.0.65 and later adds fan handling changes.
  • The K1 Max runs a modified Klipper. Moonraker and Mainsail work beside the Creality services. The fault code still comes from the Creality control service.

Summary

  • Code 109 is a fan speed check, not an unknown exception.
  • Use fan_feedback or QUERY_FAN_CHECK to read real fan speeds.
  • A fan that spins slowly and reports 0 rpm usually sits in the wrong header.
  • A signal between 400 Hz and 533 Hz is normal for 12000 rpm to 16000 rpm.
  • The fault aborts jobs. Fix the fan path before the next print.

Leave a Reply

Your email address will not be published. Required fields are marked *