// // Created by FSB-PC on 22.05.2023. // #ifndef INC_8_PMW_I2C_H #define INC_8_PMW_I2C_H typedef struct { uint8_t address; // адрес устройства на шине I2C uint8_t data[32]; // буфер для передачи и приема данных uint8_t length; // длина передаваемых данных }; void i2c_begin(i2c_device_t *i2c){ TWBR = ((F_CPU / i2c->speed) - 16) / 2; TWAR = (i2c->address << 1); } void i2c_beginTransmission(i2c_device_t *i2c, uint8_t address){ TWCR = (1 << TWINT) | (1 << TWSTA) | (1 << TWEN); while (!(TWCR & (1 << TWINT))); TWDR = (address << 1); TWCR = (1 << TWINT) | (1 << TWEN); while (!(TWCR & (1 << TWINT))); i2c->address = address; } void i2c_write(i2c_device_t *i2c, uint8_t data){ TWDR = data; TWCR = (1 << TWINT) | (1 << TWEN); while (!(TWCR & (1 << TWINT))); } void i2c_read(i2c_device_t *i2c, uint8_t *data, uint8_t ack){ if (ack){ TWCR = (1 << TWINT) | (1 << TWEN) | (1 << TWEA); } else { TWCR = (1 << TWINT) | (1 << TWEN); } while (!(TWCR & (1 << TWINT))); *data = TWDR; } void i2c_endTransmission(i2c_device_t *i2c){ TWCR = (1 << TWINT) | (1 << TWEN) | (1 << TWSTO); } void i2c_sendByte(i2c_device_t *i2c, uint8_t address, uint8_t data){ i2c_beginTransmission(i2c, address); i2c_write(i2c, data); i2c_endTransmission(i2c); } #endif //INC_8_PMW_I2C_H //void i2c_begin(I2C *i2c) { // TWBR = ((F_CPU / i2c->speed) - 16) / 2; // TWAR = (i2c->address << 1); //} // //void i2c_beginTransmission(I2C *i2c, uint8_t address) { // TWCR = (1 << TWINT) | (1 << TWSTA) | (1 << TWEN); // while (!(TWCR & (1 << TWINT))); // // TWDR = (address << 1); // TWCR = (1 << TWINT) | (1 << TWEN); // while (!(TWCR & (1 << TWINT))); // i2c->address = address; //} // //void i2c_write(I2C *i2c, uint8_t data) { // TWDR = data; // TWCR = (1 << TWINT) | (1 << TWEN); // while (!(TWCR & (1 << TWINT))); //} // //void i2c_read(I2C *i2c, uint8_t *data, uint8_t ack) { // if (ack) { // TWCR = (1 << TWINT) | (1 << TWEN) | (1 << TWEA); // } else { // TWCR = (1 << TWINT) | (1 << TWEN); // } // while (!(TWCR & (1 << TWINT))); // *data = TWDR; //} // //void i2c_endTransmission(I2C *i2c) { // TWCR = (1 << TWINT) | (1 << TWEN) | (1 << TWSTO); //} // //void sendByte(uint8_t data) { // sendByteRaw(data); // _writes++; // if (_writes >= 16) { // endTransm(); // beginData(); // } //} // //void sendByteRaw(uint8_t data) { // i2c_write(data); //} // //void sendCommand(uint8_t cmd1) { // beginOneCommand(); // sendByteRaw(cmd1); // i2c_endTransmission(); //}