Я работаю над проектом с STM32F303RE, который требует полнодуплексного SPI, и я использую библиотеку HAL, предоставленную STM. Хотя все линии работают с точки зрения SCK, MOSI и MISO, я заметил, что линия выбора микросхемы снижается намного дольше, чем необходимо, и, похоже, срабатывает около 20 кГц, в отличие от 2 МГц SPI. Это проблема, так как ведомое устройство, которое я использую, запускает с линии CS, и во время нескольких вызовов SPI данные становятся поврежденными. Как я могу исправить время?
В настоящее время я использую ручной GPIO, который просто устанавливает низкий / высокий уровень до и после вызова SPI. Из чтения в режиме онлайн кажется, что вывод CS является источником проблем для довольно многих людей, поскольку есть также возможность использовать аппаратный сигнал NSS, хотя люди рекомендуют против этого, поскольку он не работает должным образом.
// Set SS pin low to activate
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET);
// Read Temp
if(HAL_SPI_TransmitReceive(&hspi2, (uint8_t*)&master_buffer_tx[4], (uint8_t*)&master_buffer_rx[4], 1, 1000)!=HAL_OK){
Error_Handler();
}
// Check finished
while(HAL_SPI_GetState(&hspi2) != HAL_SPI_STATE_READY){
}
// Set SS pin high to deactivate
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_SET);
HAL_Delay(10);
Я бы ожидал, что уровень CS снизится примерно на половину цикла до SCK и аналогично после.
Вот возможные идеи, которые у меня были: вызывает ли проблема строка «Проверка завершена»? Это могут быть мои настройки часов? Должен ли используемый мной вывод GPIO быть таким же, как там, где будет NSS? Должен ли я использовать аппаратный NSS? Нужно ли использовать прерывания и DMA?
Извините, если что-то из этого кажется наивным, так как я все еще работаю над пониманием микроконтроллера. Спасибо!
Время CS и SCK