美文网首页树莓派树莓派
基于I2C的STM32与树莓派通信

基于I2C的STM32与树莓派通信

作者: 有信仰的人 | 来源:发表于2018-10-23 22:39 被阅读332次

  传统的串口通信会丢失数据,不可靠,故采用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"

连接效果图:
运行测试图:

相关文章

网友评论

    本文标题:基于I2C的STM32与树莓派通信

    本文链接:https://www.haomeiwen.com/subject/xbjzzftx.html