Отговори на тема  [ 4 мнения ] 
Ядове при подчинен PIC16F886 и I2C 
Автор Съобщение
Ранг: Професионалист
Ранг: Професионалист
Аватар

Регистриран на: Съб Май 21, 2016 9:47 pm
Мнения: 577
Местоположение: Бургас
Мнение Ядове при подчинен PIC16F886 и I2C
Здравейте!
Имам ядове да подкарам посочения PIC да работи като Slave устройство- по-точно- работи, ама на 75%. След няколко десетки опити за подкарване на примери от интернет, накрая седнах и прочетох документацията на Microchip за работата на slave PIC по I2C шина (AN734) и написах кода. За съжаление успешни са 3/4 от функциите, а именно- запис на байт от основния към подчинения PIC, запис на няколко байта и четене на един байт. Единственото, което се опъва цяла седмица вече е четене на няколко байта (трябват ми 4 поредни)- не става и не става- чете се само първия байт, а останалите 3 са със стойност 0xFF. Това е кода, и ще бъда много благодарен ако някои сподели къде бъркам:
Код:
#define _XTAL_FREQ 8000000
#define Slave_addr 0x38
unsigned   char addr=0;
char         count1;
unsigned char dataPICin[11];
unsigned char datareceived;

void i2c_slave_init(void);

void main()
{
    i2c_slave_init();
     while(1)
     {
     }
}

void interrupt I2C_slave()
{
  //SSPSTAT     SMP; CKE; D/A; P; S; R/W; UA; BF

    if(PIR1bits.SSPIF == 1)
    {
         SSPCONbits.CKP = 0;

       if ((SSPCONbits.SSPOV) || (SSPCONbits.WCOL)) // проверка за грешки в протокола
       {
             count1 = SSPBUF;            // Read the previous value to clear the buffer
             SSPCONbits.SSPOV = 0; // Clear the overflow flag
             SSPCONbits.WCOL = 0;   // Clear the collision bit
             PIR1bits.SSPIF = 0;
             SSPCONbits.CKP = 1;
             PORTCbits.RC6 = 1;  // индикация, ако има грешка

       };
       if (SSPSTATbits.S==1 && SSPSTATbits.R_nW==0 && SSPSTATbits.D_nA==0 && SSPSTATbits.BF==1)
          //получаване на един байт от masterPIC - работи;
       {
           addr = SSPBUF;
           datareceived=0;
       }
       else
       if (SSPSTATbits.R_nW==0 && SSPSTATbits.D_nA==1 && SSPSTATbits.BF==1)
         // Получаване от Master PIC на няколко байта - работи
       {
           dataPICin[datareceived]=SSPBUF; datareceived++;
             if (SSPSTATbits.P==1) { datawork[10]=datareceived;} // запазване на получения брой байтове
           
       }
       else
       if (SSPSTATbits.S==1 && SSPSTATbits.R_nW==1 && SSPSTATbits.D_nA==0) //start bit, buffer full, address
        // Изпращане на един байт към maserPIC- работи!
       {
           addr= SSPBUF;
           SSPBUF = 3; // за тест на връзката- стойността на байта е 3- получава се в master!
            SSPCONbits.CKP = 1;
       }
        else
        if (SSPSTATbits.R_nW==1 && SSPSTATbits.D_nA==1)
          //изпращане не няколко байта- НЕ РАБОТИ!
        {
             SSPCONbits.CKP = 1;
             SSPBUF = 5; // трябва да се получат в maser 5;5;5 а идват FF,FF,FF ???
             while(SSPSTATbits.BF);
        }
       }
     SSPCONbits.CKP = 1;
     PIR1bits.SSPIF = 0;
    }

}

void i2c_slave_init(void)
{
    TRISC=0b00011000; // байт 3 и 4 - входове, SCL и SDA
    TRISB=0x00;
    PORTB=0;
    PORTC=0;
    ANSEL=0;
    CCP1CON=0;
    ADCON0=0;
    ADCON1=0;
    TRISCbits.TRISC3 = 1;  //direction register SCL as input pin
    TRISCbits.TRISC4 = 1; //direction register SDA as input pin
    SSPADD = Slave_addr; //device address  - 0x38

    SSPCON = 0X36; //SSPEN =1 and set i2c to slave mode with 7 bit address
    SSPSTAT =0;
    INTCONbits.PEIE = 1; // инициализация на прекъсванията
    PIR1bits.SSPIF = 0;
    PIE1bits.SSPIE = 1;
    INTCONbits.GIE = 1;
    PIR1bits.SSPIF = 0;         //Clear Control Bits
}

Ако трябва някаква допълнителна информация- готов съм да отговоря.


Съб Май 21, 2016 11:04 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Чет Юни 25, 2009 1:01 pm
Мнения: 2251
Мнение Re: Ядове при подчинен PIC16F886 и I2C
Провери дали двата контролера работят на честота, която очакваш! Самият интерфейс не е особено подходящ за връзка м/у 2 контролера. Нямам подходяща платка, на която да тествам кода ти на практика. До колкото си спомнят, последният бит тук определяше посоката на данните! Провери дали това е наред! Опитай да поставиш малко закъснение между изпращаните байтове.
Това се сещам за сега...

_________________
www.elkran.com


Пон Май 23, 2016 1:25 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Май 01, 2009 4:01 pm
Мнения: 1438
Мнение Re: Ядове при подчинен PIC16F886 и I2C
Така, както си го направил, винаги ще праща само по един байт. Като изпратиш първия байт трабва да чакаш АСК от мастъра и тогава зареждаш втория и т.н. докато получаваш АСК от мастъра. В твоя случай когато BF стане нула се излиза от прекъсването и подчинения спира да изпраща, а не изпраща още байтове, както очакваш. Мастъра продължава да си клоква, но чете само свободната линия т.е. FF. И не е хич добра идея целия ти код да е в прекъсването.


Пон Май 23, 2016 2:00 pm
Профил
Ранг: Професионалист
Ранг: Професионалист
Аватар

Регистриран на: Съб Май 21, 2016 9:47 pm
Мнения: 577
Местоположение: Бургас
Мнение Re: Ядове при подчинен PIC16F886 и I2C
Много благодаря за насоките- оказа се точно SSP1CON2.ACKDT бита от главния PIC- заблудило ме е това, че другите устройства, закачени на шината, си работят без проблеми. Посоченият по-горе код е работещ след като оправих ACKDT флага. Нямам намерение целия код да е в прекъсването- това е само демо, за да подкарам комуникацията. Също така ми е известно, че I2C не е особено подходящ за връзка между PIC- ползва се основно SPI, който в моя случай е малко труден за ползване.
Още веднъж благодаря за отговорите.


Пон Май 23, 2016 4:39 pm
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 4 мнения ] 

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 15 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни