/* >> Bootloader verwendet USART2 (PF4/5), darüber wird geflasht << >> Das bedeutet auch das Serial2 mit Portmux immer verfügbar ist << >> Spannungsversorgung über USB: JP27 ... 1-2 gesetzt >> MVIO Einstellung: JP4 ... 1-2 gesetzt 5V >> gesetzte Jumper für Serial2: JP7 ... USART2 wird auf den USB-FTDI Bus angeklemmt JP9 ... ausgewählte USART zum FTDI aktiviert (Main-Jumper) >> Resetsignal für Programmierung über USB mittels Arduino IDE: JP23 ... DTR gesetzt >> gesetzte Jumper für I2C: JP11 ... damit wird der I2C Bus auf TWI0 (PA2/PA3) angebunden JP16 ... 4.7K Pullups aktiv I2C Address Scanning... 7Bit 7Bit 8Bit I2C device found at address 0x26 = B0010.0110 = B0100.110x ... U6: PCA8574D (Portexpander) I2C device found at address 0x48 = B0100.1000 = B1001.000x ... U8: TMP101 I2C device found at address 0x50 = B0101.0000 = B1010.000x ... U9: FM24W256 (256K FRAM) I2C device found at address 0x51 = B0101.0001 = B1010.001x ... U10: AT24C256 (256K EEprom) I2C device found at address 0x68 = B0110.1000 = B1101.000x ... U11: DS3231 (RTC) I2C device found at address 0x73 = B0111.0011 = B1110.011x ... U7: PCA9538D (Portexpander) I2C device found at address 0x7C = B0111.1100 = B1111.100x ... U6: PCA8574D (Portexpander) ??? */ #include #include #include #include const uint32_t i2cFreq [] = {100000, 400000}; const uint8_t ANZAHLFREQ = sizeof(i2cFreq) / sizeof(i2cFreq[0]); OutputPin userLed0; void setup() { Serial2.swap(1); // PF4 TXD2 / PF5 RXD2 Serial2.begin(250000); Serial2.println("\nuC Reset #### ####"); userLed0.init(); Wire.begin(); scanI2C(Serial2, 0); } void loop (void) { scanI2C(Serial2, 5000); heartbeat(userLed0, 1000); } void scanI2C (Stream &out, const unsigned long interval) { bool deviceFound {false}; static unsigned long lastMillis {0}; if (millis() - lastMillis >= interval) { lastMillis += interval; out.print(F("\naddr ")); for (auto &i : i2cFreq) { out.print(i/1000); out.print(" "); } out.println(F("kHz")); for (uint8_t addr = 1; addr < 127; addr++ ) { for (uint8_t i = 0; i < ANZAHLFREQ; i++) { Wire.setClock(i2cFreq[i]); uint8_t error = checkI2CAddr(addr); if((error == 0) && (i2cFreq[i] == i2cFreq[0])) { deviceFound = true; out.print(F("0x")); if (addr < 16) { out.print(F("0")); } out.print(addr, HEX); out.print(F(" ")); } if (deviceFound && error == 0) { out.print(F("x ")); } if (deviceFound && error != 0) { out.print(F(" ")); } if (deviceFound && (i >= ANZAHLFREQ-1)) { out.println(); deviceFound = false; } } } } } byte checkI2CAddr (const uint8_t addr) { // The i2c_scanner uses the return value of // the Write.endTransmisstion to see if // a device did acknowledge to the address. Wire.beginTransmission(addr); const byte error = Wire.endTransmission(); if (error >= 0x04) { delay(5); // give the device x [ms] } return error; } void showTWIRegister (Stream &out, const unsigned long interval) { static unsigned long lastMillis {0}; if (millis() - lastMillis >= interval) { lastMillis += interval; out.println("TWI0"); out.print("CTRLA: "); formatBIN(out, TWI0.CTRLA, true); out.print(" "); formatHEXln(out, (uint16_t)&TWI0.CTRLA, true); out.print("MCTRLA: "); formatBIN(out, TWI0.MCTRLA, true); out.print(" "); formatHEXln(out, (uint16_t)&TWI0.MCTRLA, true); out.print("MSTATUS: "); formatBIN(out, TWI0.MSTATUS, true); out.print(" "); formatHEXln(out, (uint16_t)&TWI0.MSTATUS, true); out.print("MBAUD: "); formatBIN(out, TWI0.MBAUD, true); out.print(" "); formatHEX (out, (uint16_t)&TWI0.MBAUD, true); out.print(" "); out.println(TWI0.MBAUD); out.println(); } } template void heartbeat(T pin, const unsigned long interval) { static unsigned long lastMillis {0}; if (millis() - lastMillis >= interval) { lastMillis += interval; pin.toggle(); } }