Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

Ядове при подчинен PIC16F886 и I2C
http://mcu-bg.com/mcu_site/viewtopic.php?f=3&t=14589
Страница 1 от 1

Автор:  ig_ivanov [ Съб Май 21, 2016 11:04 pm ]
Заглавие:  Ядове при подчинен 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
}

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

Автор:  stoyanoff [ Пон Май 23, 2016 1:25 pm ]
Заглавие:  Re: Ядове при подчинен PIC16F886 и I2C

Провери дали двата контролера работят на честота, която очакваш! Самият интерфейс не е особено подходящ за връзка м/у 2 контролера. Нямам подходяща платка, на която да тествам кода ти на практика. До колкото си спомнят, последният бит тук определяше посоката на данните! Провери дали това е наред! Опитай да поставиш малко закъснение между изпращаните байтове.
Това се сещам за сега...

Автор:  CarBeta [ Пон Май 23, 2016 2:00 pm ]
Заглавие:  Re: Ядове при подчинен PIC16F886 и I2C

Така, както си го направил, винаги ще праща само по един байт. Като изпратиш първия байт трабва да чакаш АСК от мастъра и тогава зареждаш втория и т.н. докато получаваш АСК от мастъра. В твоя случай когато BF стане нула се излиза от прекъсването и подчинения спира да изпраща, а не изпраща още байтове, както очакваш. Мастъра продължава да си клоква, но чете само свободната линия т.е. FF. И не е хич добра идея целия ти код да е в прекъсването.

Автор:  ig_ivanov [ Пон Май 23, 2016 4:39 pm ]
Заглавие:  Re: Ядове при подчинен PIC16F886 и I2C

Много благодаря за насоките- оказа се точно SSP1CON2.ACKDT бита от главния PIC- заблудило ме е това, че другите устройства, закачени на шината, си работят без проблеми. Посоченият по-горе код е работещ след като оправих ACKDT флага. Нямам намерение целия код да е в прекъсването- това е само демо, за да подкарам комуникацията. Също така ми е известно, че I2C не е особено подходящ за връзка между PIC- ползва се основно SPI, който в моя случай е малко труден за ползване.
Още веднъж благодаря за отговорите.

Страница 1 от 1 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/