OpenSPI1 (SPICON1Value, SPICON2Value, SPISTATValue);// setting end, SPI on
//Oscillator
}
Принцип работы: Ведущий передает 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. Программировать критичные по времени фрагменты кода на АСМе.
#pragma config WPDIS = WPDIS // Segment Write Protection Disable->Segmented code protection is disabled #pragma config WPFP = WPFP255 // Write Protection Flash Page Segment Boundary->Highest Page (same as page 170) #pragma config WUTSEL = LEG // Voltage Regulator Wake-up Time Select->Default regulator start-up time is used #pragma config WPEND = WPENDMEM // Segment Write Protection End Page Select->Protected code segment upper boundary is at the last page of program memory; the lower boundary is the code page specified by WPFP #pragma config WPCFG = WPCFGDIS // Write Protect Configuration Page Select->Last page (at the top of program memory) and Flash Configuration Words are not write-protected #pragma config SOSCSEL = SOSC // Secondary Oscillator Power Mode Select->Secondary oscillator is in Default (high drive strength) Oscillator mode #pragma config ALTPMP = ALPMPDIS // Alternate PMP Pin Mapping->EPMP pins are in default location mode
// CONFIG2 #pragma config IESO = ON // Internal External Switchover->IESO mode (Two-Speed Start-up) is enabled #pragma config IOL1WAY = ON // IOLOCK One-Way Set Enable->The IOLOCK bit (OSCCON<6>) can be set once, provided the unlock sequence has been completed. Once set, the Peripheral Pin Select registers cannot be written to a second time. #pragma config FNOSC = FRCDIV // Initial Oscillator Select->Fast RC Oscillator with Postscaler (FRCDIV) #pragma config PLL96MHZ = ON // 96MHz PLL Startup Select->96 MHz PLL is enabled automatically on start-up #pragma config PLLDIV = DIV12 // 96 MHz PLL Prescaler Select->Oscillator input is divided by 12 (48 MHz input) #pragma config POSCMOD = NONE // Primary Oscillator Select->Primary oscillator is disabled #pragma config OSCIOFNC = OFF // OSCO Pin Configuration->OSCO/CLKO/RC15 functions as CLKO (FOSC/2) #pragma config FCKSM = CSDCMD // Clock Switching and Fail-Safe Clock Monitor->Clock switching and Fail-Safe Clock Monitor are disabled
// CONFIG1 #pragma config WDTPS = PS32768 // Watchdog Timer Postscaler->1:32,768 #pragma config ICS = PGx1 // Emulator Pin Placement Select bits->Emulator functions are shared with PGEC1/PGED1 #pragma config FWPSA = PR128 // WDT Prescaler->Prescaler ratio of 1:128 #pragma config WINDIS = OFF // Windowed WDT->Standard Watchdog Timer enabled,(Windowed-mode is disabled) #pragma config GWRP = OFF // General Segment Write Protect->Writes to program memory are allowed #pragma config GCP = OFF // General Segment Code Protect->Code protection is disabled #pragma config FWDTEN = ON // Watchdog Timer->Watchdog Timer is enabled #pragma config JTAGEN = ON // JTAG Port Enable->JTAG port is enabled
Да, в errata не заглядывал. Теперь буду, спасибо за наводку. Но, это не к моему МК. К моему вот: http://ww1.microchip.com/downloads/en/D ... 00504g.pdf И таv проблемы с модулем SPI нет. Тем не менее, описанные советы попробовал.
В общем, некий прогресс есть. После того как установил
Код:
SPI1CON2bits.SPIBEN=0;
//enhanced buffer off
Флаг прерывания SPI1IF начал устанавливаться.
Но вылезла другая проблема - запись в 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 всё отображается корректно.
При записи данных в SPIxBUF при отладке PICKIT3 в самом регистре SPIxBUF ничего не появляется (0х00), как будто бы запись не прошла.....
Правильно, значение регистра SPIxBUF он вам и не должен сразу показать, поскольку вы имеете право считать его значение только по окончании передачи/приёма байта. Во время передачи не надо пытаться считывать его значение.
При записи данных в SPIxBUF при отладке PICKIT3 в самом регистре SPIxBUF ничего не появляется (0х00), как будто бы запись не прошла.
А там и на самом деле ничего не появляется. Точнее появляется и тут же сбрасывается в регистр сдвига SPIxSR, программного доступа к которому нет. Вы ищите черную кошку в темной комнате... По сути на передаче как такового буферного регистра нет.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 7
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения