传统的串口通信会丢失数据,不可靠,故采用I2C(同步串行总线)通信。
树莓派上使用python脚本,后期将使用c或java重写,目前没有需求。
树莓派作主机(Master),stm32作从机(Slave)。特别需要注意的是,I2C的通信虽然只需要两根线就能通信,但是需要第三根线接地GND(提供判断低电位的能力),否则不能正常识别stm32从机
使用Arduino IDE编程
以下是STM32的代码:
#include <Wire_slave.h>
#define SLAVE_ADDRESS 0x04 //i2c地址
int data;
void setup() {
Serial.begin(9600); // start serial for output
// initialize i2c as slave
Wire.begin(SLAVE_ADDRESS);
// define callbacks for i2c communication
Wire.onReceive(receiveData);//从机 接收 主机 发来的数据
Wire.onRequest(sendData); //从机 请求 主机 发送数据
Serial.println("Ready");
}
void loop() {
delay(100);
}
// callback for received data
void receiveData(int byteCount){
while(Wire.available()) {
data = Wire.read();
Serial.print("data received: ");
Serial.println(data);
}
}
// callback for sending data
void sendData(){
Wire.write(data);
}
特别地,请注意头文件“Wire_slave.h”
以下是树莓派上的python文件
特别的,请先开启树莓派上i2c的接口,sudo raspi-config
此外要能会使用树莓派上i2cdetect命令测试接口的连接是否正常
import smbus
import time
bus = smbus.SMBus(1)
address = 0x04
def writeNumber(value):
bus.write_byte(address, value)
return -1
def readNumber():
number = bus.read_byte(address)
return number
while True:
var=input("Enter1–9:")
if not var:
continue
writeNumber(var)
print "RPI: Hi STM32, I sent you ", var
# sleep one second
time.sleep(1)
number = readNumber()
print "STM32: Hey RPI,I received a digit", number
print "======================================\n"
连接效果图:
运行测试图:
网友评论