Принцип работы:
Ведущий передает 2 байта ведомому. Ведомый получает эти байты и сравнивает их, если они совпадает по условию он посылает ответ. В противном случае ответ не посылается. Полученные 2 байта записываются в порт В. Ведущий получает ответ и записывает в порт В.
Проблема заключается в том что они получая пакет при любых значениях записывают в потр 0xFFFF, если связь разорвать они также записывают в порт 0хFFFF.
Почоже, что флаг SPITBF устанавливается как только последний байт для передачи записан в SPI1SR, что происходит до окончания его передачи. Попробуйте отслеживать конец передачи по флагу SPIRBF в цикле while. Зачем инструкция "SPI1CON2 = 1;" ? Бит 0 в регистре SPI1CON2 не задействован.
Большая ширина SS функционированию не мешает. Однако, если хотите её уменьшить, то можно:
1. Тактировать МК на большей частоте по сравнению с тактированием модуля SPI
2. Заказать оптимизацию кода в компиляторе, надеясь, что он "inline" вызов функции WriteSPI1(0xF1F2). Или вместо вызова этой функции сами напишите просто SPI1BUF=0xF1F2;
3. Вместо while цикла использовать обработчик прерываний от SPI.
4. Программировать критичные по времени фрагменты кода на АСМе.
Да, в errata не заглядывал. Теперь буду, спасибо за наводку.
Но, это не к моему МК.
К моему вот: http://ww1.microchip.com/downloads/en/D ... 00504g.pdf
И таv проблемы с модулем SPI нет. Тем не менее, описанные советы попробовал.
В общем, некий прогресс есть. После того как установил
Но вылезла другая проблема - запись в SPI1BUF происходит с ошибками, раза 4 из 10 пишется не корректное число вместо необходимой константы. Добавлял задержки после записи и проверки флага SPI1IF - не помогает. Интересно, что флаг SPI1IF устанавливается в любом случае, даже если значение SPI1BUF не меняется после записи в него.
По SPI - посмотрите этот pdf.
У Microchip-а, как правило, мало информации в основном pdf-е. По периферии они выкладывают отдельные Reference Manual.
----
P.S.
Извините, "Си" не знаю, поэтому по вашей программе ничего подсказать не смогу.
Я пишу программы на ASM30.
У него в исходнике собственно на Си ничего и не написано.
Потому понятно и без знаний этого языка.
Единственная особенность Си компилятора у 24/33-х - это структуры для обращения к битам или группам бит.
Выглядит как
<ИмяРегистра>bits.<имяБита/группыБит>
Объявление структур регистров специального назначения есть в хедере контроллера под Си (h-файл).
Последний раз редактировалось КРАМ Ср сен 02, 2015 15:27:51, всего редактировалось 1 раз.
C SPI у PIC24FJ64GB004 (работа по SPI одна и та же), под которого я сейчас пишу программу, никаких проблем нет.
Работаю с OLED с контроллером SSD1306 (общение по SPI).
С низшим приоритетом, подпрограмма (когда ей выделяется время) "сливает" VideoRam в OLED "по кругу". Никаких ошибок нет.
Фото моей платы:
Спойлер
и схема без номиналов (в прикреплённом файле).
Можете более конкретно объяснить в чём был глюк?
Я работаю, в основном, с PIC24F и PIC24H в MPLAB+ICD3 и не замечал никаких проблем (учитывая информацию из Errata).
/Протезом не пользуюсь/.
При записи данных в SPIxBUF при отладке PICKIT3 в самом регистре SPIxBUF ничего не появляется (0х00), как будто бы запись не прошла. Однако реально всё отправляется корректно. В случае приёма данных в SPIxBUF всё отображается корректно.
Roman Venom писал(а):При записи данных в SPIxBUF при отладке PICKIT3 в самом регистре SPIxBUF ничего не появляется (0х00), как будто бы запись не прошла.....
Правильно, значение регистра SPIxBUF он вам и не должен сразу показать, поскольку вы имеете право считать его значение только по окончании передачи/приёма байта. Во время передачи не надо пытаться считывать его значение.
Roman Venom писал(а):При записи данных в SPIxBUF при отладке PICKIT3 в самом регистре SPIxBUF ничего не появляется (0х00), как будто бы запись не прошла.
А там и на самом деле ничего не появляется. Точнее появляется и тут же сбрасывается в регистр сдвига SPIxSR, программного доступа к которому нет.
Вы ищите черную кошку в темной комнате...
По сути на передаче как такового буферного регистра нет.