RasPi和PIC I2C读取失败

时间:2014-03-09 20:24:30

标签: raspberry-pi pic i2c

我尝试使用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);
}

问题的原因是什么?您会建议什么样的解决方案?

1 个答案:

答案 0 :(得分:0)

我在另一台器件(ADG715开关矩阵I2C)上遇到了同样的错误,我发现芯片上有一个RESET引脚,因为数据表没有说明任何内容。随着引脚浮动,设备将被sudo i2cdetect -y 1检测到正常,当我写一个字节时,它通常会正确写入一次然后失去连接,而python会抛出相同的IO错误。一旦我把它拉起来,设备运行正常,python停止抛出IO错误。你的芯片比我的芯片复杂得多,但我仍然猜测你的问题是在交易所的PIC方面。