Премини към съдържанието
  • Добре дошли!

    Добре дошли в нашите форуми, пълни с полезна информация. Имате проблем с компютъра или телефона си? Публикувайте нова тема и ще намерите решение на всичките си проблеми. Общувайте свободно и открийте безброй нови приятели.

    Моля, регистрирайте се за да публикувате тема и да получите пълен достъп до всички функции.

     

Микроконтролер и I2C свързване


Препоръчан отговор

Постановката е следната:
master (PIC18F45K50) -> slave (PIC18F45K22)
Master предава данни (стандартни, три устройства със съответните адреси ги получават и обработват):


i2c_start();
   i2c_write(0xA4); // адреса на Slave
   i2c_write(0xF0); // запис в регистъра на slave
i2c_repStart();
 i2c_write(0xA5); // четене
  data=i2c_read(0); //стойност, която master трябва да приеме от slave
i2c_stop();


Slave:
PIC18F45k22, OSC = 16MHz, PLLx4 (т.е. 64МХц). Инициализация на SSP1 (два броя са):


   SSP1ADD = 0xA4;//Slave_address; //device address
  SSP1CON1 = 0x36; //SSPEN =1 and set i2c to slave mode with  7 bit address
  SSP1STAT = 0x00;
 SSP1CON2 = 0x00;
 SSP1CON3 = 0x00;


Пробвано е и със SSP1CON2 = 0x01; 0x81; SSP1CON3 = 0x30 и комбинациите от тях.
Прекъсванията са ЗАБРАНЕНИ.


От тъпотия съм написал кода точно да обработва на горната поредица:


while(1)
{
     while (!SSP1STATbits.BF);    // чака първият байт
          temp = SSP1BUF;                // прочитане на първия байт (0хА4)
        SSP1CON1bits.CKP = 1;    // освобождаване на шината
    while (!SSP1STATbits.BF);   // чака вторият байт
        temp = SSP1BUF;                 // прочитане на вторият байт (0хF0)
      SSP1CON1bits.CKP = 1;     // освобождаване на шината
    while (!SSP1STATbits.BF);   // чака третият байт
        temp = SSP1BUF;                 // прочитане на третия байт (0xA5)- команда за четене от slave
      SSP1BUF = 0x44;                   // зареждане исканата стойност от регистъра, за случая 0х44
       SSP1CON1bits.CKP = 1;   // освобождаване на шината
    while (SSP1STATbits.BF);  // чакаме байта да се изпрати
  led2s();                                          // включване за 2 сек светодиод, че операцията е успешна, работи, светва, че всичко е минало успешно
}

С други думи: мастер праща към слейв: 0xA4;0xF0;0xA5 и чака да получи байт - 0х44.
Резултат: НЪЦКИ, NiCHT, NONE, ИЧ, ЙОК.

nucky.jpg.35e9a5bf4b5368cedf849d16939dcafa.jpg

Обаче:
while(1)
{
     while (!SSP1STATbits.BF);    // чака първият байт
          temp = SSP1BUF;                // прочитане на първия байт (0хА4)
        SSP1CON1bits.CKP = 1;    // освобождаване на шината
    while (!SSP1STATbits.BF);   // чака вторият байт
        temp = SSP1BUF;                 // прочитане на вторият байт (0хF0)
      SSP1CON1bits.CKP = 1;     // освобождаване на шината
    while (!SSP1STATbits.BF);   // чака третият байт
        temp = SSP1BUF;                 // прочитане на третия байт (0xA5)- команда за четене от slave

     delay_uS(6);                               // добавяме пауза от поне 6uS

      SSP1BUF = 0x44;                   // зареждане исканата стойност от регистъра, за случая 0х44
       SSP1CON1bits.CKP = 1;   // освобождаване на шината
    while (SSP1STATbits.BF);  // чакаме байта да се изпрати
  led2s();                                          // включване за 2 сек светодиод, че операцията е успешна, работи, светва, че всичко е минало успешно
}

Прави  съвършеният резултат:

voala.jpg.769f3217ec3c2c16c8987a96eb509468.jpg

Тая вмъкната пауза изобщо не ми харесва, особено като обработката се вкара в прекъсване. Тези 6uS за 64MHz процесор са около 100 инструкции.

Пробвал съм и с различни честоти на процесора- няма промяна.

Някакви идеи кой е виновника в случая- аз или процесора?

Питайте, ако ви трябва още информация.

 

 

Линк към коментара
Сподели в други сайтове

Без да съм спец по програмиране - IIC Bus си има специикации и е доста по-бавна. Има времена за изчакване и потвърждение, така че да се разбира и с най-бавните устройства по шината. Попринцип повечето стандартни  памети работят на 100KHz, някои по-добри има и на 400KHz. За други чипове отделно. Има процедури за потвърждение и за освобождаване на шината ако някое устройство е увиснало или не е потвърдило.

Линк към коментара
Сподели в други сайтове

Добавете отговор

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

Гост
Напишете отговор в тази тема...

×   Вмъкнахте текст, който съдържа форматиране.   Премахни форматирането на текста

  Разрешени са само 75 емотикони.

×   Съдържанието от линка беше вградено автоматично.   Премахни съдържанието и покажи само линк

×   Съдържанието, което сте написали преди беше възстановено..   Изтрий всичко

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Добави ново...

Информация

Поставихме бисквитки на устройството ви за най-добро потребителско изживяване. Можете да промените настройките си за бисквитки, или в противен случай приемаме, че сте съгласни с нашите Условия за ползване