Vey_Shi писал(а): ↑19 мар 2024, 16:55
По SPI подключил внешнюю flash-память. Прикрепляю полученную осциллограмму: первый канал - TX, второй - RX. Очень смущают уровни сигналов и форма ответа.
Также, на всякий случай, прикреплю схему подключения внешних устройств по SPI (микроконтроллер в режиме мастер).
ches писал(а): ↑20 мар 2024, 08:50
Здравствуйте! Вероятнее всего, на линии сигналов RX и TX оказывается внешнее воздействие. Попробуйте снять осцилограмму сигналов TX и SCK при отключенной микросхеме внешней памяти, чтобы исключить внешнее воздействие.
На линии RX и TX отсутствует дополнительная обвязка между ногами контроллера и микросхемы памяти. Выходит, что воздействие может оказывать только сама память?
Прикрепляю осциллограмму сигналов ТХ (канал 1) и SCK (канал 2) при отключенной внешней памяти.
DS0000.jpg (38.29 КБ) 1101 просмотр
Те же сигналы, но при подключенной внешней памяти:
DS0001.jpg (39.12 КБ) 1101 просмотр
И RX (канал 1) и SCK (канал 2) при подключенной внешней памяти:
DS0002.jpg (40.94 КБ) 1101 просмотр
Веерный Игорь
инженер-программист
АО НИТИ Авангард
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В). Вам необходимо проверить, что амплитуда сигнала одинакова на всех выводах.
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 мВ.
Веерный Игорь
инженер-программист
АО НИТИ Авангард
Vey_Shi писал(а): ↑21 мар 2024, 15:08
Попробовал Ваш код. Работать с регистром DATAOUTTGL хронически не выходит. Ещё при первых тестах в VectorIDE мигать диодами через него не удавалось. Поэтому для проверки переписал стандартный пример led_run из plib035 c конфигурацией на младшем байте GPIOB. Вижу меандр со сдвигом по фазе на всех выводах. Амплитуда на всех восьми выводах В0-В7 составляет 330 мВ.
Возможно мы с Вами не верно интерпретируем результат, полученный на осциллографе. Попробуйте тогда не переключать, а установить уровень логической единицы на этих же выводах с помощью регистра DATAOUTSET и измерьте напряжение мультиметром.
Да, коллеги, каюсь. Дело, действительно, было в измерениях. В делителе щупа осциллографа. Спасибо за помощь. Теперь сигналы SCK и TX выглядят прилично. Но при подключении памяти на линиях TX и RX вешается стабильные 3,3 В - никаких сигналов на том же примере не наблюдается. По всей видимости, какой-то хаос привносит микросхема внешней памяти.
Веерный Игорь
инженер-программист
АО НИТИ Авангард
Vey_Shi писал(а): ↑21 мар 2024, 16:43
Да, коллеги, каюсь. Дело, действительно, было в измерениях. В делителе щупа осциллографа. Спасибо за помощь. Теперь сигналы SCK и TX выглядят прилично. Но при подключении памяти на линиях TX и RX вешается стабильные 3,3 В - никаких сигналов на том же примере не наблюдается. По всей видимости, какой-то хаос привносит микросхема внешней памяти.
Добрый день! Изучив внимательнее файл at93c46.c обнаружил, что, похоже, линия CS управляется не корректно (рецессивное состояние низкий уровень, а доминантное - высокий, должно быть наоборот). Вероятнее всего ошибка перетекла из проекта под другой микроконтроллер, где управление выводом осуществляется обратным способом.
Для исправления ошибки, чтобы линия CS (вывод GPIOB4) имела доминантный низкий уровень при обращении к микросхеме внешней памяти, необходимо откорректировать функции SetCS() и ClrCS(), а именно поменять местами строки внутри функций, а также в конце функции AT93C46_Init() вызвать функцию ClrCS() для установления высокого уровня на линии CS в начале работы модуля SPI. Код с исправлениями прилагаю ниже.
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 памяти Возможно, сможете предположить, в чём причина такого поведения?
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).
А какую микросхему внешней памяти используете?