@@ -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
6161STATIC int mphal_i2c_get_sda (pyb_i2c_obj_t * self ) {
6262 return GPIO_INPUT_GET (GPIO_ID_PIN (self -> sda -> phys_port ));
6363}
6464
6565STATIC 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
7474STATIC 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