I2C協議程序

/*****************************************************************************
FileName : i2c.c
Function : I2C通信協議
Author   : mike
Email    : [email protected]	
Version  : V1.0
Date     : 2019-07-12
Note     : 
*****************************************************************************/
#include "i2c.h"

void iic_delay(void)
{
    u8 i = 10;
    for (; i!=0; i--) 
    {
        asm("nop");
    }
}

void iic_delay_2(void)
{
    u8 i = 15;
    for (; i!=0; i--) 
    {
        asm("nop");
    }
}

void iic_start(void)
{
    IIC_DATA_CLK_OUT();
    IIC_DATA_CLK_HIGH();
    iic_delay();
    IIC_DATA_LOW();
    iic_delay();
    IIC_CLK_LOW();
}

//結束一次IIC通信
void iic_stop(void)
{
    IIC_DATA_OUT();
    IIC_DATA_LOW();
    iic_delay_2();
    IIC_CLK_HIGH();
    iic_delay();
    IIC_DATA_HIGH();
}

//IIC總線發送1byte
void iic_sendbyte(u8 val)
{
    u8 i;
    IIC_DATA_OUT();
    for (i=8; i!=0; i--) {
        if (val & BIT(7)) {
            IIC_DATA_HIGH();
        } else {
            IIC_DATA_LOW();
        }
        iic_delay_2();
        IIC_CLK_HIGH();
        iic_delay();
        IIC_CLK_LOW();
        val <<= 1;
    }
}

//IIC總線接收1byte
u8 iic_getbyte(void)
{
    u8 i;
    u8 val = 0;
    IIC_DATA_IN();
    for (i=8; i!=0; i--) {
        iic_delay_2();
        IIC_CLK_HIGH();
        iic_delay();
        val <<= 1;
        if (IIC_DATA_IS_HIGH()) {
            val |= BIT(0);
        }
        IIC_CLK_LOW();
    }
    return val;
}

//IIC總線發送ACK
void iic_sendack(void)
{
    IIC_DATA_OUT();
    IIC_DATA_LOW();
    iic_delay_2();
    IIC_CLK_HIGH();
    iic_delay();
    IIC_CLK_LOW();
}

//IIC總線發送NACK
void iic_sendnack(void)
{
    IIC_DATA_OUT();
    IIC_DATA_HIGH();
    iic_delay_2();
    IIC_CLK_HIGH();
    iic_delay();
    IIC_CLK_LOW();
}

//IIC總線獲取ACK狀態
bool iic_getack(void)
{
    bool ack = false;
    IIC_DATA_IN();
    iic_delay_2();
    IIC_CLK_HIGH();
    iic_delay();
    if (!IIC_DATA_IS_HIGH()) {
        ack = true;
    }
    IIC_CLK_LOW();
    return ack;
}

/*****************************************************************************
FileName : i2c.h
Function : I2C通信協議
Author   : mike
Email    : [email protected]	
Version  : V1.0
Date     : 2019-07-12
Note     : 
*****************************************************************************/
#ifndef I2C_H
#define I2C_H

#define IIC_IO_SET
#define IIC_DATA                       6       //P16
#define IIC_CLK                        3       //P33
#define IIC_DATA_CLK_OUT()             //設爲輸出,關閉上拉 delay(10)
#define IIC_DATA_IN()                  //設爲輸入,打開上拉
#define IIC_DATA_OUT()                 //設爲輸出,打開上拉
#define IIC_DATA_CLK_HIGH()             P1 |= BIT(IIC_DATA);P3 |= BIT(IIC_CLK);
#define IIC_DATA_HIGH()                 P1 |= BIT(IIC_DATA)
#define IIC_DATA_LOW()                  P1 &= ~BIT(IIC_DATA)
#define IIC_CLK_HIGH()                  P3 |= BIT(IIC_CLK)
#define IIC_CLK_LOW()                   P3 &= ~BIT(IIC_CLK)
#define IIC_DATA_IS_HIGH()              (P1 & BIT(IIC_DATA))


void iic_start(void);
void iic_stop(void);
void iic_sendbyte(u8 val);
u8 iic_getbyte(void);
void iic_sendack(void);
void iic_sendnack(void);
bool iic_getack(void);


#endif

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章