Pull to refresh

Работа SPI на MIK32 АМУР с платой ELBEAR ACE-UNO ревизии 1.0.1

Reading time3 min
Views821

Здравствуйте все! ✋

При первой же попытке подключить экран ILI9341 по SPI к MIK32 АМУР выявил пару проблем, одна касается библиотеки HAL от Микрона, а вторая касается платы ELBEAR ACE-UNO ревизии 1.0.1 от ELRON.

Для начала поясню, я использую свой Makefile и работаю в VSCode, есть возможность работать с PlatformIO но я ей не пользуюсь. Прошиваю МК через COM-порт, для этого использую бутлоадер и загрузчик от elron.tech.

Для запуска экрана я взял библиотеку которую использовал ранее для работы с МК от Миландр К1986ВК025 (ОКР «Счетчик М»), заменил внутренности функций SPI_Master_Init, SPI_SendData и т.д., взяв их из примера который находится в репозитории Микрона - HAL_SPI_Master.

В их примере идёт передача 20 байт с одновременным приёмом, мне же необходимо передавать побайтово. В этом моменте как раз и появляется ошибка, с которой пришлось немного повозиться. В функции HAL_SPI_Exchange есть метка error, посмотрите пример ниже:

HAL_StatusTypeDef HAL_SPI_Exchange(SPI_HandleTypeDef *hspi, uint8_t TransmitBytes[], uint8_t ReceiveBytes[], uint32_t DataSize, uint32_t Timeout)
{
    HAL_StatusTypeDef error_code = HAL_OK;
    ...
    while ((hspi->TxCount > 0) || (hspi->RxCount > 0))
    {
        ...
        // здесь идёт передача данных
        hspi->Instance->TXDATA = *(hspi->pTxBuffPtr);
        ...
        // тут приём данных
        *(hspi->pRxBuffPtr) = hspi->Instance->RXDATA;
        ...

        if (((timeout_counter++) >= Timeout) || (Timeout == 0U))
        {
            error_code = HAL_TIMEOUT;
            goto error;
        }
    }

error:
    __HAL_SPI_DISABLE(hspi);
    ...

    return error_code;
}

Из этого кода видно что по окончании передачи/приёма данных после цикла while происходит безусловный переход на метку error, что в свою очередь отключает SPI, а если быть точнее то перезапускает потом.

Выявил я эту ошибку при помощи логического анализатора, где был виден разрыв между байтами. Я просто в функции HAL_SPI_Exchange перед меткой error добавил return error_code; и экран отозвался.

    while ((hspi->TxCount > 0) || (hspi->RxCount > 0))
    {
        ...
    }

    return error_code;

error:
    __HAL_SPI_DISABLE(hspi);
    ...

    return error_code;

Я быть может и не писал бы эту статью если бы Микрон в свою очередь был бы по расторопнее и добавил бы мои правки к себе на github. Я им закинул pull request с исправлениями и пояснениями, но они за две недели не отреагировали. И тем более предыдущий pull request от spam-reciever'а висит там уже полтора месяца. Так что эта статья будет ещё долгое время актуальна.

У spam-receiver'а форк библиотеки HAL c исправлениями, качайте её у него и не будет у вас этой проблемы.

Вторая проблема касается платы ELBEAR ACE-UNO ревизии 1.0.1, в следующей ревизии её обещали исправить.

Посмотрите pinout платы на картинке ниже:

Pinout платы rev 1.0.1
Pinout платы rev 1.0.1

На D10 указано PWM/SS, это означает что есть ШИМ и пин используется как SlaveSelect SPI режима и после порта указано NSS1. Так вот, это оказывается не NSS1 а SS_IN - входной сигнал SS для управления МК АМУР по SPI другими устройствами когда МК используется в роли подчинённого. Получается что для управления другими устройствами этот пин не подходит и вообще при попытке использовать 10й пин как GPIO полностью отключает работу SPI.

Вывод, если не используете SPI, то пользуйтесь 10м пином как вам угодно, а если используете SPI, то не трогайте 10й пин. Всё очень просто. Правда для тех кто использует arduino шилды будут некие сложности ведь в основном они для SS используют 10й пин, тогда придётся городить переходник, но это уже совсем другая история. (:

Вот как-то так.

Видео со своими впечатлениями я выложил на свой Ютуб-канал ХуторянинЪ.

Вот ссылка на мой пример работы SPI с экраном ILI9341.

Слава Наша Богам и Предкам!!! ✋

Tags:
Hubs:
+9
Comments3

Articles