Ошибка чтения RasPi и PIC I2C

Я пытаюсь установить связь между RasPi (тип B) и PIC16F877 с интерфейсом I2C. RasPi - ведущий, PIC - ведомый. Я могу без проблем отправлять байт данных из RasPi в PIC. Но мне нужен ответ от картинки после отправки данных.

Если я попробую команду bus.read_byte_data(address, 0x80) на python, RasPi закроет контакты I2C. После этой команды sudo i2cdetect -y 1 устройство не подключено к шине.

Во первых PIC16F877 работает с 5В. Но я меняю напряжение на 3,3 В (от RasPi) и пробую еще раз. Тот же результат.

Код RasPi Python

import smbus
import time

bus = smbus.SMBus(1)
DEVICE_ADDRESS = 0x18

bus.write_byte_data(DEVICE_ADDRESS, 0x00, 1)
time.sleep(0.1)
response = bus.read_byte_data(DEVICE_ADDRESS, 0x80) //IOError: [Errno 5] Input/output error in this line
print response

Код CCS C для PIC16F877

#include <16F877.h>
#device ADC=16
#include <string.h>

#FUSES NOWDT                   
#FUSES PUT                      
#FUSES NOLVP                 
#FUSES NOPROTECT
#FUSES NOBROWNOUT

#use delay(crystal=20000000)
#use FIXED_IO( A_outputs=PIN_A5,PIN_A4,PIN_A3,PIN_A2,PIN_A1,PIN_A0 )
#use FIXED_IO( B_outputs=PIN_B7,PIN_B6,PIN_B5,PIN_B4,PIN_B3,PIN_B2,PIN_B1,PIN_B0 )
#use FIXED_IO( D_outputs=PIN_D7,PIN_D6,PIN_D5,PIN_D4,PIN_D3,PIN_D2,PIN_D1,PIN_D0 )
#use FIXED_IO( E_outputs=PIN_E2,PIN_E1,PIN_E0 )
#use i2c(Slave,Slow,sda=PIN_C4,scl=PIN_C3,force_hw,address=0x30)

char state,temp;
int son_islenen_pin;

void durum_led_iletisim(){
   output_high(PIN_B7);
   delay_ms(100);
   output_low(PIN_B7);
}

void cevap_gonder(int pin){
   i2c_write(input(pin));
}

void ac_kapa(int pin){
   output_toggle(pin);
}

void islem_yap(char data){
   switch(data){
         case 1:
            ac_kapa(PIN_A0);
            break;
         case 2:
            ac_kapa(PIN_A1);
            break;
         case 3:
            ac_kapa(PIN_A2);
            break;         
      }
}

#INT_SSP
void ssp_interrupt() 
{ 
   state = i2c_isr_state();
   durum_led_iletisim();

   if(state < 0x80)
   {
      temp = i2c_read()

      islem_yap(temp);
      son_islenen_pin = temp;
   } 
   else if(temp == 0x80)
   {
      i2c_write(input(son_islenen_pin));
   } 
}

void main()
{
   enable_interrupts(INT_SSP);
   enable_interrupts(GLOBAL);
}

В чем может быть причина проблемы? И что бы вы посоветовали для решения?


person Serkan Ceylan    schedule 09.03.2014    source источник


Ответы (1)


Я получал ту же ошибку с другим устройством (коммутационная матрица ADG715 I2C), и я обнаружил, что на микросхеме был контакт RESET, который я оставил плавающим, потому что в таблице данных об этом ничего не сказано. С плавающим контактом устройство будет обнаружено sudo i2cdetect -y 1 просто отлично, и когда я записал байт, он обычно записывал правильно один раз, а затем терял соединение, а python выдавал те же ошибки ввода-вывода. Как только я поднял его, устройство заработало нормально, и python перестал выдавать ошибки ввода-вывода. Ваш чип намного сложнее моего, но я все равно предполагаю, что ваша проблема связана с PIC-стороной обмена.

person Laserman    schedule 11.10.2014