Index: ctrl/firmware/Main/CubeMX/Core/Src/main.c
===================================================================
--- ctrl/firmware/Main/CubeMX/Core/Src/main.c	(revision 77)
+++ ctrl/firmware/Main/CubeMX/Core/Src/main.c	(revision 78)
@@ -35,4 +35,6 @@
 #include <stdio.h>
 
+#include "dhcp.h"
+
 /* USER CODE END Includes */
 
@@ -110,4 +112,6 @@
 
   /* USER CODE BEGIN SysInit */
+
+  printf("CPU clock: %d Hz\n", HAL_RCC_GetSysClockFreq());
 
   /* USER CODE END SysInit */
@@ -265,4 +269,13 @@
   /* USER CODE BEGIN Callback 1 */
 
+  // We duplicate this here to make CubeMX regeneratable
+  if (htim->Instance == TIM7)
+  {
+	  if (!(HAL_GetTick() % 1000U))
+	  {	  // One second timer for DHCP
+		  DHCP_time_handler();
+	  }
+  }
+
   /* USER CODE END Callback 1 */
 }
Index: ctrl/firmware/Main/CubeMX/Core/Src/spi.c
===================================================================
--- ctrl/firmware/Main/CubeMX/Core/Src/spi.c	(revision 77)
+++ ctrl/firmware/Main/CubeMX/Core/Src/spi.c	(revision 78)
@@ -44,8 +44,8 @@
   hspi2.Init.Direction = SPI_DIRECTION_2LINES;
   hspi2.Init.DataSize = SPI_DATASIZE_8BIT;
-  hspi2.Init.CLKPolarity = SPI_POLARITY_LOW;
-  hspi2.Init.CLKPhase = SPI_PHASE_1EDGE;
+  hspi2.Init.CLKPolarity = SPI_POLARITY_HIGH;
+  hspi2.Init.CLKPhase = SPI_PHASE_2EDGE;
   hspi2.Init.NSS = SPI_NSS_SOFT;
-  hspi2.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2;
+  hspi2.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_256;
   hspi2.Init.FirstBit = SPI_FIRSTBIT_MSB;
   hspi2.Init.TIMode = SPI_TIMODE_DISABLE;
@@ -60,5 +60,5 @@
   hspi2.Init.MasterInterDataIdleness = SPI_MASTER_INTERDATA_IDLENESS_01CYCLE;
   hspi2.Init.MasterReceiverAutoSusp = SPI_MASTER_RX_AUTOSUSP_DISABLE;
-  hspi2.Init.MasterKeepIOState = SPI_MASTER_KEEP_IO_STATE_DISABLE;
+  hspi2.Init.MasterKeepIOState = SPI_MASTER_KEEP_IO_STATE_ENABLE;
   hspi2.Init.IOSwap = SPI_IO_SWAP_DISABLE;
   if (HAL_SPI_Init(&hspi2) != HAL_OK)
