Software I2C

Hallo,

ich versuche SoftWire zum Laufen zu bringen.

Es funktioniert schon zum teil.
Das scannen der iic-Adressen funtioniert.
Mein Slave liefert beim Senden von 0x55 drei Byte zurück, das klappt nicht.
Auf der GitHub-Seite steht auch was von Puffer definieren, bloß wie ???

#define SDA_PORT PORTC
#define SDA_PIN 4
#define SCL_PORT PORTC
#define SCL_PIN 5

#define I2C_TIMEOUT 100
#define I2C_SLOWMODE 1     
#include <SoftWire.h>

SoftWire Wire = SoftWire();


void setup(){
  Serial.begin(115200);
  Serial.println("Radar-Regensensor IIC-Test Master");
  Wire.begin();                                             //I2C Start 
  I2CScanner();                                             //scannd den I2C-Bus

}

void loop(){
  int8_t vRegenkmhVK, vRegenkmhNK, vRegenTemp;
  boolean RegenOK = Regensensor(&vRegenkmhVK, &vRegenkmhNK, &vRegenTemp);
  Serial.print ("  ");
  if(vRegenkmhVK > 0){
    Serial.print(vRegenkmhVK);
    Serial.print (",");
    Serial.print(vRegenkmhNK);
    Serial.print (" km/h  ");
  }
  Serial.print(vRegenTemp);
  Serial.println (" °C");
  delay(2000);
}

boolean Regensensor(int8_t *vRegenkmhVK, int8_t *vRegenkmhNK, int8_t *vRegenTemp){
  int8_t vData[3];
  Wire.beginTransmission(0x4);
  Wire.write(0x55);
  byte vOK = Wire.endTransmission();
  if(vOK > 0) return false;
  delay(1);
  vOK = Wire.requestFrom(0x4,3);
  if(vOK != 3) return false;
  Serial.print("vOK = ");
  Serial.print(vOK);
  int i = 0;
  while(Wire.available()){
    vData[i] = Wire.read();
    i++;
    if(i > 2000) break;
  }
    *vRegenkmhVK = vData[0];
    *vRegenkmhNK = vData[1];
    *vRegenTemp = vData[2];
    return true;
}

void I2CScanner(){
  Serial.println ("I2C-Scanner");
  byte count = 0;
  
  for (byte i = 0; i < 120; i++){
    Wire.beginTransmission (i);
    if (Wire.endTransmission () == 0)
      {
      Serial.print ("Found: ");
      Serial.print (i, DEC);
      Serial.print (" (0x");
      Serial.print (i, HEX);
      Serial.println (")");
      count++;
      delay (1); 
      } 
  } 
  Serial.println ("Done.");
  Serial.print ("Found ");
  Serial.print (count, DEC);
  Serial.println (" device(s).");
}

Ach, das ist doch trivial....

#include <SoftWire.h>

SoftWire Wire {A0, A1}; // {SDA, SCL}
byte rxBuffer[32];
byte txBuffer[32];

void setup()
{
  Wire.setRxBuffer(rxBuffer,sizeof(rxBuffer)); 
  Wire.setTxBuffer(txBuffer,sizeof(txBuffer)); 
  Wire.begin(); 
}

void loop()
{

}

error: 'class SoftWire' has no member named 'setRxBuffer'

Dann ist Deine Lib evtl. nicht richtig installiert.

@combie: da würde ich txBuffer nehmen :wink:

Wire.setTxBuffer(rxBuffer,sizeof(txBuffer));

Gruß Tommy

ar182:
error: 'class SoftWire' has no member named 'setRxBuffer'

Kann nicht sein!

Auszug aus der von dir verlinkten Lib:

    // The Wire compatibility functions require RX and TX buffers. The same address space may be used for both
    // as long as the user does not call receiveFrom between startTransmission and endTransmission.
    inline void setRxBuffer(void *rxBuffer, uint8_t rxBufferSize) {
        _rxBuffer = (uint8_t*)rxBuffer;
        _rxBufferSize = rxBufferSize;
        _rxBufferIndex = 0;
        _rxBufferBytesRead = 0;
    }

    inline void setTxBuffer(void *txBuffer, uint8_t txBufferSize) {
        _txBuffer = (uint8_t*)txBuffer;
        _txBufferSize = txBufferSize;
        _txBufferIndex = 0;
    }

@combie: da würde ich txBuffer nehmen

Da hast du voll Wahr!
(ein schlampiger C&P Fehler)
korrigiert

Danke!

Ich hatte schon mehrere Bibs getestet,
Dabei ist wohl was durcheinander geraten.

Ich habe den Thread gelesen und bin daraus nicht schlauer geworden.

Habe deshalb nochmal die Dokumentation auf Github gesucht und die Thematik ist sehr weit entfernt von trivial.

Für alle denen es auch so geht: schaut euch UNBEDINGT die Dokumentation an.