1921ВК035 (общие вопросы)

32-разрядные микроконтроллеры разработки АО "НИИЭТ"

Модераторы: ea, dav, bkolbov, Alis, pip, _sva_

ches
Сообщения: 58
Зарегистрирован: 07 сен 2022, 17:08
Предприятие: АО НИИЭТ
Откуда: Воронеж

Re: Тактирование SPI

Сообщение ches »

Vey_Shi писал(а): 19 мар 2024, 16:55 По SPI подключил внешнюю flash-память. Прикрепляю полученную осциллограмму: первый канал - TX, второй - RX. Очень смущают уровни сигналов и форма ответа.
Также, на всякий случай, прикреплю схему подключения внешних устройств по SPI (микроконтроллер в режиме мастер).
| Показать
Master.png
Master.png (21.11 КБ) 1127 просмотров
Аватара пользователя
Vey_Shi
Сообщения: 22
Зарегистрирован: 19 окт 2023, 12:29
Предприятие: АО НИТИ Авангард
Откуда: Санкт-Петербург

Re: Тактирование SPI

Сообщение Vey_Shi »

ches писал(а): 20 мар 2024, 08:50 Здравствуйте! Вероятнее всего, на линии сигналов RX и TX оказывается внешнее воздействие. Попробуйте снять осцилограмму сигналов TX и SCK при отключенной микросхеме внешней памяти, чтобы исключить внешнее воздействие.
На линии RX и TX отсутствует дополнительная обвязка между ногами контроллера и микросхемы памяти. Выходит, что воздействие может оказывать только сама память?

Прикрепляю осциллограмму сигналов ТХ (канал 1) и SCK (канал 2) при отключенной внешней памяти.
DS0000.jpg
DS0000.jpg (38.29 КБ) 1101 просмотр
Те же сигналы, но при подключенной внешней памяти:
DS0001.jpg
DS0001.jpg (39.12 КБ) 1101 просмотр
И RX (канал 1) и SCK (канал 2) при подключенной внешней памяти:
DS0002.jpg
DS0002.jpg (40.94 КБ) 1101 просмотр

Веерный Игорь
инженер-программист
АО НИТИ Авангард
ches
Сообщения: 58
Зарегистрирован: 07 сен 2022, 17:08
Предприятие: АО НИИЭТ
Откуда: Воронеж

Re: Тактирование SPI

Сообщение ches »

Vey_Shi писал(а): 21 мар 2024, 09:17 На линии RX и TX отсутствует дополнительная обвязка между ногами контроллера и микросхемы памяти. Выходит, что воздействие может оказывать только сама память?
Прикрепляю осциллограмму сигналов ТХ (канал 1) и SCK (канал 2) при отключенной внешней памяти.
Добрый день! Судя по осциллограмме, амплитуда сигнала на выводах микроконтроллера в 10 раз меньше, чем должна быть (должна быть 3.3В, а на осцилограмме 0.33В). Для проверки работоспособности выводов можно переключиться в режим GPIO, а затем переключать разные выводы и посмотреть амплитуду (должна быть 3.3В).
Пример кода приведу ниже. Вы можете создать новый проект, или же добавить код в текущий (но тогда временно закомментировать функции, связанные с управлением модулем SPI). На выводах B0, B1, B4, B5, B6, B7 будут одинаковые сигналы (при системной частоте в 80МГц - меандр с частотой 100Гц и амплитудой 3.3В). Вам необходимо проверить, что амплитуда сигнала одинакова на всех выводах.
| Показать
void GpioB_outs_init() //Функция инициализации выводов GPIOB (0,1,4,5,6,7)
{
RCU->HCLKCFG_bit.GPIOBEN = 1;
RCU->HRSTCFG_bit.GPIOBEN = 1;
GPIOB->DENSET = GPIO_DENSET_PIN0_Msk | GPIO_DENSET_PIN1_Msk |
GPIO_DENSET_PIN4_Msk | GPIO_DENSET_PIN5_Msk |
GPIO_DENSET_PIN6_Msk | GPIO_DENSET_PIN7_Msk;
GPIOB->OUTENSET = GPIO_OUTENSET_PIN0_Msk | GPIO_OUTENSET_PIN1_Msk |
GPIO_OUTENSET_PIN4_Msk | GPIO_OUTENSET_PIN5_Msk |
GPIO_OUTENSET_PIN6_Msk | GPIO_OUTENSET_PIN7_Msk;
}


while (1) { //Основной цикл
uint32_t i = 100000;
while(i) i--;
GPIOB->DATAOUTTGL = GPIO_DATAOUTTGL_PIN0_Msk | GPIO_DATAOUTTGL_PIN1_Msk |
GPIO_DATAOUTTGL_PIN4_Msk | GPIO_DATAOUTTGL_PIN5_Msk |
GPIO_DATAOUTTGL_PIN6_Msk | GPIO_DATAOUTTGL_PIN7_Msk;
};
Аватара пользователя
Vey_Shi
Сообщения: 22
Зарегистрирован: 19 окт 2023, 12:29
Предприятие: АО НИТИ Авангард
Откуда: Санкт-Петербург

Re: Тактирование SPI

Сообщение Vey_Shi »

ches писал(а): 21 мар 2024, 12:18 Добрый день! Судя по осциллограмме, амплитуда сигнала на выводах микроконтроллера в 10 раз меньше, чем должна быть (должна быть 3.3В, а на осцилограмме 0.33В). Для проверки работоспособности выводов можно переключиться в режим GPIO, а затем переключать разные выводы и посмотреть амплитуду (должна быть 3.3В).
Пример кода приведу ниже. Вы можете создать новый проект, или же добавить код в текущий (но тогда временно закомментировать функции, связанные с управлением модулем SPI). На выводах B0, B1, B4, B5, B6, B7 будут одинаковые сигналы (при системной частоте в 80МГц - меандр с частотой 100Гц и амплитудой 3.3В). Вам необходимо проверить, что амплитуда сигнала одинакова на всех выводах.
Попробовал Ваш код. Работать с регистром DATAOUTTGL хронически не выходит. Ещё при первых тестах в VectorIDE мигать диодами через него не удавалось. Поэтому для проверки переписал стандартный пример led_run из plib035 c конфигурацией на младшем байте GPIOB. Вижу меандр со сдвигом по фазе на всех выводах. Амплитуда на всех восьми выводах В0-В7 составляет 330 мВ.

Веерный Игорь
инженер-программист
АО НИТИ Авангард
ches
Сообщения: 58
Зарегистрирован: 07 сен 2022, 17:08
Предприятие: АО НИИЭТ
Откуда: Воронеж

Re: Тактирование SPI

Сообщение ches »

Vey_Shi писал(а): 21 мар 2024, 15:08 Попробовал Ваш код. Работать с регистром DATAOUTTGL хронически не выходит. Ещё при первых тестах в VectorIDE мигать диодами через него не удавалось. Поэтому для проверки переписал стандартный пример led_run из plib035 c конфигурацией на младшем байте GPIOB. Вижу меандр со сдвигом по фазе на всех выводах. Амплитуда на всех восьми выводах В0-В7 составляет 330 мВ.
Возможно мы с Вами не верно интерпретируем результат, полученный на осциллографе. Попробуйте тогда не переключать, а установить уровень логической единицы на этих же выводах с помощью регистра DATAOUTSET и измерьте напряжение мультиметром.
Sanek
Сообщения: 59
Зарегистрирован: 29 окт 2013, 23:38
Предприятие: НИИЭТ
Откуда: Воронеж

Re: 1921ВК035 (общие вопросы)

Сообщение Sanek »

Амплитуда на всех восьми выводах В0-В7 составляет 330 мВ.
Рискну предположить, что 100 мВ - это уровень "0" сигналов на первом и втором канале. А уровень "1" равен 3,3 В, то есть 1В/клетка
Аватара пользователя
Vey_Shi
Сообщения: 22
Зарегистрирован: 19 окт 2023, 12:29
Предприятие: АО НИТИ Авангард
Откуда: Санкт-Петербург

Re: 1921ВК035 (общие вопросы)

Сообщение Vey_Shi »

Да, коллеги, каюсь. Дело, действительно, было в измерениях. В делителе щупа осциллографа. Спасибо за помощь. Теперь сигналы SCK и TX выглядят прилично. Но при подключении памяти на линиях TX и RX вешается стабильные 3,3 В - никаких сигналов на том же примере не наблюдается. По всей видимости, какой-то хаос привносит микросхема внешней памяти.

Веерный Игорь
инженер-программист
АО НИТИ Авангард
ches
Сообщения: 58
Зарегистрирован: 07 сен 2022, 17:08
Предприятие: АО НИИЭТ
Откуда: Воронеж

Re: 1921ВК035 (общие вопросы)

Сообщение ches »

Vey_Shi писал(а): 21 мар 2024, 16:43 Да, коллеги, каюсь. Дело, действительно, было в измерениях. В делителе щупа осциллографа. Спасибо за помощь. Теперь сигналы SCK и TX выглядят прилично. Но при подключении памяти на линиях TX и RX вешается стабильные 3,3 В - никаких сигналов на том же примере не наблюдается. По всей видимости, какой-то хаос привносит микросхема внешней памяти.
Добрый день! Изучив внимательнее файл at93c46.c обнаружил, что, похоже, линия CS управляется не корректно (рецессивное состояние низкий уровень, а доминантное - высокий, должно быть наоборот). Вероятнее всего ошибка перетекла из проекта под другой микроконтроллер, где управление выводом осуществляется обратным способом.
Для исправления ошибки, чтобы линия CS (вывод GPIOB4) имела доминантный низкий уровень при обращении к микросхеме внешней памяти, необходимо откорректировать функции SetCS() и ClrCS(), а именно поменять местами строки внутри функций, а также в конце функции AT93C46_Init() вызвать функцию ClrCS() для установления высокого уровня на линии CS в начале работы модуля SPI. Код с исправлениями прилагаю ниже.
| Показать

Код: Выделить всё

__STATIC_INLINE void SetCS(void)
{
  GPIOB->DATAOUTCLR = GPIO_DATAOUTCLR_PIN4_Msk;
}

__STATIC_INLINE void ClrCS()
{
  GPIOB->DATAOUTSET = GPIO_DATAOUTSET_PIN4_Msk;
}

void AT93C46_Init()
{
    RCU->SPICFG_bit.CLKSEL = RCU_SPICFG_CLKSEL_PLLCLK;
    RCU->SPICFG_bit.CLKEN = 1;
    RCU->SPICFG_bit.RSTDIS = 1;

    SPI->CPSR_bit.CPSDVSR = 50;
    SPI->CR0_bit.SCR = 9; // SCK=100MHz/((9+1)*50)=200kHz
    SPI->CR0_bit.FRF = SPI_CR0_FRF_SPI;
    SPI->CR0_bit.DSS = SPI_CR0_DSS_16bit;
    SPI->CR1_bit.SSE = 1;

    RCU->HCLKCFG_bit.GPIOBEN = 1;
    RCU->HRSTCFG_bit.GPIOBEN = 1;
    //IO config
    GPIOB->ALTFUNCSET = (GPIO_ALTFUNCSET_PIN5_Msk |
                         GPIO_ALTFUNCSET_PIN6_Msk |
                         GPIO_ALTFUNCSET_PIN7_Msk);
    GPIOB->OUTENSET = GPIO_OUTENSET_PIN4_Msk;
    GPIOB->DENSET = (GPIO_DENSET_PIN4_Msk | // CS
                     GPIO_DENSET_PIN5_Msk | // SCK
                     GPIO_DENSET_PIN6_Msk | // RX
                     GPIO_DENSET_PIN7_Msk); // TX

    EnableDelay();
    ClrCS();
}
Аватара пользователя
Vey_Shi
Сообщения: 22
Зарегистрирован: 19 окт 2023, 12:29
Предприятие: АО НИТИ Авангард
Откуда: Санкт-Петербург

Re: 1921ВК035 (общие вопросы)

Сообщение Vey_Shi »

ches писал(а): 22 мар 2024, 08:50 Добрый день! Изучив внимательнее файл at93c46.c обнаружил, что, похоже, линия CS управляется не корректно (рецессивное состояние низкий уровень, а доминантное - высокий, должно быть наоборот). Вероятнее всего ошибка перетекла из проекта под другой микроконтроллер, где управление выводом осуществляется обратным способом.
Для исправления ошибки, чтобы линия CS (вывод GPIOB4) имела доминантный низкий уровень при обращении к микросхеме внешней памяти, необходимо откорректировать функции SetCS() и ClrCS(), а именно поменять местами строки внутри функций, а также в конце функции AT93C46_Init() вызвать функцию ClrCS() для установления высокого уровня на линии CS в начале работы модуля SPI. Код с исправлениями прилагаю ниже.
Благодарю. Замены кода выполнил. Теперь сигнал выбора чипа CS ведёт себя так, как обозначено в документации на память. Запрашиваю ID, пытаюсь осуществить запись/чтение/стирание. Но сигналы с памяти не радуют - на линии RX как будто просто искаженная суперпозиция сигналов SCK и TX (колебания у уровня 3,3 В). Линии TX и RX подключены напрямую к пинам SPI_SO и SPI_SI памяти Возможно, сможете предположить, в чём причина такого поведения?
| Показать
Осциллограмма сигналов RХ (канал 1) и SCK (канал 2) при подключенной внешней памяти.
20240328_155921.jpg
20240328_155921.jpg (5.42 МБ) 903 просмотра
Осциллограмма сигналов RХ (канал 1) и ТХ (канал 2) при подключенной внешней памяти.
20240328_152801.jpg
20240328_152801.jpg (4.25 МБ) 903 просмотра

Веерный Игорь
инженер-программист
АО НИТИ Авангард
ches
Сообщения: 58
Зарегистрирован: 07 сен 2022, 17:08
Предприятие: АО НИИЭТ
Откуда: Воронеж

Re: 1921ВК035 (общие вопросы)

Сообщение ches »

Vey_Shi писал(а): 28 мар 2024, 16:06 Благодарю. Замены кода выполнил. Теперь сигнал выбора чипа CS ведёт себя так, как обозначено в документации на память. Запрашиваю ID, пытаюсь осуществить запись/чтение/стирание. Но сигналы с памяти не радуют - на линии RX как будто просто искаженная суперпозиция сигналов SCK и TX (колебания у уровня 3,3 В). Линии TX и RX подключены напрямую к пинам SPI_SO и SPI_SI памяти Возможно, сможете предположить, в чём причина такого поведения?
Здравствуйте! Сигнал на линии RX скорее похож не на сигнал, а на помехи. Фактически на линии держится уровень 3.3В (с небольшими помехами).
Я бы начал с проверки подключения к микросхеме внешней памяти. Проверьте, нет ли замыкания между сигнальными линиями или питанием.
Вывод Tx должен быть подключен к выводу MOSI (в даташите на микросхему может быть обозначен как SI - Serial Data Input).
Вывод Rx должен быть подключен к выводу MISO (может быть обозначен как SO - Serial Data Output).
А какую микросхему внешней памяти используете?
| Показать
Master.png
Master.png (21.11 КБ) 873 просмотра
Ответить

Вернуться в «32-разрядные микроконтроллеры»