Что-то я совсем запутался

Некий прогресс есть, хоть и неполный.
1. Переписал инициализацию на регистрах:
Код
CLEAR_BIT( SPI_PORT->CR1, SPI_CR1_SPE); // Disable SPI
SPI_PORT -> CR1 = SPI_CR1_SSI; // SSI := 1
SPI_PORT -> CR2 = 0x0;
SPI_PORT -> CFG1 = SPI_CFG1_MBR | SPI_CFG1_DSIZE_2 | SPI_CFG1_DSIZE_1 | SPI_CFG1_DSIZE_0; // MBR = 7 - clock/256; DSIZE = 0111 - 8 bit/frame
SPI_PORT -> CFG2 = SPI_CFG2_AFCNTR | SPI_CFG2_SSM | SPI_CFG2_CPOL | SPI_CFG2_CPHA | SPI_CFG2_MASTER;
// Enable SPI peripheral
SET_BIT( SPI_PORT->CR1, SPI_CR1_SPE);
работает, проблем пока вроде не заметил, если так можно выразиться в свете нижеследующих пунктов....
от хала оставил только вот это
hnucleo_Spi.Instance = SPI_PORT;
hnucleo_Spi.State = HAL_SPI_STATE_READY;
потому что без него отправка байтов халовской функцией подыхает на взлёте.
Инит пинов SPI оставил пока на хале, дабы резать колбасу по кусочкам:
Код
// SPI pins
GPIO_InitStruct.Pin = GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
// GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF5_SPI1;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
2. Дисплей пока отключил, убрал в сторонку, не дорос я до него

. Замкнул MISO-MOSI проводком, т.е. просто эхо.
Пытаюсь передать байт:
хал:
Код
// Чтение/запись байта SPI
uint8_t ili9162_sendByte ( uint8_t data_out )
{
uint8_t data_in;
HAL_StatusTypeDef status = HAL_SPI_TransmitReceive(&hnucleo_Spi, &data_out, &data_in, 1, 1000);
return data_in;
Байт по кольцу гоняет, т.е. возвращает то, что я и отправляю. Типа нормально.
закомментариваю хал, пишу на регистрах:
Код
// Чтение/запись байта SPI
uint8_t ili9162_sendByte ( uint8_t data_out )
{
uint8_t data_in;
MODIFY_REG(SPI_PORT->CR2, SPI_CR2_TSIZE, 1);
// Передача
while ( !( SPI_PORT -> SR & SPI_SR_TXP ) );
*((__IO uint8_t *)&SPI1->TXDR) = data_out;
SET_BIT ( SPI_PORT->CR1, SPI_CR1_CSTART );
// Приём
while ((SPI1->SR & (SPI_SR_RXWNE | SPI_SR_RXPLVL)) == 0);
data_in = *((__IO uint8_t *)&SPI_PORT->RXDR);
return data_in;
2 байта передаёт-принимает нормально, на третьем виснет на условии приёма.
Единственное отличие здесь от хала это то, что HAL_SPI_TransmitReceive постоянно включает/выключает SPI и MODIFY_REG(SPI1->CR2, SPI_CR2_TSIZE, Size); делает при выключенном SPI.
Неужели это необходимо?
Попробовал включать-выключать SPI - стало ещё хуже - один байт передал и завис ..
3. К слову о периферийных SPI-девайсах. Тут вообще всё плачевно.
Вышеупоминавшийся дисплей вообще не инитится, пробовал подключать датчик BME280 (SPI интерфейс) - вместо ID (который равен 60h) читает одни нули, хотя на всяких там F1/F4 как положено 60h и датчик работает с песнями.
Эта хрень даже с халовской HAL_SPI_TransmitReceive, которая эхо исправно делает.
Помогите разобраться плиз. Такое чувство, что я где-то на одни и те же грабли наступаю ...
Рабочий драйвер для BME280 (SPI) могу выложить если кому интересно. По I2C я его ни разу нигде не запускал, пока не нужно.
Код уважаемого
Genadi Zawidowski смотрел, но, видимо, чего-то недопонял, т.к. тоже повис на приёме байта если правильно помню

.
Чтобы возить такого пассажира, необходим лимузин другого класса.
(с) Мария Эдуарда