Jump to content

    

Проблемы с 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кГц.

Ответа - нет.

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

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

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;

}

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

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

Share this post


Link to post
Share on other sites

 

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

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

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

 

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

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

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

 

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

Share this post


Link to post
Share on other sites
34 минуты назад, PowerC™ сказал:

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

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

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

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

1. MISO

2. MOSI

3. SCK

4. SS

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

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

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

 

scope_0.png

Edited by PowerC™

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
6 минут назад, dimka76 сказал:

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

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

Share this post


Link to post
Share on other sites
3 minutes ago, PowerC™ said:

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

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

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

 

Share this post


Link to post
Share on other sites

Почему так ?

SSP2CON1bits.SSPEN = 0;

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

Quote

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

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

Edited by Redguy

Share this post


Link to post
Share on other sites
16 часов назад, Redguy сказал:

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

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

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

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

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

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

Share this post


Link to post
Share on other sites

Оффтоп :))))

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

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

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

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

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

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

 

Edited by PowerC™

Share this post


Link to post
Share on other sites

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

А то видели тему - 

Share this post


Link to post
Share on other sites
18 часов назад, Lmx2315 сказал:

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

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

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

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

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

Share this post


Link to post
Share on other sites

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

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

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

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

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

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

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

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

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now