112 lines
2.7 KiB
C
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();
|
|
//}
|