реклама на сайте
подробности

 
 
> STM32F070, SPI, HAL проблемы
alexf
сообщение Oct 3 2016, 20:54
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 420
Регистрация: 22-12-04
Пользователь №: 1 608



Проблемы с 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 так странно себя ведет? Что не так делаю?
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 16:27
Рейтинг@Mail.ru


Страница сгенерированна за 0.01399 секунд с 7
ELECTRONIX ©2004-2016