📄 iic.c
字号:
/*****************************************************
This program was produced by the
ICC7.14 Professional
Project :SHS07-I
Version : Vt-1.0.01
Date : 2008-5-29
Author : 应志强
Company : DUCHY
Comments: 测试ok
//完成IIC协议层
***************************************************************************************************/
#include "head.h"
#define IIC_delay 3
#define IIC_delay_n 2
/*************************************************
* Name : void I2C_start(void)
* Function: provid the start flag in I2C_BUS MODE
*************************************************/
void I2C_start(void)
{
SDA(1);
SCL(1);
delay_uS(IIC_delay_n*IIC_delay);
SDA(0);
delay_uS(IIC_delay_n*IIC_delay);
SCL(0);
// delay_uS(1);
}
/*************************************************
* Name : void I2C_stop(void)
* Function: provid the end flag in I2C_BUS MODE
*************************************************/
void I2C_stop(void)
{
SCL(0);
SDA(0);
delay_uS(IIC_delay_n*IIC_delay);
SCL(1);
delay_uS(IIC_delay_n*IIC_delay);
SDA(1);
//delay_uS(IIC_delay);
}
/*************************************************************************
* Name : bit I2C_send(unsigned char I2C_data)
* Function: Send a 8_bit data,
return TRUE if receive ACK,otherwise, return FALSE
*************************************************************************/
void I2C_send(unsigned char I2C_data)
{
unsigned char cnt=8;
while(cnt--)
{
SCL(0);
delay_uS(IIC_delay);
SDA((I2C_data&0x80));
I2C_data=I2C_data<<1;
delay_uS(IIC_delay_n*IIC_delay);
SCL(1);
delay_uS(IIC_delay_n*IIC_delay);
}
SCL(0);
}
/******************************************************************************
*
* Name : unsigned char I2C_receive(void)
* Function: Extract and return a byte from I2C_BUS,needn't ACK;
* The appliance should assume ASD is high before use the function
*******************************************************************************
**/
unsigned char I2C_receive(void)
{
unsigned char cnt=8;
unsigned char I2C_data=0;
SDA(1);
SDA_Dir(0);
while(cnt--)
{
I2C_data <<=1;
SCL(0);
delay_uS(IIC_delay_n*IIC_delay);
SCL(1);
delay_uS(IIC_delay_n*IIC_delay);
I2C_data |=SDA_In();
}
SDA_Dir(1);
SCL(0);
return(I2C_data);
}
/*************************************************
* Name : void I2C_ACK(void)
* Function: Send a ACK signal to data_sender
*************************************************/
void I2C_ACK(unsigned char En)
{
SDA(!En) ;
delay_uS(IIC_delay_n*IIC_delay);
SCL(1) ;
delay_uS(IIC_delay_n*IIC_delay);
SCL(0);
//delay_uS(1);
}
//--------------------------------------------------------------------------------
//调用方式:unsigned char I2C_ WaitAck(void)
//函数说明:私有函数,I2C用,等待从器件接收方的应答
//--------------------------------------------------------------------------------
unsigned char I2C_WaitAck(void)
{
unsigned char errtime=254;//因故障接收方无ACK 超时值为255
SDA(1);
delay_uS(IIC_delay_n*IIC_delay);
SCL(1);
delay_uS(IIC_delay_n*IIC_delay);
SDA_Dir(0) ;
while(SDA_In())
{
errtime--;
if (!errtime)
{
I2C_stop();
SDA_Dir(1) ;
return 0;
}
}
SDA_Dir(1) ;
SCL(0);
return 1;
}
/***************************************************************
* Name : void init_I2C(void)
* Function: Initialise I2C_BUS
* Note : It's firstly used before other I2C_function
***************************************************************/
void init_I2C(void)
{
SCL(0);
SDA_Dir(1);
I2C_stop();
}
/*************************************************
* Name : void I2C_Send_Byte(unsigned char data)
* Function: Send a Byte data and recive ask
*************************************************/
unsigned char I2C_Send_Byte(unsigned char data)
{
I2C_send(data);
return (I2C_WaitAck());
}
/*************************************************
* Name : void I2C_Send_Byte(unsigned char data)
* Function: Send a Byte data and recive ask
*************************************************/
unsigned char I2C_Receive_Byte(void)
{
unsigned char get_data;
get_data=I2C_receive();
I2C_ACK(1);
return get_data;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -