Я пытаюсь установить связь между 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);
}
В чем может быть причина проблемы? И что бы вы посоветовали для решения?