Browse Source

Support more F_BUS speeds

main
PaulStoffregen 8 years ago
parent
commit
c6dd45f5c2
3 changed files with 158 additions and 33 deletions
  1. +75
    -2
      Wire.cpp
  2. +82
    -30
      Wire.h
  3. +1
    -1
      examples/Scanner/Scanner.ino

+ 75
- 2
Wire.cpp View File

@@ -85,7 +85,71 @@ void TwoWire::begin(void)
void TwoWire::setClock(uint32_t frequency)
{
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) {
I2C0_F = 0x2C; // 104 kHz
} else if (frequency < 1000000) {
@@ -103,6 +167,15 @@ void TwoWire::setClock(uint32_t frequency)
I2C0_F = 0x0E; // 1 MHz
}
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
if (frequency < 400000) {
I2C0_F = 0x27; // 100 kHz
@@ -166,7 +239,7 @@ void TwoWire::setClock(uint32_t frequency)
I2C0_F = 0x00; // 100 kHz
I2C0_FLT = 1;
#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
}


+ 82
- 30
Wire.h View File

@@ -110,70 +110,122 @@ public:
inline TWBRemulation & operator = (int val) __attribute__((always_inline)) {
if (val == 12 || val == ((F_CPU / 400000) - 16) / 2) { // 22, 52, 112
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
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
I2C0_F = 0x1A; // 400 kHz
I2C0_F = I2C_F_DIV112; // 400 kHz
#elif F_BUS == 40000000
I2C0_F = 0x19; // 416 kHz
I2C0_F = I2C_F_DIV96; // 416 kHz
#elif F_BUS == 36000000
I2C0_F = 0x19; // 375 kHz
I2C0_F = I2C_F_DIV96; // 375 kHz
#elif F_BUS == 24000000
I2C0_F = 0x12; // 375 kHz
I2C0_F = I2C_F_DIV64; // 375 kHz
#elif F_BUS == 16000000
I2C0_F = 0x07; // 400 kHz
I2C0_F = I2C_F_DIV40; // 400 kHz
#elif F_BUS == 8000000
I2C0_F = 0x00; // 400 kHz
I2C0_F = I2C_F_DIV20; // 400 kHz
#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
I2C0_C1 = I2C_C1_IICEN;
} else if (val == 72 || val == ((F_CPU / 100000) - 16) / 2) { // 112, 232, 472
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
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
I2C0_F = 0x27; // 100 kHz
I2C0_F = I2C_F_DIV480; // 100 kHz
#elif F_BUS == 40000000
I2C0_F = 0x29; // 104 kHz
I2C0_F = I2C_F_DIV384; // 104 kHz
#elif F_BUS == 36000000
I2C0_F = 0x28; // 113 kHz
I2C0_F = I2C_F_DIV320; // 113 kHz
#elif F_BUS == 24000000
I2C0_F = 0x1F; // 100 kHz
I2C0_F = I2C_F_DIV240; // 100 kHz
#elif F_BUS == 16000000
I2C0_F = 0x20; // 100 kHz
I2C0_F = I2C_F_DIV160; // 100 kHz
#elif F_BUS == 8000000
I2C0_F = 0x14; // 100 kHz
I2C0_F = I2C_F_DIV80; // 100 kHz
#elif F_BUS == 4000000
I2C0_F = 0x07; // 100 kHz
I2C0_F = I2C_F_DIV40; // 100 kHz
#elif F_BUS == 2000000
I2C0_F = 0x00; // 100 kHz
I2C0_F = I2C_F_DIV20; // 100 kHz
#endif
I2C0_C1 = I2C_C1_IICEN;
}
return *this;
}
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
if (I2C0_F == 0x1A) return 12;
if (I2C0_F == I2C_F_DIV112) return 12;
#elif F_BUS == 40000000
if (I2C0_F == 0x19) return 12;
if (I2C0_F == I2C_F_DIV96) return 12;
#elif F_BUS == 36000000
if (I2C0_F == 0x19) return 12;
if (I2C0_F == I2C_F_DIV96) return 12;
#elif F_BUS == 24000000
if (I2C0_F == 0x12) return 12;
if (I2C0_F == I2C_F_DIV64) return 12;
#elif F_BUS == 16000000
if (I2C0_F == 0x07) return 12;
if (I2C0_F == I2C_F_DIV40) return 12;
#elif F_BUS == 8000000
if (I2C0_F == 0x00) return 12;
if (I2C0_F == I2C_F_DIV20) return 12;
#elif F_BUS == 4000000
if (I2C0_F == 0x00) return 12;
if (I2C0_F == I2C_F_DIV20) return 12;
#endif
return 72;
}

+ 1
- 1
examples/Scanner/Scanner.ino View File

@@ -91,7 +91,7 @@ void printKnownChips(byte address)
case 0x01: Serial.print(F("AS3935")); break;
case 0x02: 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 0x0C: Serial.print(F("AK8963")); break;
case 0x10: Serial.print(F("CS4272")); break;

Loading…
Cancel
Save