打造一个通用性MCU架构,支持CX32/AT32/NRF51/NRF52等。 OS支持RTX4/RTX5/FreeRtos。 采用VsCode+GCC组合,VsCode+KEIL5,超强开发方式。 QQ群:524408033

LiSun

打造一个通用性MCU架构,支持CX32/AT32/NRF51/NRF52等。 OS支持RTX4/RTX5/FreeRtos。 采用VsCode+GCC组合,VsCode+KEIL5,超强开发方式。 QQ群:524408033

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
/* -----------------------------------------头文件-----------------------------------------*/
#include "iic.h"

/* -----------------------------------------宏定义-----------------------------------------*/
#define IIC_SDA(N) IIC_SDA = N
#define IIC_SCL(N) IIC_SCL = N

/*选择SDA的数据方向*/
#define IIC_SDA_Input()     {P13_PushPull_Mode;P14_Input_Mode;}
#define IIC_SDA_Output()    {P13_PushPull_Mode;P14_PushPull_Mode;}
/* -----------------------------------------结构体定义-------------------------------------*/


/* -----------------------------------------全局变量定义-----------------------------------*/
sbit IIC_SDA = P1 ^ 4;
sbit IIC_SCL = P1 ^ 3;
/* -----------------------------------------应用程序---------------------------------------*/
void Delayus(uint16_t i)
{
    while (i--);
}
void Delayms(uint16_t i)
{
    i = i * 1000;
    Delayus(i);
}
/*********************************************
函数名:IIC_Init
功  能:IIC引脚初始化
形  参:
返回值:
备  注:
作  者:薛建强
时  间:2019/06/11
**********************************************/
void IIC_Init(void)
{
    IIC_SDA_Output();
    IIC_SDA(1);
    IIC_SCL(1);
}


/*********************************************
函数名:IIC_Start
功  能:IIC通讯开始
形  参:
返回值:
备  注:
作  者:薛建强
时  间:2019/06/11
**********************************************/
void IIC_Start(void)
{
    IIC_SDA_Output();  // 设置为输出模式
    IIC_SCL(1);
    IIC_SDA(1);
    Delayus(1);
    IIC_SDA(0);
    IIC_SCL(0);
    Delayus(2);
}
/*********************************************
函数名:IIC_Stop
功  能:IIC通讯结束
形  参:
返回值:
备  注:
作  者:薛建强
时  间:2019/06/11
**********************************************/
void IIC_Stop(void)
{
    IIC_SDA_Output();  // 设置为输出模式
    IIC_SCL(0);
    IIC_SDA(0);
    Delayus(2);
    IIC_SCL(1);
    IIC_SDA(1);
    Delayus(2);
}
/*********************************************
函数名:IIC_Wait_ACK
功  能:IIC从设备应答
形  参:
返回值:
备  注:
作  者:薛建强
时  间:2019/06/11
**********************************************/
void IIC_Wait_ACK(void)
{
    uint8_t i = 0;
    IIC_SDA_Input();            //   SDA 设置为输入
    IIC_SCL(1);
    Delayus(1);
    while (IIC_SDA == 1 && i < 250)
        i++;
    IIC_SCL(0);
    IIC_SDA_Output();           //   设置成输出
    Delayus(2);
}

/*********************************************
函数名:IIC_NACK
功  能:主设备非应答
形  参:
返回值:
备  注:
作  者:薛建强
时  间:2019/06/11
**********************************************/
void IIC_NACK(void)
{
    IIC_SCL(1);
    Delayus(1);
    IIC_SDA(1);
    IIC_SCL(0);
    Delayus(2);
}

/*********************************************
函数名:IIC_WriteByte
功  能:发送一个字节
形  参:byte--待发送字节
返回值:
备  注:
作  者:薛建强
时  间:2019/06/11
**********************************************/
void IIC_WriteByte(uint8_t byte)
{
    uint8_t len = 0;
    IIC_SCL(0);
    Delayus(2);
    for (len = 0; len < 8; len++)
    {
        if (byte & 0x80)
        {
            IIC_SDA(1);
        }
        else
        {
            IIC_SDA(0);
        }
        Delayus(1);
        IIC_SCL(1);
        byte <<= 1;
        Delayus(1);
        IIC_SCL(0);
        Delayus(2);
    }
    IIC_SDA(1);
    IIC_SCL(0);
    Delayus(2);
}

/*********************************************
函数名:IIC_ReadByte
功  能:向从设备接收一个字节
形  参:
返回值:Byte--读取到的字节
备  注:
作  者:薛建强
时  间:2019/06/11
**********************************************/
uint8_t IIC_ReadByte(void)
{
    uint8_t len = 0, Byte = 0;
    IIC_SDA(1);
    IIC_SDA_Input();            // SDA 设置为输入
    for (len = 0; len < 8; len++)
    {
        IIC_SCL(0);
        Delayus(1);
        IIC_SCL(1);
        Delayus(1);
        Byte <<= 1;
        Byte |= IIC_SDA;
        Delayus(1);
        IIC_SCL(0);
        Delayus(1);
    }
    return Byte;
}

/*********************************************
函数名:IIC_ReceiveData
功  能:向从设备接收一个字节,并带应答
形  参:
返回值:
备  注:
作  者:薛建强
时  间:2019/06/11
**********************************************/
uint8_t IIC_ReceiveData(uint8_t Ack)
{
    uint8_t i = 0, ReadValue = 0;
    IIC_SDA_Output();   //   设置成输出模式
    IIC_SDA(1);
    IIC_SDA_Input();    //   设置为输入模式
    IIC_SCL(0);

    for (i = 0; i < 8; i++)
    {
        IIC_SCL(1);
        Delayus(1);
        ReadValue <<= 1;
        if (IIC_SDA != 0)
        {
            ReadValue |= 0x01;
        }
        Delayus(1);
        IIC_SCL(0);
        Delayus(2);
    }
    if (Ack)
    {
        IIC_SCL(0);
        IIC_SDA_Output();   //   设置成输出模式
        IIC_SDA(0);
        Delayus(2);
        IIC_SCL(1);
        Delayus(1);
        IIC_SCL(0);
    }
    else
    {
        IIC_SCL(0);
        IIC_SDA_Output();   //   设置成输出模式
        IIC_SDA(1);
        Delayus(2);
        IIC_SCL(1);
        Delayus(1);
        IIC_SCL(0);
    }
    return ReadValue;
}

#ifndef __IIC_H
#define __IIC_H
/* -----------------------------------------头文件-----------------------------------------*/
#include "main.h"

/* -----------------------------------------宏定义-----------------------------------------*/


/* -----------------------------------------结构体定义-------------------------------------*/
typedef struct
{
  uint8_t		DelayTick;   	  //定义延时,以适应不同器件对速率的不同要求,具体值要在调试中确定
  uint8_t			ADDR;         //器件地址
}IIC_TYPE;

/* -----------------------------------------全局变量定义-----------------------------------*/


/* -----------------------------------------应用程序---------------------------------------*/
void    IIC_Init(void);                // IIC端口
void    IIC_Start(void);               // 启动信号
void    IIC_Stop(void);                // 停止信号
void    IIC_Wait_ACK(void);            // 应答信号
void    IIC_NACK(void);
void    IIC_WriteByte(uint8_t txd);
uint8_t IIC_ReadByte(void);            // 读取数据
uint8_t IIC_ReceiveData(uint8_t Ack);  // 读取数据

#endif
posted on 2022-08-13 11:01  xuejianqiang  阅读(20)  评论(0编辑  收藏  举报
打造一个通用性MCU架构,支持CX32/AT32/NRF51/NRF52等。 OS支持RTX4/RTX5/FreeRtos。 采用VsCode+GCC组合,VsCode+KEIL5,超强开发方式。 QQ群:524408033