【发布时间】:2014-03-09 20:24:29
【问题描述】:
我尝试使用 I2C 接口在 RasPi(B 型)和 PIC16F877 之间进行通信。 RasPi 是主机,PIC 是从机。我可以顺利地将数据字节从 RasPi 发送到 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);
}
问题的原因可能是什么?您会推荐什么解决方案?
【问题讨论】:
标签: raspberry-pi pic i2c