Это у вас ошибочка. Вы ждёте лишнего следующего символа. Нет у периферии такой памяти, чтобы задержать
сигнал на на кучу тактов. Вы просто промахиваетесь с приёмом. Или
пропускаете бит байт (тогда будет поднят флаг оверфлоу, проверьте), или принимаете
и упускаете один, а потом ждёте лишнего. Попробуйте делать передачу нужного количества байт по TXE, как обычно. А приём в прерываниях с RXNE. И просто передавайте нужное количество байт, а приём пусть разгребает сколько придёт. Затем, после передачи всех нужных байт, ждёте падения BSY и забираете всё, что "упало" в буфер приёма.
Рекомендую так же, перед или после транзакции, сбрасывать ошибки (вдруг шальная залетит) последовательностью: сначала чтение регистра статуса затем чтение регистра данных. Можно даже просто обращением к ним, без анализа:
SPI1->SR;
SPI1->DR;
Всё. Это гарантирует, что даже если произошёл сбой по линии CLK и залетел лишний символ, интерфейс не зависнет в ошибке.
P.S. Если, вдруг, у вас и передача по прерываниям, то проверяйте RXNE и в начале, и в конце обработчика. Чтобы не упустить байт. Такое становится возможным при большой нагрузке на МК.