Skip to content

Commit 5b9f361

Browse files
dpgeorgepfalcon
authored andcommitted
esp8266: Clean up bit-bang I2C implementation.
Changed from using set_sda_scl function to independent set_sda and set_scl functions.
1 parent 667d64b commit 5b9f361

1 file changed

Lines changed: 28 additions & 29 deletions

File tree

esp8266/modpybi2c.c

Lines changed: 28 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -40,44 +40,44 @@ typedef struct _pyb_i2c_obj_t {
4040
mp_obj_base_t base;
4141
pyb_pin_obj_t *scl;
4242
pyb_pin_obj_t *sda;
43-
uint8_t prev_sda;
44-
uint8_t prev_scl;
4543
} pyb_i2c_obj_t;
4644

4745
// these set the frequency of SCL
4846
#define mphal_i2c_wait_a() os_delay_us(2)
4947
#define mphal_i2c_wait_b() os_delay_us(1)
5048

51-
STATIC void mphal_i2c_set_sda_scl(pyb_i2c_obj_t *self, uint8_t sda, uint8_t scl) {
49+
STATIC void mphal_i2c_set_sda(pyb_i2c_obj_t *self, uint8_t sda) {
50+
uint32_t port = self->sda->phys_port;
5251
sda &= 0x01;
52+
gpio_output_set(sda << port, (1 - sda) << port, 1 << port, 0);
53+
}
54+
55+
STATIC void mphal_i2c_set_scl(pyb_i2c_obj_t *self, uint8_t scl) {
56+
uint32_t port = self->scl->phys_port;
5357
scl &= 0x01;
54-
self->prev_sda = sda;
55-
self->prev_scl = scl;
56-
gpio_output_set((sda << self->sda->phys_port) | (scl << self->scl->phys_port),
57-
((1 - sda) << self->sda->phys_port) | ((1 - scl) << self->scl->phys_port),
58-
(1 << self->sda->phys_port) | (1 << self->scl->phys_port), 0);
58+
gpio_output_set(scl << port, (1 - scl) << port, 1 << port, 0);
5959
}
6060

6161
STATIC int mphal_i2c_get_sda(pyb_i2c_obj_t *self) {
6262
return GPIO_INPUT_GET(GPIO_ID_PIN(self->sda->phys_port));
6363
}
6464

6565
STATIC void mphal_i2c_start(pyb_i2c_obj_t *self) {
66-
mphal_i2c_set_sda_scl(self, 1, self->prev_scl);
66+
mphal_i2c_set_sda(self, 1);
6767
mphal_i2c_wait_a();
68-
mphal_i2c_set_sda_scl(self, 1, 1);
68+
mphal_i2c_set_scl(self, 1);
6969
mphal_i2c_wait_a();
70-
mphal_i2c_set_sda_scl(self, 0, 1);
70+
mphal_i2c_set_sda(self, 0);
7171
mphal_i2c_wait_a();
7272
}
7373

7474
STATIC void mphal_i2c_stop(pyb_i2c_obj_t *self) {
7575
mphal_i2c_wait_a();
76-
mphal_i2c_set_sda_scl(self, 0, self->prev_scl);
76+
mphal_i2c_set_sda(self, 0);
7777
mphal_i2c_wait_a();
78-
mphal_i2c_set_sda_scl(self, 0, 1);
78+
mphal_i2c_set_scl(self, 1);
7979
mphal_i2c_wait_a();
80-
mphal_i2c_set_sda_scl(self, 1, 1);
80+
mphal_i2c_set_sda(self, 1);
8181
mphal_i2c_wait_a();
8282
}
8383

@@ -102,25 +102,26 @@ STATIC void mphal_i2c_init(pyb_i2c_obj_t *self, uint32_t freq) {
102102
GPIO_REG_WRITE(GPIO_ENABLE_ADDRESS,
103103
GPIO_REG_READ(GPIO_ENABLE_ADDRESS) | (1 << scl->phys_port));
104104

105-
mphal_i2c_set_sda_scl(self, 1, 1);
105+
mphal_i2c_set_scl(self, 1);
106+
mphal_i2c_set_sda(self, 1);
106107

107108
ETS_GPIO_INTR_ENABLE();
108109
//ETS_INTR_UNLOCK();
109110

110-
mphal_i2c_set_sda_scl(self, 1, 0);
111+
mphal_i2c_set_scl(self, 0);
111112
mphal_i2c_wait_a();
112113

113114
// when SCL = 0, toggle SDA to clear up
114-
mphal_i2c_set_sda_scl(self, 0, 0);
115+
mphal_i2c_set_sda(self, 0);
115116
mphal_i2c_wait_a();
116-
mphal_i2c_set_sda_scl(self, 1, 0);
117+
mphal_i2c_set_sda(self, 1);
117118
mphal_i2c_wait_a();
118119

119120
// set data_cnt to max value
120121
for (uint8_t i = 0; i < 28; i++) {
121-
mphal_i2c_set_sda_scl(self, 1, 0);
122+
mphal_i2c_set_scl(self, 0);
122123
mphal_i2c_wait_a();
123-
mphal_i2c_set_sda_scl(self, 1, 1);
124+
mphal_i2c_set_scl(self, 1);
124125
mphal_i2c_wait_a();
125126
}
126127

@@ -134,34 +135,32 @@ STATIC int mphal_i2c_write_byte(pyb_i2c_obj_t *self, uint8_t val) {
134135

135136
mphal_i2c_wait_a();
136137

137-
mphal_i2c_set_sda_scl(self, self->prev_sda, 0);
138+
mphal_i2c_set_scl(self, 0);
138139
mphal_i2c_wait_a();
139140

140141
for (i = 7; i >= 0; i--) {
141142
dat = val >> i;
142-
mphal_i2c_set_sda_scl(self, dat, 0);
143+
mphal_i2c_set_sda(self, dat);
143144
mphal_i2c_wait_a();
144-
mphal_i2c_set_sda_scl(self, dat, 1);
145+
mphal_i2c_set_scl(self, 1);
145146
mphal_i2c_wait_a();
146147

147148
if (i == 0) {
148149
mphal_i2c_wait_b();
149150
}
150151

151-
mphal_i2c_set_sda_scl(self, dat, 0);
152+
mphal_i2c_set_scl(self, 0);
152153
mphal_i2c_wait_a();
153154
}
154155

155-
mphal_i2c_set_sda_scl(self, self->prev_sda, 0);
156-
mphal_i2c_wait_a();
157-
mphal_i2c_set_sda_scl(self, 1, 0);
156+
mphal_i2c_set_sda(self, 1);
158157
mphal_i2c_wait_a();
159-
mphal_i2c_set_sda_scl(self, 1, 1);
158+
mphal_i2c_set_scl(self, 1);
160159
mphal_i2c_wait_a();
161160

162161
int ret = mphal_i2c_get_sda(self);
163162
mphal_i2c_wait_a();
164-
mphal_i2c_set_sda_scl(self, 1, 0);
163+
mphal_i2c_set_scl(self, 0);
165164
mphal_i2c_wait_a();
166165

167166
return !ret;

0 commit comments

Comments
 (0)