[mw_shl_code=c,true]#include "SM5852.h"
unsigned char test1;
/*****************************************************************************
//函 数: IICDelay
//功 能: 本文件内的延时程序调用
*****************************************************************************/
void IICDelay(volatile unsigned char DelayCount)
{
while(DelayCount --)
{
; //CLEARDOG;
}
}
/*****************************************************************************
//函 数: I2C_Start
//功 能: IIC驱动程序之起始位
*****************************************************************************/
void I2C_Start(void)
{
Sensor_SDA_OUT;
Sensor_SDA = 1;
Sensor_SCL = 1;
IICDelay(5);
Sensor_SDA = 0;
IICDelay(5);
Sensor_SCL = 0;
}
/*****************************************************************************
//函 数: I2C_Stop
//功 能: IIC驱动程序之停止位
*****************************************************************************/
void I2C_Stop(void)
{
Sensor_SDA_OUT;
Sensor_SCL = 0;
Sensor_SDA = 0;
IICDelay(5);
Sensor_SCL = 1;
IICDelay(5);
Sensor_SDA = 1;
IICDelay(5);
}
/*****************************************************************************
//函 数: I2C_WaitACK
//功 能: IIC驱动程序之等待ACK
*****************************************************************************/
void I2C_WaitACK(void)
{
unsigned char errtime;
errtime = 40;
Sensor_SDA_OUT;
Sensor_SDA = 1;
IICDelay(10); //读ACK
Sensor_SCL = 1;
IICDelay(10);
Sensor_SDA_IN;
while(Sensor_SDA)
{
errtime --;
if(!errtime)
{
I2C_Stop();
test1 = 4;
break;
}
}
Sensor_SCL = 0;
Sensor_SDA_OUT;
IICDelay(5);
}
/*****************************************************************************
//函 数: I2C_SndAck
//功 能: IIC驱动程序之主机发送应答
*****************************************************************************/
void I2C_SndAck(void)
{
Sensor_SDA_OUT;
Sensor_SDA = 0;
IICDelay(5);
Sensor_SCL = 1;
IICDelay(5);
Sensor_SCL = 0;
}
/*****************************************************************************
//函 数: I2C_SndNoAck
//功 能: IIC驱动程序之主机发送非应答
*****************************************************************************/
void I2C_SndNoAck(void)
{
Sensor_SDA_OUT;
Sensor_SDA=1;
IICDelay(5);
Sensor_SCL=1;
IICDelay(5);
Sensor_SCL=0;
}
/*****************************************************************************
//函 数: I2C_WriteByte
//功 能: IIC写字节
*****************************************************************************/
void I2C_WriteByte(unsigned char data)
{
unsigned char i;
Sensor_SDA_OUT;
for(i = 0; i < 8; i++)//以最高为传输数据
{
if(data & 0x80)
{
Sensor_SDA = 1;
}
else
{
Sensor_SDA = 0;
}
data <<= 1;
Sensor_SCL = 1;
IICDelay(5);
Sensor_SCL = 0;
}
I2C_WaitACK(); //如果通讯错误,将不能接收到ack
}
/*****************************************************************************
//函 数: I2C_ReadByte
//功 能: IIC读字节
*****************************************************************************/
unsigned char I2C_ReadByte(void)
{
unsigned char i,bytedata;
Sensor_SDA_IN;
for(i = 0; i < 8; i++)//以最高为传输数据
{
Sensor_SCL = 1;
bytedata <<= 1;
bytedata |= Sensor_SDA;
Sensor_SCL = 0;
IICDelay(5);
}
Sensor_SDA_OUT;
return(bytedata);
}
/*****************************************************************************
//函 数: InitSensor
//功 能: 初始化传感器
*****************************************************************************/
void InitSensor(void)
{
Sensor_SCL_OUT; //传感器时钟线
Sensor_SCL = 1; //传感器时钟线
Sensor_SDA_OUT; //传感器数据线
Sensor_SDA = 1; //传感器数据线
}
/*****************************************************************************
//函 数: Sensor_ReadOneByte
//功 能: 从片内指定地址读一个字节数据
*****************************************************************************/
unsigned char Sensor_ReadOneByte(unsigned char RegAddr)
{
unsigned char mdata;
I2C_Start();
I2C_WriteByte(ADDRESS_SM5852_WR);
I2C_WriteByte(RegAddr);
I2C_Start();
I2C_WriteByte(ADDRESS_SM5852_RE);
mdata = I2C_ReadByte();
I2C_SndNoAck();
I2C_Stop(); //停止I2C
IICDelay(100);//此处延时根据实际情况,如果不延时,可能会不正常
return(mdata);
}
/*****************************************************************************
//函 数: Sensor_ReadMultiByte
//功 能: 从片内指定地址读出多个字节的数据
*****************************************************************************/
void Sensor_ReadMultiByte(unsigned char ucStartAddress,volatile unsigned char *datebuffer,unsigned char ucByteCounter)
{
I2C_Start();
I2C_WriteByte(ADDRESS_SM5852_WR);
I2C_WriteByte(ucStartAddress);
I2C_Start();
I2C_WriteByte(ADDRESS_SM5852_RE);
while(-- ucByteCounter)
{
*datebuffer ++= I2C_ReadByte();
I2C_SndAck();
}
*datebuffer = I2C_ReadByte();
I2C_SndNoAck();
I2C_Stop();
IICDelay(200);//此处延时根据实际情况,如果不延时,可能会不正常
}
[/mw_shl_code]
|