2014-02-13 5 views
0

Я пытаюсь подключить Arduino Uno к PIC18F4620 с использованием протокола I2C,Подключение Arduino Uno к PIC18F4620 с использованием I2C

я написал этот код для Arduino

#include <Wire.h> 
void setup() 
{ 
    Wire.begin(); 
    Serial.begin(9600); 

} 

void loop() 
{ 

    Wire.beginTransmission(0xA0); 
    Wire.write(2); 
    Wire.write('I'); 
    Wire.write('2'); 
    Wire.write('C'); 
    Wire.write('\n'); 
    Wire.endTransmission();  
    Serial.println("Send to I2C Slave 0xA0"); 
    delay(1000); 
} 

и этот код для PIC18F4620 с использованием CCS Компилятор:

#include <slave.h> 
#use rs232(stream=string,baud=9600, xmit=PIN_C6, rcv=PIN_C7,parity = N, bits = 8) 
#define P_SDA PIN_C4 
#define P_SCL PIN_C3 

#use i2c(slave, sda=P_SDA, scl=P_SCL,address=0xA0) 


void main() 
{ 
char data; 
char buffer_I2C[10]; 
int i=0; 
printf("SLAVE\r\n"); 
    while(TRUE) 
    { 
     if(i2c_poll()) 
     { 
     data = i2c_read(); 
     printf("%d \r\n" ,data); 
     if(data != -96) 
     {  
      if(data == '\n') 
      { 
       if(buffer_I2C[0] == 2) 
       { 
       buffer_I2C[i]='\0'; 
       printf("Message - %s\r\n",buffer_I2C); 
       } 
      } 
      else 
      { 
      buffer_I2C[i]=data; 
      i++; 
      } 
     } 
     else 
     { 
     i=0; 
     } 
     } 
    } 
} 

проблема заключается в том, что ПИК не реагирует на Arduino, я имею в виду, когда Arduino отправить данные в ПИК, ПИК не получает вещь,

В чем проблема с этим кодом?

Заранее благодарен.

ответ

0

Ну, первым делом я бы посоветовал вам получить логический анализатор, такой как logic или openbench или buspirate или arduino based one (или любые другие более дорогие варианты, которые могут интерпретировать i2c).

Затем вы увидите, нет ли электронной проблемы.

Есть несколько параметров, которые вы должны проверить:

  • есть непрерывность линии между обеими компонентами, многие проблемы i2c могут исходить от неисправного кабеля или плохого следа на печатной плате:
    • Используйте тестер , или лучше, сделайте цикл HIGH/LOW на трех контактах, которые вы используете для i2c на arduino, и посмотрите, можете ли вы прочитать его на стороне PIC.
  • Вы правильно подключили i2c с обеих сторон?
    • это может выглядеть глупо, но дерьмо случается ... Это SDAдействительно подключен к SDA, SCLSCL к?
  • Скорость i2c устанавливается одинаково с обеих сторон?
    • по умолчанию, скорость установлена ​​на 100 кГц на ардуино (хотя дважды отметьте свой файл twi.c). Вы можете изменить этот параметр к более высокой скорости, установив его на 400kHz перед тем включая Wire.h, т.е .: #define TWI_FREQ 400000L
    • Я не много о стороне ПОС вещей знать, но убедитесь, что скорость правильно.
    • Используя логический анализатор, убедитесь, что линия часов действительно вращается по объявленному значению. Поскольку все часы связаны с AVR, иногда вы можете рассчитывать на определенную скорость, но получаете только половину из этого, потому что плавкий предохранитель установлен неправильно или некоторая настройка неверна, делая половину скорости таймера MCU (и все остальные часы).
  • Как я уже сказал, я мало что знаю о ПИК, но вы можете использовать контакты, которые вы используете на ПИК, чтобы справиться с скоростью i2c?
    • Я знаю, что на AVR, бит banged i2c связи может нужно выполнять на более медленной скорости. Может ли это быть для ПОС?

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

Затем попробуйте использовать оба ваших плат с другим устройством i2c. то есть попытайтесь установить связь с компьютером с помощью платы PIC, используя либо шиппират, либо ключ i2c, либо ваш display connector, а затем используйте i2cdetect, чтобы играть с ним.

С другой стороны, попробуйте подключиться к любому промышленному компоненту i2c, используя Arduino. Знание того, кто не работает, поможет вам исследовать, какой из них не работает, или плохо себя вести.

И, наконец, если вам достаточно удобно заниматься разработкой программного обеспечения, я советую вам много использовать i2cdev library, что фактически делает достойную абстракцию поверх ошибочной реализации Arduino.

HTH

0

Вы подтвердили, что ПОС отправит серийный номер на ваш компьютер?

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

Я знаю, что более ранние версии MPLAB имели довольно хорошие отладочные тренажеры, которые помогли найти проблемы с кодом. Я уверен, что MPLABX тоже.

Установили ли вы свои биты конфигурации для ПОС? Я не вижу этого в вашем коде.