====== SW generované I2C ====== #define DEVICE_ADDR #define setbit(reg, bit) ((reg) |= (1U << (bit))) #define clearbit(reg, bit) ((reg) &= (~(1U << (bit)))) #define getbit(reg, bit) (((reg) & (1U << (bit))) >> (bit)) #define togglebit(reg, bit) ((reg) ^= (1U << (bit))) #define I2C_DELAY delay(10000); // zvolene piny musi byt v rezimu open-drain #define I2C_SET_SCL setbit(VAS_SCL_PIN); #define I2C_CLR_SCL clearbit(VAS_SCL_PIN); #define I2C_SET_SDA setbit(VAS_SDA_PIN); #define I2C_CLR_SDA clearbit(VAS_SDA_PIN); void delay(int ms) { volatile int i; for (i = 0; i < ms; i++); } void I2C_ReadBit(void) { I2C_SET_SDA I2C_DELAY // nastaveni SDA pinu na dig. vstup I2C_SET_SCL I2C_DELAY I2C_CLR_SCL // nastaveni SDA pinu na dig. vystup I2C_DELAY } void I2C_WriteBit(unsigned char c) { if(c > 0) I2C_SET_SDA else I2C_CLR_SDA I2C_DELAY I2C_SET_SCL I2C_DELAY I2C_CLR_SCL } void I2C_Init() { I2C_SET_SDA I2C_SET_SCL I2C_DELAY } void I2C_Start() { I2C_SET_SCL I2C_DELAY I2C_SET_SDA I2C_DELAY I2C_CLR_SDA I2C_DELAY I2C_CLR_SCL I2C_DELAY } void I2C_Stop() { I2C_DELAY I2C_CLR_SDA I2C_DELAY I2C_SET_SCL I2C_DELAY I2C_SET_SDA } unsigned char I2C_Write(unsigned char c) { for (char i = 0; i < 8; i++) { I2C_WriteBit(c & 128); c <<= 1; } I2C_SET_SDA return 0; } void I2C_Send(unsigned char addr, unsigned char reg, unsigned char data) { I2C_Start(); I2C_Write(addr); I2C_ReadBit(); // ACK I2C_Write(reg); I2C_ReadBit(); // ACK I2C_Write(data); I2C_ReadBit(); // ACK I2C_Stop(); } int main() { while(1) { // } }