Revision b4885314 boards/LightRing/board.c

View differences:

boards/LightRing/board.c
64 64

  
65 65
}
66 66

  
67
inline void boardClearI2CBus(const uint8_t scl_pad) {
67
inline void boardClearI2CBus(const uint8_t scl_pad, const uint8_t sda_pad) {
68 68

  
69 69
  uint8_t i;
70 70

  
71
  // configure I²C SCL open drain
71
  // configure I²C SCL and SDA open drain
72 72
  palSetPadMode(GPIOB, scl_pad, PAL_MODE_OUTPUT_OPENDRAIN);
73
  palSetPadMode(GPIOB, sda_pad, PAL_MODE_OUTPUT_OPENDRAIN);
73 74

  
74
  // perform bus clear as per I²C Specification v5 3.1.16
75
  for (i = 0x00u; i < 0x09u; i++) {
75
  // perform a 2-wire software reset for the eeprom (see AT24C01BN-SH-B datasheet, chapter 3)
76
  // note: clock is ~50kHz (20us per cycle)
77
  palSetPad(GPIOB, sda_pad);
78
  palClearPad(GPIOB, scl_pad);
79
  chThdSleepMicroseconds(10);
80
  palSetPad(GPIOB, scl_pad);
81
  chThdSleepMicroseconds(5);
82
  palClearPad(GPIOB, sda_pad);
83
  chThdSleepMicroseconds(5);
84
  palClearPad(GPIOB, scl_pad);
85
  chThdSleepMicroseconds(5);
86
  palSetPad(GPIOB, sda_pad);
87
  chThdSleepMicroseconds(5);
88
  for (i = 0; i < 9; ++i) {
89
    palSetPad(GPIOB, scl_pad);
90
    chThdSleepMicroseconds(10);
91
    palClearPad(GPIOB, scl_pad);
92
    chThdSleepMicroseconds(10);
93
  }
94
  palSetPad(GPIOB, scl_pad);
95
  chThdSleepMicroseconds(5);
96
  palClearPad(GPIOB, sda_pad);
97
  chThdSleepMicroseconds(5);
98
  palClearPad(GPIOB, scl_pad);
99
  chThdSleepMicroseconds(10);
100
  palSetPad(GPIOB, scl_pad);
101
  chThdSleepMicroseconds(5);
102
  palSetPad(GPIOB, sda_pad);
103
  chThdSleepMicroseconds(5);
104
  palClearPad(GPIOB, scl_pad);
105
  chThdSleepMicroseconds(10);
106

  
107
  // perform bus clear as per I²C Specification v6 3.1.16
108
  // note: clock is 100kHz (10us per cycle)
109
  for (i = 0; i < 10; i++) {
76 110
    palClearPad(GPIOB, scl_pad);
77 111
    chThdSleepMicroseconds(5);
78 112
    palSetPad(GPIOB, scl_pad);
......
81 115

  
82 116
  // reconfigure I²C SCL
83 117
  palSetPadMode(GPIOB, scl_pad, PAL_MODE_STM32_ALTERNATE_OPENDRAIN);
118
  palSetPadMode(GPIOB, sda_pad, PAL_MODE_STM32_ALTERNATE_OPENDRAIN);
84 119

  
120
  return;
85 121
}

Also available in: Unified diff