Exemple de code IIC

#inclure “IIC.h”

//————-délai time_us——————————-
Annuler le RETARD(u16 ans)
{
alors que (t != 0)
t–;
}

/*annuler IIC_Start(vide) */
{
SDA = 1;
SCL = 1;
RETARD(TEMPORISATION);
SDA = 0;
RETARD(TEMPORISATION);
SCL = 0;
}

/* annuler IIC_Stop(vide) */
{
SCL = 0;
SDA = 0;
RETARD(TEMPORISATION);
SCL = 1;
RETARD(TEMPORISATION);
SDA = 1;
}

/*
caractère non signé IIC_Wait_Ack(vide) */
{
u8 rec = 0;

RETARD(TEMPORISATION); //
SDA = 1; //
SCL = 1;
RETARD(TEMPORISATION);
rec = SDA;
SCL = 0; //
RETARD(TEMPORISATION);

retour d'enregistrement;
}

/* annuler IIC_Ack(vide) */
{
SCL = 0;
SDA = 0;
RETARD(TEMPORISATION);
SCL = 1;
RETARD(TEMPORISATION);
SCL = 0;
RETARD(TEMPORISATION);
}

/* annuler IIC_NAck(vide) */
{
SCL = 0;
SDA = 1;
RETARD(TEMPORISATION);
SCL = 1;
RETARD(TEMPORISATION);
SCL = 0;
RETARD(TEMPORISATION);
}


/*
annuler IIC_Send_Byte(u8) */
{
u8 je;

pour(je = 0; je < 8; je++)
{
SDA = (txd & 0x80) >> 7; //
txd <<= 1;
RETARD(TEMPORISATION);
SCL = 1;
RETARD(TEMPORISATION);
SCL = 0;
RETARD(TEMPORISATION);
}
}

/*
u8 IIC_Read_Byte(vide)*/
{
u8 je, enregistrement = 0;

SDA = 1; //
pour(je = 0; je < 8; je++)
{
SCL = 0;
RETARD(TEMPORISATION);
SCL = 1;
rec <<= 1;
si(SDA) rec |= 1; //
RETARD(TEMPORISATION);
}

retour d'enregistrement;
}
#inclure “XGZP6897D.h”

//u8 temp_a5;

//————-écrire un octet de données,Données du MAÎTRE vers l'ESCLAVE ——————————

//————-Bit d'adresse ESCLAVEUR:01101101——————————-
annuler Write_One_Byte(adresse u8, u8 les données) //Écrire “les données” à l’adresse de l’ESCLAVE “adresse”

{
IIC_Début(); //DÉBUT IIC
IIC_Send_Byte(0xDA); //Opération d'écriture IIC,Adresse de l'ESCLAVE

IIC_Wait_Ack();
IIC_Send_Byte(adresse); /*adresse*/
IIC_Wait_Ack();
IIC_Send_Byte(les données); /*les données*/
IIC_Wait_Ack();
IIC_Arrêter(); //ARRÊT IIC
}


//————-Lire un octet de données,Données de SLAVER vers MASTER —————————-
u8 Read_One_Byte(adresse u8)
{
u8 mes données;
IIC_Début();
IIC_Send_Byte(0xDA);
IIC_Wait_Ack();
IIC_Send_Byte(adresse);
IIC_Wait_Ack();
IIC_Début();
IIC_Send_Byte(0xDB); //Opération de lecture IIC
IIC_Wait_Ack();
mesdonnées = IIC_Read_Byte();
IIC_NAck(); //
IIC_Arrêter();
renvoyer mes données;
}


//
annuler XGZP_Start_Conversion()
{

Write_One_Byte(0x30, 0x0A); //indiquer une conversion combinée
alors que ((Read_One_Byte(0x30) & 0x08) > 0);

}

//————-Écrire n octets de données—————————-
logiciel u8_i2c_Write_nByte(Adresse de l'esclave u8, u8 REG_Adresse, u8 seulement, u8 *buf)
{
int je;

//
IIC_Début();

//
IIC_Send_Byte(Adresseesclave);
IIC_Wait_Ack();

//
IIC_Send_Byte(REG_Adresse);
IIC_Wait_Ack();

//
pour (je = 0; je < len; je++) {
IIC_Send_Byte(bouf[je]);
si (IIC_Wait_Ack() == ÉCHEC) {
IIC_Arrêter();
retour ÉCHEC;
}
}

//
IIC_Arrêter();
retour SUCCÈS;
}

//————-Lire n octets de données—————————-
logiciel u8_i2c_Read_nByte(Adresse de l'esclave u8, u8 REG_Adresse, u8 seulement, u8 *buf)
{
//
IIC_Début();

//
IIC_Send_Byte(Adresseesclave);
IIC_Wait_Ack();

//
IIC_Send_Byte(REG_Adresse);
IIC_Wait_Ack();

//
IIC_Début();

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

//
alors que (len) {
//
*buf = IIC_Read_Byte();
//
si (longueur == 1)
IIC_NAck();
//
autre
IIC_Ack();
//
buf++;
//
len–;
}

//
IIC_Arrêter();

retour SUCCÈS;
}

//————-Lire trois octets de données de pression—————————-
u8 Read_Pressure_ThreeBytes(u8 *pression_H, u8 *pression_M, u8 *pression_L)
{
tampon u8[3];
résultat u8;

résultat = software_i2c_Read_nByte(0xDA, 0x06, 3, tampon); //

si(résultat == SUCCÈS) {
*pression_H = tampon[0]; //
*pression_M = tampon[1]; //
*pression_L = tampon[2]; //
retour SUCCÈS;
} autre {
retour ÉCHEC;
}
}

vide principal()
{
Données du capteur *p_sensor_data = &données_capteur; //
p_sensor_data->pression_k = 8192;

LCD1602_Chaleur(); //
LCD1602_show_string(3, 0, “Pression”); //

alors que(1)
{
Write_One_Byte(0x30, 0x0A); //indiquer une conversion combinée
// alors que ((Read_One_Byte(0x30) & 0x08) > 0);
Délai_ms(10);

//
si(Read_Pressure_ThreeBytes(&p_sensor_data->pression_H,
&p_sensor_data->pression_M,
&p_sensor_data->pression_L) == SUCCÈS)
{
//
p_sensor_data->pression_AD = (non signé depuis longtemps)((((non signé depuis longtemps)p_sensor_data->pression_H) << 16) |
(((entier non signé)p_sensor_data->pression_M) << 8) |
((caractère non signé)p_sensor_data->pression_L));

//
p_sensor_data->pression = (p_sensor_data->pression_AD > 8388608) ?
(double)((p_sensor_data->pression_AD – 16777216) / (double)(p_sensor_data->pression_k)) :
(double)(p_sensor_data->pression_AD / (double)(p_sensor_data->pression_k));

//
si (is_zero_point_set)
{
zero_point_pression = p_sensor_data->pression; //
is_zero_point_set = 0; //
}

p_sensor_data->pression -= zero_point_pression;

//
si (p_sensor_data->pression > 1000.0) {
//
p_sensor_data->pression /= 1000.0;
float_to_str(p_sensor_data->P_buffer, p_sensor_data->pression, 2, ” kPa”);
} autre {
float_to_str(p_sensor_data->P_buffer, p_sensor_data->pression, 2, ” Pennsylvanie”);
}

LCD1602_show_string(3, 1, p_sensor_data->P_buffer);
}
autre
{
//
LCD1602_show_string(3, 1, “ERREUR DE LECTURE”);
}

Délai_ms(200); //
}
}