stm32f401 I2C does not send byte after repeated start
I suggest trying the following:

i2c_start: while (!I2C1-&gt;SR1 &amp; I2C_SR1_SB); -> while (!(I2C1-&gt;SR1 &amp; I2C_SR1_SB));

i2c_sendByte: Move I2C1-&gt;DR = data; to first line. Replace check for TXE with check for BTF.

don't call i2c_wfw after i2c_sendByte(VOLTAGE_REG_OFFS + 2 * ch);, it will be done in i2c_sendByte as above.

use i2c_sendAddr instead of i2c_sendByte after repeated start.

Also, you check for AF in i2c_sendByte and i2c_wfw() but do not handle errors properly. It is better not to check it at all than have unpredictable code flow.
I'd recommend looking at flowcharts in AN2824 and quite nice code example at GitHub.