11#include "slave.h"
2+ #include "bootloader.h"
23
34extern I2C_HandleTypeDef hi2c1 ;
45
@@ -9,6 +10,9 @@ static uint8_t reg_index = 0; // Current write address
910static uint32_t error = HAL_OK ;
1011static uint8_t error_state = 0 ;
1112
13+ static uint8_t bootloader_magic_buf [4 ] = {0 };
14+ static uint8_t receiving_boot_magic = 0 ; // Set while a BOOTLOADER_TRIGGER_I2C_ADDR write is in flight
15+
1216void Slave_Start (void );
1317
1418/**
@@ -43,7 +47,17 @@ void HAL_I2C_AddrCallback(I2C_HandleTypeDef *hi2c, uint8_t TransferDirection, ui
4347 // Check if master->slave transmission
4448 if (TransferDirection == I2C_DIRECTION_TRANSMIT )
4549 {
46- HAL_StatusTypeDef ret = HAL_I2C_Slave_Seq_Receive_IT (& hi2c1 , & reg_index , 1 , I2C_NEXT_FRAME );
50+ HAL_StatusTypeDef ret ;
51+
52+ // AddrMatchCode is delivered pre-shifted by 1 (same convention as
53+ // Init.OwnAddress1/OwnAddress2), not the raw 7-bit address.
54+ if (AddrMatchCode == (BOOTLOADER_TRIGGER_I2C_ADDR << 1 )) {
55+ receiving_boot_magic = 1 ;
56+ ret = HAL_I2C_Slave_Seq_Receive_IT (& hi2c1 , bootloader_magic_buf , sizeof (bootloader_magic_buf ), I2C_LAST_FRAME );
57+ } else {
58+ ret = HAL_I2C_Slave_Seq_Receive_IT (& hi2c1 , & reg_index , 1 , I2C_NEXT_FRAME );
59+ }
60+
4761 if (ret != HAL_OK ) {
4862 Error_Handler ();
4963 }
@@ -65,6 +79,20 @@ void HAL_I2C_SlaveRxCpltCallback(I2C_HandleTypeDef *hi2c)
6579 return ;
6680 }
6781
82+ if (receiving_boot_magic ) {
83+ receiving_boot_magic = 0 ;
84+
85+ uint32_t magic = ((uint32_t )bootloader_magic_buf [0 ] << 24 )
86+ | ((uint32_t )bootloader_magic_buf [1 ] << 16 )
87+ | ((uint32_t )bootloader_magic_buf [2 ] << 8 )
88+ | (uint32_t )bootloader_magic_buf [3 ];
89+
90+ if (magic == BOOTLOADER_TRIGGER_MAGIC ) {
91+ resetToSystemBootLoader (); // Does not return
92+ }
93+ return ;
94+ }
95+
6896 if (HAL_I2C_Slave_Seq_Receive_IT (hi2c , & register_map [reg_index ++ ], 1 , I2C_NEXT_FRAME ) != HAL_OK ) {
6997 Error_Handler ();
7098 }
@@ -105,9 +133,17 @@ void HAL_I2C_ErrorCallback(I2C_HandleTypeDef *hi2c)
105133 default :
106134 Error_Handler ();
107135 }
108-
136+
109137 hi2c -> ErrorCode = 0 ;
110- Slave_HandleComplete ();
138+
139+ if (receiving_boot_magic ) {
140+ // Truncated bootloader-trigger write; discard it rather than
141+ // let stale reg_index state be mistaken for a completed
142+ // register-map transfer below.
143+ receiving_boot_magic = 0 ;
144+ } else {
145+ Slave_HandleComplete ();
146+ }
111147
112148 Slave_Start ();
113149
0 commit comments