8.Master_I2C_PWM/i2c.h
2023-05-22 19:58:05 +03:00

112 lines
2.7 KiB
C

//
// 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();
//}