Display_Avr_3/i2c.c
Андрей Деркачев 4df52b2ab6 c++ > c
Переписал на С, возникает undefined reference, попробую ночью дофиксить.
2023-06-25 17:58:24 +00:00

136 lines
1.8 KiB
C

#define F_CPU 7372800UL
#include <avr/io.h>
#include <util/delay.h>
#include <stdlib.h>
#include "i2c.h"
BYTE i2c_stop(void)
{
BYTE error = 0;
NULL_SCL();
I2C_DELAY();
NULL_SDA();
I2C_DELAY();
ONE_SCL();
I2C_DELAY();
ONE_SDA();
I2C_DELAY();
if((I2C_PIN & (1 << I2C_SDA)) == 0) error = 2;
if((I2C_PIN & (1 << I2C_SCL)) == 0) error |= 1;
I2C_DELAY();
I2C_DELAY();
I2C_DELAY();
I2C_DELAY();
return error;
}
void i2c_start(void)
{
NULL_SDA();
I2C_DELAY();
NULL_SCL();
I2C_DELAY();
}
void i2c_restart(void)
{
ONE_SDA();
I2C_DELAY();
ONE_SCL();
I2C_DELAY();
NULL_SDA();
I2C_DELAY();
NULL_SCL();
I2C_DELAY();
}
void i2c_init(void)
{
ONE_SDA();
ONE_SCL();
i2c_stop();
}
BYTE i2c_send_byte(BYTE data)
{
BYTE i;
BYTE ask = ACK;
for(i = 0; i < 8; i++)
{
if((data & 0x80) == 0)
{
NULL_SDA();
}
else
{
ONE_SDA();
}
I2C_DELAY();
ONE_SCL();
I2C_DELAY();
NULL_SCL();
data = (data << 1);
}
ONE_SDA();
I2C_DELAY();
ONE_SCL();
I2C_DELAY();
if((I2C_PIN & (1 << I2C_SDA)) == (1 << I2C_SDA))
{
ask = NACK;
}
else
{
ask = ACK;
}
NULL_SCL();
return ask;
}
BYTE i2c_read_byte(BYTE ask)
{
BYTE byte = 0;
BYTE i;
ONE_SDA();
for(i = 0; i < 8; i++)
{
byte = (byte << 1);
ONE_SCL();
I2C_DELAY();
if((I2C_PIN & (1 << I2C_SDA)) == (1 << I2C_SDA)) byte |= 0x01;
NULL_SCL();
I2C_DELAY();
}
if(ask == ACK)
{
NULL_SDA();
}
else
{
ONE_SDA();
}
I2C_DELAY();
ONE_SCL();
I2C_DELAY();
NULL_SCL();
I2C_DELAY();
ONE_SDA();
return byte;
}