IIC-Beispielcode

#enthalten “IIC.h”

//————-Verzögerungszeit_us——————————-
ungültig VERZÖGERUNG(u16 t)
{
während (T != 0)
T–;
}

/*void IIC_Start(Leere) */
{
SDA = 1;
SCL = 1;
VERZÖGERUNG(VERZÖGERUNGSZEIT);
SDA = 0;
VERZÖGERUNG(VERZÖGERUNGSZEIT);
SCL = 0;
}

/* void IIC_Stop(Leere) */
{
SCL = 0;
SDA = 0;
VERZÖGERUNG(VERZÖGERUNGSZEIT);
SCL = 1;
VERZÖGERUNG(VERZÖGERUNGSZEIT);
SDA = 1;
}

/*
unsigniertes Zeichen IIC_Wait_Ack(Leere) */
{
u8 rec = 0;

VERZÖGERUNG(VERZÖGERUNGSZEIT); //
SDA = 1; //
SCL = 1;
VERZÖGERUNG(VERZÖGERUNGSZEIT);
rec = SDA;
SCL = 0; //
VERZÖGERUNG(VERZÖGERUNGSZEIT);

Rückkehr empf;
}

/* void IIC_Ack(Leere) */
{
SCL = 0;
SDA = 0;
VERZÖGERUNG(VERZÖGERUNGSZEIT);
SCL = 1;
VERZÖGERUNG(VERZÖGERUNGSZEIT);
SCL = 0;
VERZÖGERUNG(VERZÖGERUNGSZEIT);
}

/* void IIC_NAck(Leere) */
{
SCL = 0;
SDA = 1;
VERZÖGERUNG(VERZÖGERUNGSZEIT);
SCL = 1;
VERZÖGERUNG(VERZÖGERUNGSZEIT);
SCL = 0;
VERZÖGERUNG(VERZÖGERUNGSZEIT);
}


/*
void IIC_Send_Byte(u8 txd) */
{
u8 i;

für(ich = 0; ich < 8; i++)
{
SDA = (txd & 0x80) >> 7; //
txd <<= 1;
VERZÖGERUNG(VERZÖGERUNGSZEIT);
SCL = 1;
VERZÖGERUNG(VERZÖGERUNGSZEIT);
SCL = 0;
VERZÖGERUNG(VERZÖGERUNGSZEIT);
}
}

/*
u8 IIC_Read_Byte(Leere)*/
{
u8 i, rec = 0;

SDA = 1; //
für(ich = 0; ich < 8; i++)
{
SCL = 0;
VERZÖGERUNG(VERZÖGERUNGSZEIT);
SCL = 1;
empf <<= 1;
Wenn(SDA) empf |= 1; //
VERZÖGERUNG(VERZÖGERUNGSZEIT);
}

Rückkehr empf;
}
#enthalten “XGZP6897D.h”

//u8 temp_a5;

//————-Schreiben Sie ein Byte Daten,Daten vom MASTER zum SLAVER ——————————

//————-SLAVER-Adressbit:01101101——————————-
void Write_One_Byte(u8 Adr, u8 die Daten) //Schreiben “die Daten” an die Adresse des Sklavenhändlers “Adr”

{
IIC_Start(); //IIC-START
IIC_Send_Byte(0xDA); //IIC WRITE-Vorgang,SLAVER-Adresse

IIC_Wait_Ack();
IIC_Send_Byte(Adr); /*Adresse*/
IIC_Wait_Ack();
IIC_Send_Byte(die Daten); /*die Daten*/
IIC_Wait_Ack();
IIC_Stop(); //IIC STOP
}


//————-Ein Byte Daten gelesen,Daten vom SLAVER zum MASTER —————————-
u8 Read_One_Byte(u8 Adr)
{
u8 meine Daten;
IIC_Start();
IIC_Send_Byte(0xDA);
IIC_Wait_Ack();
IIC_Send_Byte(Adr);
IIC_Wait_Ack();
IIC_Start();
IIC_Send_Byte(0xDB); //IIC READ-Vorgang
IIC_Wait_Ack();
mydata = IIC_Read_Byte();
IIC_NAck(); //
IIC_Stop();
meine Daten zurückgeben;
}


//
XGZP_Start_Conversion ungültig()
{

Write_One_Byte(0x30, 0x0A); //deuten auf eine kombinierte Konvertierung hin
während ((Read_One_Byte(0x30) & 0x08) > 0);

}

//————-Schreiben Sie n Bytes an Daten—————————-
u8 software_i2c_Write_nByte(u8 SlaveAddress, u8 REG_Address, Nur u8, u8 *buf)
{
int i;

//
IIC_Start();

//
IIC_Send_Byte(SlaveAdresse);
IIC_Wait_Ack();

//
IIC_Send_Byte(REG_Adresse);
IIC_Wait_Ack();

//
für (ich = 0; ich < len; i++) {
IIC_Send_Byte(buf[ich]);
Wenn (IIC_Wait_Ack() == FEHLGESCHLAGEN) {
IIC_Stop();
Rückgabe fehlgeschlagen;
}
}

//
IIC_Stop();
Rückkehr ERFOLGREICH;
}

//————-Lesen Sie n Bytes an Daten—————————-
u8 software_i2c_Read_nByte(u8 SlaveAddress, u8 REG_Address, Nur u8, u8 *buf)
{
//
IIC_Start();

//
IIC_Send_Byte(SlaveAdresse);
IIC_Wait_Ack();

//
IIC_Send_Byte(REG_Adresse);
IIC_Wait_Ack();

//
IIC_Start();

//
IIC_Send_Byte(SlaveAdresse + 1);
IIC_Wait_Ack();

//
während (len) {
//
*buf = IIC_Read_Byte();
//
Wenn (Länge == 1)
IIC_NAck();
//
anders
IIC_Ack();
//
buf++;
//
len–;
}

//
IIC_Stop();

Rückkehr ERFOLGREICH;
}

//————-Lesen Sie drei Bytes Druckdaten—————————-
u8 Read_Pressure_ThreeBytes(u8 *Druck_H, u8 *Druck_M, u8 *Druck_L)
{
u8-Puffer[3];
u8 Ergebnis;

Ergebnis = software_i2c_Read_nByte(0xDA, 0x06, 3, Puffer); //

Wenn(Ergebnis == ERFOLGREICH) {
*Druck_H = Puffer[0]; //
*Druck_M = Puffer[1]; //
*Druck_L = Puffer[2]; //
Rückkehr ERFOLGREICH;
} anders {
Rückgabe fehlgeschlagen;
}
}

Leere Hauptleitung()
{
SensorData *p_sensor_data = &sensor_data; //
p_sensor_data->Druck_k = 8192;

LCD1602_Heat(); //
LCD1602_show_string(3, 0, “Druck”); //

während(1)
{
Write_One_Byte(0x30, 0x0A); //deuten auf eine kombinierte Konvertierung hin
// während ((Read_One_Byte(0x30) & 0x08) > 0);
Verzögerung_ms(10);

//
Wenn(Read_Pressure_ThreeBytes(&p_sensor_data->Druck_H,
&p_sensor_data->Druck_M,
&p_sensor_data->Druck_L) == ERFOLGREICH)
{
//
p_sensor_data->Druck_AD = (unsigniert lang)((((unsigniert lang)p_sensor_data->Druck_H) << 16) |
(((unsigned int)p_sensor_data->Druck_M) << 8) |
((unsigniertes Zeichen)p_sensor_data->Druck_L));

//
p_sensor_data->Druck = (p_sensor_data->Druck_AD > 8388608) ?
(doppelt)((p_sensor_data->Druck_AD – 16777216) / (doppelt)(p_sensor_data->Druck_k)) :
(doppelt)(p_sensor_data->Druck_AD / (doppelt)(p_sensor_data->Druck_k));

//
Wenn (is_zero_point_set)
{
Zero_Point_Pressure = p_sensor_data->Druck; //
is_zero_point_set = 0; //
}

p_sensor_data->Druck -= Nullpunktdruck;

//
Wenn (p_sensor_data->Druck > 1000.0) {
//
p_sensor_data->Druck /= 1000.0;
float_to_str(p_sensor_data->P_buffer, p_sensor_data->Druck, 2, ” kPa”);
} anders {
float_to_str(p_sensor_data->P_buffer, p_sensor_data->Druck, 2, ” Pa”);
}

LCD1602_show_string(3, 1, p_sensor_data->P_buffer);
}
anders
{
//
LCD1602_show_string(3, 1, “LESEFEHLER”);
}

Verzögerung_ms(200); //
}
}