Hi,
I´m having some troubles setting up two identical sensors with hardwired I2C-Addresses. My code runs without problems whilest using the original Arduino I2C-Pins. As I tried to replicate the communication via the SoftwareWire I2C-Pins, the timing does not seem to function as intended.
Several tests lead me to the conclusion that there might be some issues with the calculation in the SetClock() - function.
The pictures below show the timing protokoll for the following cases:
- SoftwareWire I2C without SetClock() - function
- SoftwareWire I2C with SetClock() - function set to default 100kHz
- Original I2C set to 100kHz
All pictures show the same time section.
I´d like to mention that the second case (SetClock(2)) does not show any reaction on the osci but the sensor reacts after waiting for about 1 minute or so. The original I2C takes onyl 1 sec.
Another thing is that the Scan-I2C() from Nick Gammon (this was mentioned before...) detects slaves at every address whilst using the SoftwareWire-I2C.
Do you guys have any idea how to help me?
I hope you understand the parts of my code. The whole code is too long to post. It is work in progress and I´m trying several things in the same file...
#include <SoftwareWire.h>
#include <Wire.h>
/* Interrupt Pins am Arduino Mega: 2,3,18,19,20,21 */
/*Initialisieren der I2C-Schnittstellen für parallelen Datentransport*/
const int sdaPin2 = 18; //Die digitalen Pins 26 und 27 werden für die I2C-Kommunikation vorbereitet
const int sclPin2 = 19;
const int sdaPin3 = 16;
const int sclPin3 = 17;
SoftwareWire myWire_2 = SoftwareWire(sdaPin2, sclPin2, true, false);
SoftwareWire myWire_3 (sdaPin3, sclPin3);
/* Pinbelegung */
int rxio_sup = 5; //3,3 V Versorgungsleitung (oranges Kabel über Linearregler)
int tx_sup = 7; //5 V Versorgungsleitung (rotes Kabel)
int resetz = 4; //ResetZ-Leitung des AFE4404 (grünes Kabel über Linearregler)
int adc_rdy = 2; //ADC_RDY-Leitung des AFE4404 (gelbes Kabel)
int afe_clk =6; //AFE_CLK-Leitung des AFE4404 für externen Taktgeber bei Bedarf. Im aktuellen Stand nicht verwendet (graues Kabel)
/* Pinbelegung Platine 2 */
int rxio_sup2 = 9;
int tx_sup2 = 11;
int resetz2 = 8;
int adc_rdy2 = 3;
int afe_clk2 = 10;
/* Variablendeklaration */
int befehl = 0; //Variable in welche die Eingabebefehle der seriellen Schnittstelle eingelesen werden
volatile int readDataFlag = 0; //Variable der Interrupt-Subroutine mit welcher die Messdaten ausgelesen werden
unsigned long AFE_Data_Buff[6]; //
double regValue[10];
int farbe = 0; //Variable zum Steuern der LED-Farbe und der zugehörigen Messwerte
String stringOne, stringTwo, stringThree; //Ausgabestrings für den Betrieb mit allen 3 LEDs
String PrintAll, Print, Print2;
int platAnzahl = 1;
int i2c_Anzahl = 1;
const double adc_const = 0.000000572; //Konstante zur Umrechnung des 24-Bit ADC-Binärcodes in einen Dezimalwert
int AFE_ADDR = 88; //I²C-Adresse des AFE4404
void setup() {
Serial.begin(9600); //Baudrate für die Kommunikation über die serielle Schnittstelle. Muss identisch zu der Angabe im seriellen Monitor bzw. der Benutzeroberfläche sein
/* Bestimmen der Pinbelegungen */
pinMode(resetz, OUTPUT);
pinMode(rxio_sup, OUTPUT);
pinMode(tx_sup, OUTPUT);
pinMode(adc_rdy, INPUT);
pinMode(afe_clk, INPUT);
Wire.begin(); //Aktivieren des I2C-Bus
myWire_2.begin(); //Aktivieren des zweiten I2C-Bus
myWire_3.begin();
Wire.setClock(100000L);
myWire_2.setClock(2);
}
/**************************************************************************************/
/* I can only show the I2C_write funtcion as it gets to long to show everything */
/*********************************************************************************************************/
/* AFE4404_Reg_Write */
/* */
/* Da die Register des AFE4404 mit 24-Bit Werten beschrieben werden müssen, der I²C-Datenbuss jedoch nur */
/* 8-Bit auf einmal verschicken kann, wird der 24-Bit String vor dem verschicken in 3x 8-Bit Segmente */
/* unterteilt welche in einem Array gespeichert und nacheinander über den Bus verschickt werden. */
/*********************************************************************************************************/
void AFE_Reg_Write (int reg_address, unsigned long data)
{
byte configData[3];
configData[0]=(byte)(data >>16);
configData[1]=(byte)(((data & 0x00FFFF) >>8));
configData[2]=(byte)(((data & 0x0000FF)));
if (i2c_Anzahl == 1)
{
I2C_write(AFE_ADDR, reg_address, configData, 3);
} else if (i2c_Anzahl == 2)
{
I2C_write2(AFE_ADDR, reg_address, configData, 3);
}
}
/**********************************************************************************************************/
/* Write to AFE on I2C */
/* */
/* Hier findet das eigentliche Beschreiben des I²C-Datenbusses statt */
/**********************************************************************************************************/
char I2C_write (int slave_address, int reg_address, byte configData[], int byteCount)
{
int trans_end = 0;
myWire_2.beginTransmission(slave_address);
myWire_2.write(reg_address);
myWire_2.write(configData, 3);
myWire_2.endTransmission();
return (trans_end);
}
char I2C_write2 (int slave_address, int reg_address, byte configData[], int byteCount)
{
int trans_end = 0;
myWire_3.beginTransmission(slave_address);
myWire_3.write(reg_address);
myWire_3.write(configData, 3);
myWire_3.endTransmission();
return (trans_end);
}


