PowerC™ 0 5 июля, 2019 Опубликовано 5 июля, 2019 · Жалоба Здравствуйте, уважаемые коллеги. На руках имеется девайс с указанным в сабже PIC18F87J50 (80 pin). Задача: включить и настроить SPI SLAVE на втором (из двух) канале SPI. Воздействия Master я подаю с крейта NI с плисины. Контроллер самописный, но выдает все верно (проверил осциллографом). По железячной части все хорошо вроде бы. Грешу на код, но не могу понять что не так. Настраиваю SPI slave, задаю назначение входов и выходов, результат - нет ответа от PIC. Код прилагаю: #include <stdio.h> #include <xc.h> #include "pic18f87j50.h" // Set Clock Freq. & Delays #ifndef _XTAL_FREQ #define _XTAL_FREQ 5000000 #endif // ports #define SPI_SCK TRISD6 #define SPI_SDI TRISD5 #define SPI_SDO TRISD4 #define SPI_SS TRISD7 int main(void); int main() { SpiInit(); while(1) { } return 0; } // инициализация SPI-интерфейса int SpiInit(void) { SSP2CON1bits.SSPEN = 0; SSP2CON1bits.SSPM3 = 0; SSP2CON1bits.SSPM2 = 1; SSP2CON1bits.SSPM1 = 0; SSP2CON1bits.SSPM0 = 0; SSP2CON1bits.SSPEN = 0; // Allow Programming of serial port SSP2CON1bits.CKP = 0; // Idle state for clock is a HIGH level SSP2STATbits.CKE = 1; // Transmit occurs on idle to active clock state SSP2STATbits.SMP = 0; // Input data sampled at middle data output time SPI_SCK = 1; SPI_SDI = 1; SPI_SDO = 0; SPI_SS = 1; INTCONbits.GIE = 1; // Global Interrupt Enable bit INTCONbits.PEIE = 1; // Peripheral Interrupt Enable bit PIE3bits.SSP2IE = 1; // SSP interrupt Enabled SSP2CON1bits.SSPEN = 1; return 0; } // обработка прерываний void __interrupt() isr(void) { unsigned char buf = 0; if(PIR3bits.SSP2IF) { while ( !SSP2STATbits.BF ); // Wait for Buffer Empty buf = SSP2BUF; SSP2BUF = buf; PIR3bits.SSP2IF = 0; } } } Пробовал и в SSP2BUF подсовывать константные значения. Частоту SPI (sck) снизил до 100кГц. Ответа - нет. Помогите, коллеги, пожалуйста. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Lmx2315 2 5 июля, 2019 Опубликовано 5 июля, 2019 · Жалоба Вы в прерывание попадаете? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Lmx2315 2 5 июля, 2019 Опубликовано 5 июля, 2019 · Жалоба Если прерывания не работают - сделайте без прерываний: Пусть функция unsigned char spi_data ( unsigned char tx_data ) { char data_read; while ( !SSP2STATbits.BF ); // wait until the all bits received data_read = SSP2BUF; // read the received data from the buffer SSP2BUF = tx_data; // put the data in the SSPBUF register which will get transmitted on master's clock return data_read; } побудет в мэйне , в бесконечном цикле. Прерывания выключите , посмотрите - ловится что-нить , соответственно шлите только один байт. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
PowerC™ 0 8 июля, 2019 Опубликовано 8 июля, 2019 · Жалоба В 05.07.2019 в 21:49, Lmx2315 сказал: Вы в прерывание попадаете? Нет, в прерывание не попадаем... В 05.07.2019 в 22:21, Lmx2315 сказал: Если прерывания не работают - сделайте без прерываний: Сейчас попробуем! Спасибо вам огромное за ответы! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
PowerC™ 0 8 июля, 2019 Опубликовано 8 июля, 2019 (изменено) · Жалоба 34 минуты назад, PowerC™ сказал: Сейчас попробуем! Попробовали. Slave Select - работает, просто не туда подключили сейчас. Получилась следующая, весьма странная осциллограмма. Сигналы сверху вниз: 1. MISO 2. MOSI 3. SCK 4. SS Частота клоков 100кГц. На MOSI задаем число 0х8, в ответ получаем какие-то странные пички синфазно тактовой частоте SPI (SCK) длительностью примерно 2мкс (микросекунды). Также на MOSI виден какой-то странный артефакт в виде небольшой просадки напряжения... Интересно, неправда ли? :) Изменено 8 июля, 2019 пользователем PowerC™ Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 42 8 июля, 2019 Опубликовано 8 июля, 2019 · Жалоба Проверьте ANSEL регистр. По умолчанию, все ножки - аналоговые. Этим регистром ножки SPI надо переключить на цифровые. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
PowerC™ 0 8 июля, 2019 Опубликовано 8 июля, 2019 · Жалоба 6 минут назад, dimka76 сказал: Проверьте ANSEL регистр Спасибо за ответ, Дмитрий. В даташите на сабжевый контроллер нету такого регистра. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 42 8 июля, 2019 Опубликовано 8 июля, 2019 · Жалоба 3 minutes ago, PowerC™ said: В даташите на сабжевый контроллер нету такого регистра. Да, я погорячился. По привычке ))) В каких-то есть, в каких-то нет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Redguy 0 9 июля, 2019 Опубликовано 9 июля, 2019 (изменено) · Жалоба Почему так ? SSP2CON1bits.SSPEN = 0; В разделе 19.3.4 написано: Quote To enable the serial port, MSSP Enable bit, SSPEN (SSPxCON1<5>), must be set. UPD. Ах, да. Позже разглядел включение после всей настройки. Но все равно не понял, зачем два раза сбрасывать бит. Изменено 9 июля, 2019 пользователем Redguy Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
PowerC™ 0 10 июля, 2019 Опубликовано 10 июля, 2019 · Жалоба 16 часов назад, Redguy сказал: Но все равно не понял, зачем два раза сбрасывать бит. Спасибо за ответ! Мы позже убрали эту строку из кода. Ситуация не поменялась. Проблема, видимо, может быть и не софтварной. Честно говоря, я в неловкой растерянности... Будем экспериментировать дальше. Буду держать в курсе событий. Но если кто-то все же будет иметь мысли и идеи для проверок, буду очень признателен. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
PowerC™ 0 10 июля, 2019 Опубликовано 10 июля, 2019 (изменено) · Жалоба Оффтоп :)))) На мотив песни из к/ф "Весна на Заречной улице": Когда сигнал придет - не знаю,Пройдут дожди, сойдут снега...Но ты мне ПЛИСина роднаяИ в непогоду дорога... ...Теперь и сам не рад, что встретил, Моя душа больна тобой... Зачем, зачем на белом свете Есть безответный SPI Изменено 10 июля, 2019 пользователем PowerC™ Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Lmx2315 2 10 июля, 2019 Опубликовано 10 июля, 2019 · Жалоба А у вас какой компилятор под пик? А то видели тему - ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
PowerC™ 0 11 июля, 2019 Опубликовано 11 июля, 2019 · Жалоба 18 часов назад, Lmx2315 сказал: А у вас какой компилятор под пик? Привет, сосед! )))) Компилятор хс8. Сегодня пробуем с18. Также еще смотрим дизассемблер. Ну и в планах написать эспиайную часть кода на ассемблере. Если что-то получится, отпишусь. Кстати, в даташите обнаружен регистр ODCON3 (open drain) для SPI ножек. Попробовал его проинитить разными значениями - результата нет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
PowerC™ 0 17 июля, 2019 Опубликовано 17 июля, 2019 · Жалоба Здравствуйте, уважаемые коллеги и те, кто не был на прошлом занятии. Проблема решена. Все оказалось довольно тривиально: 1. В errata на сабжевый девайс (http://ww1.microchip.com/downloads/en/DeviceDoc/80000481B.pdf) (страница 9) написано следующее важное замечание: Цитата Disabling the MSSP module by clearing the SSPEN bit (SSPxCON1<5>) may not reset the module. It is recommended to clear SSPxSTAT, SSPxCON1 and SSPxCON2 registers and select the mode prior to setting the SSPEN bit to enable the MSSP module 2. Мы пишем прошивку на Си. И заметили, что некоторые самописные функции не работают. Тогда мы использовали атрибут inline, и все наши функции запахали. В итоге остались некоторые мелкие проблемы, но все решаемо. Всем успехов в работе! Надеюсь данный топик кому-то станет полезным, и последователи не потратят столь много времени на решение этой довольно неприятной проблемы. Отдельное спасибо отписавшимся в топике! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
proffy 0 29 января, 2021 Опубликовано 29 января, 2021 · Жалоба А что такое атрибут inline Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться