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

 
 
> 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
Ответов
Димон Безпарольн...
сообщение Jun 12 2016, 18:10
Сообщение #2


Знающий
****

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



И правда Ваша. Второй случай когда HAL заработал почти сразу. Спасибо.

Сообщение отредактировал Димон Безпарольный - Jun 12 2016, 18:28
Go to the top of the page
 
+Quote Post
Allregia
сообщение Jun 19 2016, 09:55
Сообщение #3


Профессионал
*****

Группа: Свой
Сообщений: 1 047
Регистрация: 28-06-07
Из: Israel
Пользователь №: 28 763



Цитата(Димон Безпарольный @ Jun 12 2016, 19:10) *
И правда Ваша. Второй случай когда HAL заработал почти сразу. Спасибо.


SPI через HAL да, работает сразу, но мееедлееееннннооооо........

Особенно, с софтовым CS!

Если делать:
Код
HAL_GPIO_WritePin(CS_GPIO_Port, CS_Pin, GPIO_PIN_RESET);
HAL_SPI_TransmitReceive(&hspi1, (u8 *)&d, (u8 *)&d1,1,100);
HAL_GPIO_WritePin(CS_GPIO_Port, CS_Pin, GPIO_PIN_SET);


то на F103 при 36Мгц это происходит 12 микросекунд при частоте SPI 4.5Mhz и 16-битной передаче.
Причем, после установки 0 на CS, проходит куча времени, потом корткая пачка импульсов, потом опять длиная пауpа переl снятием CS.

Если же сделать так:
Код
HAL_GPIO_WritePin(CS_GPIO_Port, CS_Pin, GPIO_PIN_RESET);
  hspi1.Instance->DR = d;
    while(__HAL_SPI_GET_FLAG(&hspi1, SPI_FLAG_RXNE) == RESET);
    d = hspi1.Instance->DR;
HAL_GPIO_WritePin(CS_GPIO_Port, CS_Pin, GPIO_PIN_SET);


то время передачи(от \_ до _/ на CS) уменьшается вдвое!

(да, можно конечно и управление CS заменить на прямое, вместо вызова халовской функции, но это практически ничего по скорости не дает, как ит замена HAL_SPI_GET_FLAG на прямое чтение флага. А вот замена hspi1.Instance->DR на SPI1->DR экономит еще микросекунду!)
Go to the top of the page
 
+Quote Post



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

 


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


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