Quellcode durchsuchen

Support more F_BUS speeds

main
PaulStoffregen vor 9 Jahren
Ursprung
Commit
c6dd45f5c2
3 geänderte Dateien mit 158 neuen und 33 gelöschten Zeilen
  1. +75
    -2
      Wire.cpp
  2. +82
    -30
      Wire.h
  3. +1
    -1
      examples/Scanner/Scanner.ino

+ 75
- 2
Wire.cpp Datei anzeigen

void TwoWire::setClock(uint32_t frequency) void TwoWire::setClock(uint32_t frequency)
{ {
if (!(SIM_SCGC4 & SIM_SCGC4_I2C0)) return; if (!(SIM_SCGC4 & SIM_SCGC4_I2C0)) return;
#if F_BUS == 60000000

#if F_BUS == 120000000
if (frequency < 400000) {
I2C0_F = I2C_F_DIV1152; // 104 kHz
} else if (frequency < 1000000) {
I2C0_F = I2C_F_DIV288; // 416 kHz
} else {
I2C0_F = I2C_F_DIV128; // 0.94 MHz
}
I2C0_FLT = 4;
#elif F_BUS == 108000000
if (frequency < 400000) {
I2C0_F = I2C_F_DIV1024; // 105 kHz
} else if (frequency < 1000000) {
I2C0_F = I2C_F_DIV256; // 422 kHz
} else {
I2C0_F = I2C_F_DIV112; // 0.96 MHz
}
I2C0_FLT = 4;
#elif F_BUS == 96000000
if (frequency < 400000) {
I2C0_F = I2C_F_DIV960; // 100 kHz
} else if (frequency < 1000000) {
I2C0_F = I2C_F_DIV240; // 400 kHz
} else {
I2C0_F = I2C_F_DIV96; // 1.0 MHz
}
I2C0_FLT = 4;
#elif F_BUS == 90000000
if (frequency < 400000) {
I2C0_F = I2C_F_DIV896; // 100 kHz
} else if (frequency < 1000000) {
I2C0_F = I2C_F_DIV224; // 402 kHz
} else {
I2C0_F = I2C_F_DIV88; // 1.02 MHz
}
I2C0_FLT = 4;
#elif F_BUS == 80000000
if (frequency < 400000) {
I2C0_F = I2C_F_DIV768; // 104 kHz
} else if (frequency < 1000000) {
I2C0_F = I2C_F_DIV192; // 416 kHz
} else {
I2C0_F = I2C_F_DIV80; // 1.0 MHz
}
I2C0_FLT = 4;
#elif F_BUS == 72000000
if (frequency < 400000) {
I2C0_F = I2C_F_DIV640; // 112 kHz
} else if (frequency < 1000000) {
I2C0_F = I2C_F_DIV192; // 375 kHz
} else {
I2C0_F = I2C_F_DIV72; // 1.0 MHz
}
I2C0_FLT = 4;
#elif F_BUS == 64000000
if (frequency < 400000) {
I2C0_F = I2C_F_DIV640; // 100 kHz
} else if (frequency < 1000000) {
I2C0_F = I2C_F_DIV160; // 400 kHz
} else {
I2C0_F = I2C_F_DIV64; // 1.0 MHz
}
I2C0_FLT = 4;
#elif F_BUS == 60000000
if (frequency < 400000) { if (frequency < 400000) {
I2C0_F = 0x2C; // 104 kHz I2C0_F = 0x2C; // 104 kHz
} else if (frequency < 1000000) { } else if (frequency < 1000000) {
I2C0_F = 0x0E; // 1 MHz I2C0_F = 0x0E; // 1 MHz
} }
I2C0_FLT = 4; I2C0_FLT = 4;
#elif F_BUS == 54000000
if (frequency < 400000) {
I2C0_F = I2C_F_DIV512; // 105 kHz
} else if (frequency < 1000000) {
I2C0_F = I2C_F_DIV128; // 422 kHz
} else {
I2C0_F = I2C_F_DIV56; // 0.96 MHz
}
I2C0_FLT = 4;
#elif F_BUS == 48000000 #elif F_BUS == 48000000
if (frequency < 400000) { if (frequency < 400000) {
I2C0_F = 0x27; // 100 kHz I2C0_F = 0x27; // 100 kHz
I2C0_F = 0x00; // 100 kHz I2C0_F = 0x00; // 100 kHz
I2C0_FLT = 1; I2C0_FLT = 1;
#else #else
#error "F_BUS must be 60, 56, 48, 40, 36, 24, 16, 8, 4 or 2 MHz"
#error "F_BUS must be 120, 108, 96, 9, 80, 72, 64, 60, 56, 54, 48, 40, 36, 24, 16, 8, 4 or 2 MHz"
#endif #endif
} }



+ 82
- 30
Wire.h Datei anzeigen

inline TWBRemulation & operator = (int val) __attribute__((always_inline)) { inline TWBRemulation & operator = (int val) __attribute__((always_inline)) {
if (val == 12 || val == ((F_CPU / 400000) - 16) / 2) { // 22, 52, 112 if (val == 12 || val == ((F_CPU / 400000) - 16) / 2) { // 22, 52, 112
I2C0_C1 = 0; I2C0_C1 = 0;
#if F_BUS == 60000000
I2C0_F = 0x1C; // 416 kHz
#if F_BUS == 120000000
I2C0_F = I2C_F_DIV288; // 416 kHz
#elif F_BUS == 108000000
I2C0_F = I2C_F_DIV256; // 422 kHz
#elif F_BUS == 96000000
I2C0_F = I2C_F_DIV240; // 400 kHz
#elif F_BUS == 90000000
I2C0_F = I2C_F_DIV224; // 402 kHz
#elif F_BUS == 80000000
I2C0_F = I2C_F_DIV192; // 416 kHz
#elif F_BUS == 72000000
I2C0_F = I2C_F_DIV192; // 375 kHz
#elif F_BUS == 64000000
I2C0_F = I2C_F_DIV160; // 400 kHz
#elif F_BUS == 60000000
I2C0_F = I2C_F_DIV144; // 416 kHz
#elif F_BUS == 56000000 #elif F_BUS == 56000000
I2C0_F = 0x1C; // 389 kHz
I2C0_F = I2C_F_DIV144; // 389 kHz
#elif F_BUS == 54000000
I2C0_F = I2C_F_DIV128; // 422 kHz
#elif F_BUS == 48000000 #elif F_BUS == 48000000
I2C0_F = 0x1A; // 400 kHz
I2C0_F = I2C_F_DIV112; // 400 kHz
#elif F_BUS == 40000000 #elif F_BUS == 40000000
I2C0_F = 0x19; // 416 kHz
I2C0_F = I2C_F_DIV96; // 416 kHz
#elif F_BUS == 36000000 #elif F_BUS == 36000000
I2C0_F = 0x19; // 375 kHz
I2C0_F = I2C_F_DIV96; // 375 kHz
#elif F_BUS == 24000000 #elif F_BUS == 24000000
I2C0_F = 0x12; // 375 kHz
I2C0_F = I2C_F_DIV64; // 375 kHz
#elif F_BUS == 16000000 #elif F_BUS == 16000000
I2C0_F = 0x07; // 400 kHz
I2C0_F = I2C_F_DIV40; // 400 kHz
#elif F_BUS == 8000000 #elif F_BUS == 8000000
I2C0_F = 0x00; // 400 kHz
I2C0_F = I2C_F_DIV20; // 400 kHz
#elif F_BUS == 4000000 #elif F_BUS == 4000000
I2C0_F = 0x00; // 200 kHz
I2C0_F = I2C_F_DIV20; // 200 kHz
#elif F_BUS == 2000000
I2C0_F = I2C_F_DIV20; // 100 kHz
#endif #endif
I2C0_C1 = I2C_C1_IICEN; I2C0_C1 = I2C_C1_IICEN;
} else if (val == 72 || val == ((F_CPU / 100000) - 16) / 2) { // 112, 232, 472 } else if (val == 72 || val == ((F_CPU / 100000) - 16) / 2) { // 112, 232, 472
I2C0_C1 = 0; I2C0_C1 = 0;
#if F_BUS == 60000000
I2C0_F = 0x2C; // 104 kHz
#if F_BUS == 120000000
I2C0_F = I2C_F_DIV1152; // 104 kHz
#elif F_BUS == 108000000
I2C0_F = I2C_F_DIV1024; // 105 kHz
#elif F_BUS == 96000000
I2C0_F = I2C_F_DIV960; // 100 kHz
#elif F_BUS == 90000000
I2C0_F = I2C_F_DIV896; // 100 kHz
#elif F_BUS == 80000000
I2C0_F = I2C_F_DIV768; // 104 kHz
#elif F_BUS == 72000000
I2C0_F = I2C_F_DIV640; // 112 kHz
#elif F_BUS == 64000000
I2C0_F = I2C_F_DIV640; // 100 kHz
#elif F_BUS == 60000000
I2C0_F = I2C_F_DIV576; // 104 kHz
#elif F_BUS == 56000000 #elif F_BUS == 56000000
I2C0_F = 0x2B; // 109 kHz
I2C0_F = I2C_F_DIV512; // 109 kHz
#elif F_BUS == 54000000
I2C0_F = I2C_F_DIV512; // 105 kHz
#elif F_BUS == 48000000 #elif F_BUS == 48000000
I2C0_F = 0x27; // 100 kHz
I2C0_F = I2C_F_DIV480; // 100 kHz
#elif F_BUS == 40000000 #elif F_BUS == 40000000
I2C0_F = 0x29; // 104 kHz
I2C0_F = I2C_F_DIV384; // 104 kHz
#elif F_BUS == 36000000 #elif F_BUS == 36000000
I2C0_F = 0x28; // 113 kHz
I2C0_F = I2C_F_DIV320; // 113 kHz
#elif F_BUS == 24000000 #elif F_BUS == 24000000
I2C0_F = 0x1F; // 100 kHz
I2C0_F = I2C_F_DIV240; // 100 kHz
#elif F_BUS == 16000000 #elif F_BUS == 16000000
I2C0_F = 0x20; // 100 kHz
I2C0_F = I2C_F_DIV160; // 100 kHz
#elif F_BUS == 8000000 #elif F_BUS == 8000000
I2C0_F = 0x14; // 100 kHz
I2C0_F = I2C_F_DIV80; // 100 kHz
#elif F_BUS == 4000000 #elif F_BUS == 4000000
I2C0_F = 0x07; // 100 kHz
I2C0_F = I2C_F_DIV40; // 100 kHz
#elif F_BUS == 2000000 #elif F_BUS == 2000000
I2C0_F = 0x00; // 100 kHz
I2C0_F = I2C_F_DIV20; // 100 kHz
#endif #endif
I2C0_C1 = I2C_C1_IICEN; I2C0_C1 = I2C_C1_IICEN;
} }
return *this; return *this;
} }
inline operator int () const __attribute__((always_inline)) { inline operator int () const __attribute__((always_inline)) {
#if F_BUS == 60000000
if (I2C0_F == 0x1C) return 12;
#if F_BUS == 120000000
if (I2C0_F == I2C_F_DIV288) return 12;
#elif F_BUS == 108000000
if (I2C0_F == I2C_F_DIV256) return 12;
#elif F_BUS == 96000000
if (I2C0_F == I2C_F_DIV240) return 12;
#elif F_BUS == 90000000
if (I2C0_F == I2C_F_DIV224) return 12;
#elif F_BUS == 80000000
if (I2C0_F == I2C_F_DIV192) return 12;
#elif F_BUS == 72000000
if (I2C0_F == I2C_F_DIV192) return 12;
#elif F_BUS == 64000000
if (I2C0_F == I2C_F_DIV160) return 12;
#elif F_BUS == 60000000
if (I2C0_F == I2C_F_DIV144) return 12;
#elif F_BUS == 56000000
if (I2C0_F == I2C_F_DIV144) return 12;
#elif F_BUS == 54000000
if (I2C0_F == I2C_F_DIV128) return 12;
#elif F_BUS == 48000000 #elif F_BUS == 48000000
if (I2C0_F == 0x1A) return 12;
if (I2C0_F == I2C_F_DIV112) return 12;
#elif F_BUS == 40000000 #elif F_BUS == 40000000
if (I2C0_F == 0x19) return 12;
if (I2C0_F == I2C_F_DIV96) return 12;
#elif F_BUS == 36000000 #elif F_BUS == 36000000
if (I2C0_F == 0x19) return 12;
if (I2C0_F == I2C_F_DIV96) return 12;
#elif F_BUS == 24000000 #elif F_BUS == 24000000
if (I2C0_F == 0x12) return 12;
if (I2C0_F == I2C_F_DIV64) return 12;
#elif F_BUS == 16000000 #elif F_BUS == 16000000
if (I2C0_F == 0x07) return 12;
if (I2C0_F == I2C_F_DIV40) return 12;
#elif F_BUS == 8000000 #elif F_BUS == 8000000
if (I2C0_F == 0x00) return 12;
if (I2C0_F == I2C_F_DIV20) return 12;
#elif F_BUS == 4000000 #elif F_BUS == 4000000
if (I2C0_F == 0x00) return 12;
if (I2C0_F == I2C_F_DIV20) return 12;
#endif #endif
return 72; return 72;
} }

+ 1
- 1
examples/Scanner/Scanner.ino Datei anzeigen

case 0x01: Serial.print(F("AS3935")); break; case 0x01: Serial.print(F("AS3935")); break;
case 0x02: Serial.print(F("AS3935")); break; case 0x02: Serial.print(F("AS3935")); break;
case 0x03: Serial.print(F("AS3935")); break; case 0x03: Serial.print(F("AS3935")); break;
case 0x0A: Serial.print(F("SGTL5000")); break;
case 0x0A: Serial.print(F("SGTL5000")); break; // MCLK required
case 0x0B: Serial.print(F("SMBusBattery?")); break; case 0x0B: Serial.print(F("SMBusBattery?")); break;
case 0x0C: Serial.print(F("AK8963")); break; case 0x0C: Serial.print(F("AK8963")); break;
case 0x10: Serial.print(F("CS4272")); break; case 0x10: Serial.print(F("CS4272")); break;

Laden…
Abbrechen
Speichern