Проблемы с HAL уже обсуждались, но у меня немного другая, так что открыл новую тему.
Имеется STM32F070 и делаю SPI на HAL. (Нахально?)
Задача вроде не хитрая. Обмен с чипом SI4432 всегда по 2 байта. В режиме 8 бит NSS дергался между байтами, так что сделал управление по GPIO. Так проще.
И все бы ничего, по осциллографу картинка идеальная. А дальше вылезла проблема. Когда чтение происходило из (внешнего) прерывания, по осциллографу картинка все так же хороша, а читаются нули. Отладчик показал, что в DRA лежит правельный байт и уровень FIFO выше 0.
Код
uint8_t
extIntSpiReadReg (U8 reg){
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET);
spi_buf_out[0] = reg & 0x7f; // MSB first
spi_buf_out[1] = 0; // ignored
HAL_SPI_TransmitReceive(&hspi1, (uint8_t *)&spi_buf_out,(uint8_t *) &spi_buf_in, 2,10);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET);
return spi_buf_in[1];
}
После долгих мучений попробовал по простому (в 16 битном режиме):
Код
uint16_t ReadSPI(uint8_t addr){
uint16_t val;
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET); // SPI active
while((SPI1->SR & SPI_SR_TXE) == 0); // wait for TX empty
SPI1->DR = (uint16_t)(addr << 8);
while(SPI1->SR & SPI_SR_BSY); // wait for TX empty
while((SPI1->SR & SPI_SR_RXNE) == 0); // wait for RX
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET); // SPI not active
val = SPI1->DR;
return val;
}
Вопрос к знатокам: почему HAL так странно себя ведет? Что не так делаю?