STATIC constmp_rom_map_elem_t machine_i2c_locals_dict_table[]={{MP_ROM_QSTR(MP_QSTR_init),MP_ROM_PTR(&machine_i2c_init_obj)},{MP_ROM_QSTR(MP_QSTR_scan),MP_ROM_PTR(&machine_i2c_scan_obj)},// primitive I2C operations{MP_ROM_QSTR(MP_QSTR_start),MP_ROM_PTR(&machine_i2c_start_obj)},{MP_ROM_QSTR(MP_QSTR_stop),MP_ROM_PTR(&machine_i2c_stop_obj)},{MP_ROM_QSTR(MP_QSTR_readinto),MP_ROM_PTR(&machine_i2c_readinto_obj)},{MP_ROM_QSTR(MP_QSTR_write),MP_ROM_PTR(&machine_i2c_write_obj)},// standard bus operations{MP_ROM_QSTR(MP_QSTR_readfrom),MP_ROM_PTR(&machine_i2c_readfrom_obj)},{MP_ROM_QSTR(MP_QSTR_readfrom_into),MP_ROM_PTR(&machine_i2c_readfrom_into_obj)},{MP_ROM_QSTR(MP_QSTR_writeto),MP_ROM_PTR(&machine_i2c_writeto_obj)},{MP_ROM_QSTR(MP_QSTR_writevto),MP_ROM_PTR(&machine_i2c_writevto_obj)},// memory operations{MP_ROM_QSTR(MP_QSTR_readfrom_mem),MP_ROM_PTR(&machine_i2c_readfrom_mem_obj)},{MP_ROM_QSTR(MP_QSTR_readfrom_mem_into),MP_ROM_PTR(&machine_i2c_readfrom_mem_into_obj)},{MP_ROM_QSTR(MP_QSTR_writeto_mem),MP_ROM_PTR(&machine_i2c_writeto_mem_obj)},};
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
对外可以使用的函数,其实跟硬件I2C的相同,用户可以无感知的使用。
1、协议模拟函数
STATIC voidmp_hal_i2c_delay(machine_i2c_obj_t*self){// We need to use an accurate delay to get acceptable I2C// speeds (eg 1us should be not much more than 1us).//mp_hal_delay_us_fast(self->us_delay);mp_hal_delay_us_fast(2);}
STATIC voidmp_hal_i2c_scl_low(machine_i2c_obj_t*self){//mp_hal_pin_od_low(self->scl);IoTGpioSetDir(self->scl, IOT_GPIO_DIR_OUT);IoTGpioSetOutputVal(self->scl,0);}
STATIC intmp_hal_i2c_scl_release(machine_i2c_obj_t*self){uint32_t count = self->us_timeout;mp_hal_pin_od_high(self->scl);mp_hal_i2c_delay(self);// For clock stretching, wait for the SCL pin to be released, with timeout.for(;mp_hal_pin_open_get(self->scl)==0&& count;--count){mp_hal_delay_us_fast(1);}if(count ==0){return-MP_ETIMEDOUT;}return0;// success}
STATIC voidmp_hal_i2c_sda_low(machine_i2c_obj_t*self){mp_hal_pin_od_low(self->sda);}
STATIC voidmp_hal_i2c_sda_release(machine_i2c_obj_t*self){mp_hal_pin_od_high(self->sda);}
STATIC intmp_hal_i2c_sda_read(machine_i2c_obj_t*self){returnmp_hal_pin_open_get(self->sda);}
STATIC intmp_hal_i2c_start(machine_i2c_obj_t*self){mp_hal_i2c_sda_release(self);mp_hal_i2c_delay(self);int ret =mp_hal_i2c_scl_release(self);if(ret !=0){return ret;}mp_hal_i2c_sda_low(self);mp_hal_i2c_delay(self);return0;// success}
STATIC intmp_hal_i2c_stop(machine_i2c_obj_t*self){mp_hal_i2c_delay(self);mp_hal_i2c_sda_low(self);mp_hal_i2c_delay(self);int ret =mp_hal_i2c_scl_release(self);mp_hal_i2c_sda_release(self);mp_hal_i2c_delay(self);return ret;}
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
2、读写函数实现
// return value:// 0 - byte written and ack received// 1 - byte written and nack received// <0 - error, with errno being the negative of the return value
STATIC intmp_hal_i2c_write_byte(machine_i2c_obj_t*self,uint8_t val){mp_hal_i2c_delay(self);mp_hal_i2c_scl_low(self);for(int i =7; i >=0; i--){if((val >> i)&1){mp_hal_i2c_sda_release(self);}else{mp_hal_i2c_sda_low(self);}mp_hal_i2c_delay(self);int ret =mp_hal_i2c_scl_release(self);if(ret !=0){mp_hal_i2c_sda_release(self);return ret;}mp_hal_i2c_scl_low(self);}mp_hal_i2c_sda_release(self);mp_hal_i2c_delay(self);int ret =mp_hal_i2c_scl_release(self);if(ret !=0){return ret;}int ack =mp_hal_i2c_sda_read(self);mp_hal_i2c_delay(self);mp_hal_i2c_scl_low(self);return ack;}// return value:// 0 - success// <0 - error, with errno being the negative of the return value
STATIC intmp_hal_i2c_read_byte(machine_i2c_obj_t*self,uint8_t*val,int nack){mp_hal_i2c_delay(self);mp_hal_i2c_scl_low(self);mp_hal_i2c_delay(self);uint8_t data =0;for(int i =7; i >=0; i--){int ret =mp_hal_i2c_scl_release(self);if(ret !=0){return ret;}
data =(data <<1)|mp_hal_i2c_sda_read(self);mp_hal_i2c_scl_low(self);mp_hal_i2c_delay(self);}*val = data;// send ack/nack bitif(!nack){mp_hal_i2c_sda_low(self);}mp_hal_i2c_delay(self);int ret =mp_hal_i2c_scl_release(self);if(ret !=0){mp_hal_i2c_sda_release(self);return ret;}mp_hal_i2c_scl_low(self);mp_hal_i2c_sda_release(self);return0;// success}
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
3、关键函数举例
STATIC mp_obj_tmachine_i2c_scan(mp_obj_t self_in){mp_obj_base_t*self =MP_OBJ_TO_PTR(self_in);mp_obj_t list =mp_obj_new_list(0,NULL);// 7-bit addresses 0b0000xxx and 0b1111xxx are reservedfor(int addr =0x08; addr <0x78;++addr){int ret =mp_machine_i2c_writeto(self, addr,NULL,0, true);if(ret ==0){mp_obj_list_append(list,MP_OBJ_NEW_SMALL_INT(addr));}}return list;}