Warning
This page is located in archive.

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)
    {
        // 
    }
}

courses/b2m37mam/priklady/stm32/99-sw_i2c.txt · Last modified: 2023/09/07 15:24 by nentvond