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

инициализация SPI на PIC

В общем с пиками дел мало имел, хочу инициализировать SPI на нем

вот то что получилось

 

    list    p=16F877A
    #include    <p16F877A.inc>
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
cycle_1    equ    0x20
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;Prepare;;;;;;;;;;;;;;;;;;;;
    clrf    PORTA
    clrf    PORTC
    clrf    PORTD
    bcf    STATUS,RP0    
       movlw    0x00
    movwf    INTCON
    movlw    b'11010011'
    movwf    PORTC
    movlw    b'00000100'
    movwf    PORTD
    movlw    b'11111110'
    movwf    PORTA
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;Initial;;;;;;;;;;;;;;;;;;;
SPI_Initial
    bsf    STATUS,RP0    
    bsf TRISC,3
    bsf    TRISC,5
    bcf TRISC,2          ;;cs low
    bcf    SSPSTAT,SMP     
    bcf    SSPSTAT,CKE         
    bcf    STATUS,RP0       ;; 0
    bcf    SSPCON,0       ;ведущий режим SPI,
    bcf SSPCON,1       ;тактовый сигнал
    bcf    SSPCON,2       ; =Focs/4
    bcf SSPCON,3
    bsf SSPCON,4
    bsf SSPCON,5

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;Power cycle;;;;;;;;;;;;;;
    bsf    STATUS,RP0
    bsf TRISC,2          ;;cs high
    bcf    STATUS,RP0    

loop
    movlw    0xFF
    movwf    SSPBUF
    goto    loop
    end

 

В общем я ожидаю получить на осцилографе импульсы с выхода SCK и SDO ...... А вокруг тишина....

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


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

Ну хорошо, просто я и так и так пробовал, сейчас поиенял, ситуация не изменилась....что еще может быть

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


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

Ну хорошо, просто я и так и так пробовал, сейчас поиенял, ситуация не изменилась....что еще может быть

 

PIC16 не использовал. Но в PIC18, PIC24 SPI часто посажена на аналоговые пины и нужно указать что пины цифровые, иначе ниче не получается.

 

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


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

Уже какой день бьюсь с инициализацией SPI, ничего не выходит, вроде все перепроверил, все норм (вроде), а контроллер не хочет в прерывание входить! Подскажите в чем может быть проблема.

   ANSEL=   0b00000000;    // все выводы как цифровые
   ANSELH=  0b00000000;    // все выводы как цифровые
   CM1CON0= 0b00000000;    // отключаем компаратор
   CM2CON0= 0b00000000;    
   ADCON0=  0b00000000;    // отключаем АЦП

   TRISA= 0b00001000;   
   TRISB= 0b00010000;   // RB6= SCK RB4= SDI/SDA
   TRISC= 0b00000000;   // RC7= SDO RC6= SS
   RC6=   1;

   GIE=   1;  
   PEIE=  1;  
   SSPIE= 1;
   
   IRCF0= 1;  // 111 = 8MHz
   IRCF1= 1;  
   IRCF2= 1;

   SMP= 0; 
   CKE= 1;
   CKP=   1;   
   SSPM0= 0;   // 0000 = SPI Master mode, clock = FOSC/4
   SSPM1= 0;   
   SSPM2= 0;
   SSPM3= 0;
   SSPEN= 1;

 

а вот сама работа с SPI

 

char SPI_RW(char DATA_OUT)   // вывод в SPI
{   
    SSPBUF= DATA_OUT;
    while (!SPI_FLAG);
    SPI_FLAG = 0;
    return SSPBUF;
}

 

SPI_FLAG устанавливается в прерывании, в которое он так не хочет упорно входить, соответственно так и остается в цикле.

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


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

Микроконтроллер какой? Соответствует ли ассемблерный листинг сишной программке?

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


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

Микроконтроллер PIC16F689. Листинг соответствует сишной программе, т.е компилятор ничего не оптимизировал и не удалил.

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

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


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

HammerN, а разве не надо биты TRIS, соответствующие всем выводам SSP установить в "1" (сделать входами)? Посмотрите в даташите схему соответствующих выводов портов, возможно, выходы модуля SSP у Вас "закорочены" на выходную защелку PORTx

SPI_FLAG устанавливается в прерывании
А обработчик прерывания покажите, может в нем проблема? Или прерывание вообще не возникает? Что в отладке видно?

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


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

TRIS устанавливал в соответствие с даташитом, как указано в разделе SPI.

 

вот обработчик, но тут все просто, выставлет флаг и все.

void interrupt isr(void)   
{
   if ((SSPIE) && (SSPIF)) 
   {
        SPI_FLAG= 1;
        SSPIF= 0;
   }
}

 

прерывание вообще не возникает, такое ощущение что SPI просто выключен, раз он даже флаг не ставит, а отладка просто виснет в бесконечном цикле, т.к флаг выставлять никто не хочет.

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


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

HammerN, вроде все правильно у Вас, в протеусе работает, а в MPLAB SIM действительно не возникает прерывание, да и не должно, посмотрите ограничения симулятора:

For devices with the listed peripherals, these peripherals are NOT supported:

...

Serial I/O (i.e., SSP including I2C and SPI). As a result, the SSPSTAT register has been made readable and writable.

Note: You can use stimulus to emulate many of the signals of SPI and have firmware read data as if it was SPI.

Креплю проект в MPLAB и DSN файл для протеуса.

 

 

 

 

Vlad27, там про прием в режиме ведомого - не тот случай.

SSP.zip

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


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

Vlad27, там про прием в режиме ведомого - не тот случай.

 

Совершенно верно, проглядел.

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


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

Господа специалисты.

Помогите новичку!

Имеется блок с PIC18F6520, который после сбоя по питанию ЧАСТИЧНО перестал нормально функционировать.

На блоке есть разъем (DB9), далее MAX232, дальше USART2 выводы контроллера (6;8;5;4).

Мои попытки связаться с контроллером из различных программ (MPLAB, PCWHD Compiler)

с ноутбука безрезультатны. (пишет нет связи, или проверьте кабель)

Кабель и MAX232 исправны.

В блоке есть возможность установки нескольких перемычек, возможно какие-то

использовались для организации связи через USART2.

Помогите установить связь с ноутбука с PIC18F6520.

С уважением Mika

 

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


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

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

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

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

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

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

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

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

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

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