//Прием байта, если last_byte=0, то принимаем последний байт и подтверждение от мастера не нужно unsigned char i2c_rx_soft(unsigned char last_byte) { unsigned char i; unsigned char data=0; unsigned char mask=0x80; if(i2c_error_soft) return 0; sda_io(IN_LN); for(i=0;i<8;i++) { scl_set(1); if(in_sda()) data=data+mask; mask>>=1; scl_set(0); } sda_io(OUT_LN); if(last_byte) sda_set(0); else sda_set(1); scl_set(1); scl_set(0); return data; }
//Формирует условие "СТОП" void i2c_stop_soft(void) { sda_set(0); scl_set(1); sda_set(1); if(i2c_error_soft) i2c_init_soft(); }
void sht_start(void) { sda_output(); sda_set(0); scl_low(); scl_high(); sda_set(1); scl_low(); }
static uint16_t sht_readw(void) { uint8_t i; uint16_t r = 0; sda_input(); for(i = 0; i < 8; i++) { scl_high(); r |= sda_get()?(1<<i):0; scl_low(); } sda_output(); sda_set(0); scl_high(); scl_low(); sda_input(); for(i = 8; i < 16; i++) { scl_high(); r |= sda_get()?(1<<i):0; scl_low(); } return r; }
//Формирует условие "СТАРТ" void i2c_start_soft(void) { if(i2c_error_soft) return; scl_set(1); sda_set(0); scl_set(0); }
//Посылка байта void i2c_tx_soft(unsigned char byte) { unsigned char i; if(i2c_error_soft) return; for(i=0;i<8;i++) { if(byte&0x80) sda_set(1); else sda_set(0); scl_set(1); scl_set(0); byte<<=1; } sda_io(IN_LN); scl_set(1); i2c_error_soft=in_sda(); scl_set(0); sda_io(OUT_LN); }