我尝试使用I2C接口在RasPi(B型)和PIC16F877之间进行通信。 RasPi是主人,PIC是奴隶。我可以顺利地从RasPi向PIC发送数据字节。但是在发送数据后我需要来自pic的响应。
如果我在python上尝试bus.read_byte_data(address, 0x80)
命令,RasPi会关闭I2C引脚。在此sudo i2cdetect -y 1
命令后,总线上没有设备。
首先PIC16F877使用5V。但我将电压更改为3.3V(来自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
PIC16F877 CCS C代码
#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);
}
问题的原因是什么?您会建议什么样的解决方案?
答案 0 :(得分:0)
我在另一台器件(ADG715开关矩阵I2C)上遇到了同样的错误,我发现芯片上有一个RESET引脚,因为数据表没有说明任何内容。随着引脚浮动,设备将被sudo i2cdetect -y 1
检测到正常,当我写一个字节时,它通常会正确写入一次然后失去连接,而python会抛出相同的IO错误。一旦我把它拉起来,设备运行正常,python停止抛出IO错误。你的芯片比我的芯片复杂得多,但我仍然猜测你的问题是在交易所的PIC方面。