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

 
 
> STM32L476 HAL_SPI_TransmitReceive, Что же я всетаки делаю неправильно?
Димон Безпарольн...
сообщение Jun 12 2016, 17:11
Сообщение #1


Знающий
****

Группа: Участник
Сообщений: 734
Регистрация: 29-11-10
Пользователь №: 61 247



Отладил на програмном SPI общение с памятью SPI. Решил попробовать HAL.

Код
unsigned int VF016_SPI_RW(unsigned char Tx)    //
{    Tx = 0x55;                                //
    uint8_t Rx;
    HAL_SPI_TransmitReceive(&hspi1, &Rx, &Tx, 1, 0x1000);
    return (unsigned int)Rx;
}


В итоге на MOSI выдается постоянный 0, SCK выдает исправно 8 тактов. Интерфейс 8-битный.

Настройки HAL:

Код
  hspi1.Instance = SPI1;
  hspi1.Init.Mode = SPI_MODE_MASTER;
  hspi1.Init.Direction = SPI_DIRECTION_2LINES;
  hspi1.Init.DataSize = SPI_DATASIZE_8BIT;
  hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;
  hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;
  hspi1.Init.NSS = SPI_NSS_SOFT;
  hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_32;
  hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
  hspi1.Init.TIMode = SPI_TIMODE_DISABLE;
  hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
  hspi1.Init.CRCPolynomial = 7;
  hspi1.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE;
  hspi1.Init.NSSPMode = SPI_NSS_PULSE_ENABLE;
  HAL_SPI_Init(&hspi1);


Сообщение отредактировал Димон Безпарольный - Jun 12 2016, 17:14
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
AlanDrakes
сообщение Jun 19 2016, 10:30
Сообщение #2


Частый гость
**

Группа: Участник
Сообщений: 101
Регистрация: 2-05-15
Из: Россия, Омск
Пользователь №: 86 474



Тогда уж что мешает сделать ещё оптимизацию?
Код
GPIOx->BSRR = GPIO_BSRR_BR0 // Допустим, 0-й пин - это /CS
SPIx->DR = DataToTransmit
while (!(SPIx->SR & SPI_SR_TXE)); // Ждём, пока буфер отправки не опустеет
while (SPIx->SR & SPI_SR_BSY); // Ждём окончания передачи
GPIOx->BSRR = GPIO_BSRR_BS0 // Поднимаем пин.

И... Ой, а где же собственно, HAL?

По поводу моего кода - явный костыль с парой флагов. Но если убрать один из них - слишком рано снимается /CS. Передаю по 8 бит, вероятно причина именно в этом. В данном случае не принимаю ответа от устройства.

Сообщение отредактировал AlanDrakes - Jun 19 2016, 10:34
Go to the top of the page
 
+Quote Post
Димон Безпарольн...
сообщение Jun 19 2016, 15:23
Сообщение #3


Знающий
****

Группа: Участник
Сообщений: 734
Регистрация: 29-11-10
Пользователь №: 61 247



Цитата(AlanDrakes @ Jun 19 2016, 13:30) *
Тогда уж что мешает сделать ещё оптимизацию?
Код
GPIOx->BSRR = GPIO_BSRR_BR0 // Допустим, 0-й пин - это /CS
SPIx->DR = DataToTransmit
while (!(SPIx->SR & SPI_SR_TXE)); // Ждём, пока буфер отправки не опустеет
while (SPIx->SR & SPI_SR_BSY); // Ждём окончания передачи
GPIOx->BSRR = GPIO_BSRR_BS0 // Поднимаем пин.

И... Ой, а где же собственно, HAL?

По поводу моего кода - явный костыль с парой флагов. Но если убрать один из них - слишком рано снимается /CS. Передаю по 8 бит, вероятно причина именно в этом. В данном случае не принимаю ответа от устройства.

Вот это как раз и был мой вариант. Прелести (у меня ) начались именно на 8 битах. 9-бит - все нормально передается через DMA. У меня дисплей Нокиа 1100 так работает. Но когда я прицепил память 25016 (8 бит передачи), пошла упаковка. Чтоб ее в качель... И на 8 бит у меня передается... 16 циклов. Плюнул пока разбираться, так на Хале и оставил. На Хале почему -то 8 циклов.
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 24th June 2025 - 20:55
Рейтинг@Mail.ru


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