/* -----------------------------------------头文件-----------------------------------------*/
#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