stm32iic吧 关注:2贴子:23
  • 2回复贴,共1

模拟IIC主机端程序

只看楼主收藏回复

**--------------文件信息--------------------------------------------------------------
** 文 件 名: IIC.c
** 创 建 人: wenshijian4@163.com
** 创建日期: 2016年04月01日
** 描 述:
**---------- 版本信息------------------------------------------------------------------
** 版 本: UCOSII-V2.92
** 说 明: 修改IIC功能,添加IO口模拟
**-------------------------------------------------------------------------------------
**************************************************************************************/
/***************************************************************************************
** 函数名称: I2C_delay
** 功能描述: IIC基本延时函数
** 参 数:
** 返 回 值: None
** 作  者: WEN
** 日  期: 2016年04月02日
**--------------------------------------------------------------------------------------
** 修 改 人:
** 日  期:
**--------------------------------------------------------------------------------------
****************************************************************************************/
void I2C_delay(void)
{
u8 i=150; //修改优化速度,可以减小到50/72MHZ
while(i)
{
i--;
}
}
/***************************************************************************************
** 函数名称: I2C_Start
** 功能描述: IIC起始信号识别
** 参 数:
** 返 回 值: None
** 作  者: WEN
** 日  期: 2016年04月02日
**--------------------------------------------------------------------------------------
** 修 改 人:
** 日  期:
**--------------------------------------------------------------------------------------
****************************************************************************************/
bool I2C_Start(void)
{
SDA_H;
SCL_H;
I2C_delay();
if(!SDA_read)return FALSE; //SDA线为低电平则总线忙,退出
SDA_L;
I2C_delay();
if(SDA_read) return FALSE; //SDA线为高电平则总线出错,退出
SDA_L;
I2C_delay();
return TRUE;
}
/***************************************************************************************
** 函数名称: I2C_Stop
** 功能描述: IIC结束信号识别
** 参 数:
** 返 回 值: None
** 作  者: WEN
** 日  期: 2016年04月02日
**--------------------------------------------------------------------------------------
** 修 改 人:
** 日  期:
**--------------------------------------------------------------------------------------
****************************************************************************************/
void I2C_Stop(void)
{
SCL_L;
I2C_delay();
SDA_L;
I2C_delay();
SCL_H;
I2C_delay();
SDA_H;
I2C_delay();
}
/***************************************************************************************
** 函数名称: I2C_Ack
** 功能描述: IIC应答
** 参 数:
** 返 回 值: None
** 作  者: WEN
** 日  期: 2016年04月02日
**--------------------------------------------------------------------------------------
** 修 改 人:
** 日  期:
**--------------------------------------------------------------------------------------
****************************************************************************************/
void I2C_Ack(void)
{
SCL_L;
I2C_delay();
SDA_L;
I2C_delay();
SCL_H;
I2C_delay();
SCL_L;
I2C_delay();
}
/***************************************************************************************
** 函数名称: I2C_NoAck
** 功能描述: IIC应答
** 参 数:
** 返 回 值: None
** 作  者: WEN
** 日  期: 2016年04月02日
**--------------------------------------------------------------------------------------
** 修 改 人:
** 日  期:
**--------------------------------------------------------------------------------------
****************************************************************************************/
void I2C_NoAck(void)
{
SCL_L;
I2C_delay();
SDA_H;
I2C_delay();
SCL_H;
I2C_delay();
SCL_L;
I2C_delay();
}
/***************************************************************************************
** 函数名称: I2C_WaitAck
** 功能描述: IIC等待应答
** 参 数: *pdata
** 返 回 值: =1有ACK,=0无ACK
** 作  者: WEN
** 日  期: 2016年04月02日
**--------------------------------------------------------------------------------------
** 修 改 人:
** 日  期:
**--------------------------------------------------------------------------------------
****************************************************************************************/
bool I2C_WaitAck(void)
{
SCL_L;
I2C_delay();
SDA_H;
I2C_delay();
SCL_H;
I2C_delay();
if(SDA_read)
{
SCL_L;
return FALSE;
}
SCL_L;
return TRUE;
}
/***************************************************************************************
** 函数名称: I2C_SendByte
** 功能描述: IIC发送一个字节
** 参 数: u8 SendByte
** 返 回 值: None
** 作  者: WEN
** 日  期: 2016年04月02日
**--------------------------------------------------------------------------------------
** 修 改 人:
** 日  期:
**--------------------------------------------------------------------------------------
****************************************************************************************/
void I2C_SendByte(u8 SendByte)
{
u8 i=8;
while(i--)
{
SCL_L;
I2C_delay();
if(SendByte&0x80)
SDA_H;
else
SDA_L;
SendByte<<=1;
I2C_delay();
SCL_H;
I2C_delay();
}
SCL_L;
}
/***************************************************************************************
** 函数名称: I2C_ReceiveByte
** 功能描述: IIC接收一个字节
** 参 数:
** 返 回 值: U8
** 作  者: WEN
** 日  期: 2016年04月02日
**--------------------------------------------------------------------------------------
** 修 改 人:
** 日  期:
**--------------------------------------------------------------------------------------
****************************************************************************************/
u8 I2C_ReceiveByte(void) //数据从高位到低位//
{
u8 i=8;
u8 ReceiveByte=0;
SDA_H;
while(i--)
{
ReceiveByte<<=1;
SCL_L;
I2C_delay();
SCL_H;
I2C_delay();
if(SDA_read)
{
ReceiveByte|=0x01;
}
}
SCL_L;
return ReceiveByte;
}
/***************************************************************************************/


IP属地:广东1楼2016-04-12 10:33回复
    特别说明,在嵌入式操作系统中,如UCOS,FREEOS,等,操作模拟IIC一定要屏蔽任务调度。
    任务调度会打断IIC时序。


    IP属地:广东2楼2016-04-12 12:32
    收起回复