Перейти к содержанию
    

Проблемы с SPI SLAVE на PIC18F87J50

Здравствуйте, уважаемые коллеги.

На руках имеется девайс с указанным в сабже 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кГц.

Ответа - нет.

Помогите, коллеги, пожалуйста.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если прерывания не работают - сделайте без прерываний:

Пусть функция

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;

}

побудет в мэйне , в бесконечном цикле.

Прерывания выключите , посмотрите - ловится что-нить , соответственно шлите только один байт.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

 

В 05.07.2019 в 21:49, Lmx2315 сказал:

Вы в прерывание попадаете?

Нет, в прерывание не попадаем...

 

В 05.07.2019 в 22:21, Lmx2315 сказал:

Если прерывания не работают - сделайте без прерываний:

Сейчас попробуем! 

 

Спасибо вам огромное за ответы!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

34 минуты назад, PowerC™ сказал:

Сейчас попробуем! 

Попробовали. Slave Select - работает, просто не туда подключили сейчас.

Получилась следующая, весьма странная осциллограмма.

Сигналы сверху  вниз:

1. MISO

2. MOSI

3. SCK

4. SS

Частота клоков 100кГц. На MOSI задаем число 0х8, в ответ получаем какие-то странные пички синфазно тактовой частоте SPI (SCK) длительностью примерно 2мкс (микросекунды).

Также на MOSI виден какой-то странный артефакт в виде небольшой просадки напряжения...

Интересно, неправда ли? :)

 

scope_0.png

Изменено пользователем PowerC™

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Проверьте ANSEL регистр. По умолчанию, все ножки - аналоговые. Этим регистром ножки SPI надо переключить на цифровые.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

6 минут назад, dimka76 сказал:

Проверьте ANSEL регистр

Спасибо за ответ, Дмитрий. В даташите на сабжевый контроллер нету такого регистра.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 minutes ago, PowerC™ said:

 В даташите на сабжевый контроллер нету такого регистра.

Да, я погорячился.

По привычке ))) В каких-то есть, в каких-то нет.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Почему так ?

SSP2CON1bits.SSPEN = 0;

В разделе 19.3.4 написано: 

Quote

To enable the serial port, MSSP Enable bit, SSPEN
(SSPxCON1<5>), must be set.

UPD. Ах, да. Позже разглядел включение после всей настройки. Но все равно не понял, зачем два раза сбрасывать бит.

Изменено пользователем Redguy

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

16 часов назад, Redguy сказал:

Но все равно не понял, зачем два раза сбрасывать бит.

Спасибо за ответ!

Мы позже убрали эту строку из кода. Ситуация не поменялась. Проблема, видимо, может быть и не софтварной.

Честно говоря, я в неловкой растерянности...

Будем экспериментировать дальше. Буду держать в курсе событий.

Но если кто-то все же будет иметь мысли и идеи для проверок, буду очень признателен.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Оффтоп :))))

На мотив песни из к/ф "Весна на Заречной улице":

Когда сигнал придет - не знаю,
Пройдут дожди, сойдут снега...
Но ты мне ПЛИСина родная
И в непогоду дорога...

...Теперь и сам не рад, что встретил,

Моя душа больна тобой...

Зачем, зачем на белом свете

Есть безответный SPI

 

Изменено пользователем PowerC™

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

18 часов назад, Lmx2315 сказал:

А у вас какой компилятор под пик?

Привет, сосед! ))))

Компилятор хс8. Сегодня пробуем с18. Также еще смотрим дизассемблер. Ну и в планах написать эспиайную часть кода на ассемблере.

Если что-то получится, отпишусь.

Кстати, в даташите обнаружен регистр ODCON3 (open drain) для SPI ножек. Попробовал его проинитить разными значениями - результата нет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Здравствуйте, уважаемые коллеги и те, кто не был на прошлом занятии.

Проблема решена.

Все оказалось довольно тривиально:

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, и все наши функции запахали.

В итоге остались некоторые мелкие проблемы, но все решаемо.

Всем успехов в работе!

Надеюсь данный топик кому-то станет полезным, и последователи не потратят столь много времени на решение этой довольно неприятной проблемы.

Отдельное спасибо отписавшимся в топике!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...