#include "SonixC51.h"
#include "delay.h"
#include "i2c_key.h"
#include "TMD2771.H"
/*****************全局变量定义********************/
/*****************局部变量定义********************/
/*****************声明外部变量********************/
static void delay10us(void)
{
nop();nop();nop();nop();
nop();nop();nop();nop();
nop();nop();//10
nop();nop();nop();nop();
nop();nop();nop();nop();
nop();nop();//10
}
void I2CStart(void)
{
delay10us();
IO_SDA_KEYM_IN;
delay10us();
IO_SCL_KEYM_IN;
delay10us();
IO_SDA_KEY_LOW;
delay10us();
IO_SCL_KEY_LOW;
delay10us();
}
void I2CStop(void)
{
delay10us();
IO_SDA_KEY_LOW;
delay10us();
IO_SCL_KEY_LOW;
delay10us();
IO_SCL_KEYM_IN;
delay10us();
IO_SDA_KEYM_IN;
delay10us();
}
u8 I2CReadAck(void)
{
static u8 temp;
delay10us();
IO_SDA_KEYM_IN;//设为输入状态
delay10us();
IO_SCL_KEYM_IN;
delay10us();
if(IO_SDA_KEY_RD)
{
temp = C_NACK;//无应答信号
}
else
{
temp = C_ACK;//有应答信号
}
IO_SCL_KEY_LOW;
return (temp);
}
void I2CWriteNoAck(void)
{
delay10us();
IO_SDA_KEYM_IN;
delay10us();
IO_SCL_KEYM_IN;
delay10us();
IO_SCL_KEY_LOW;
delay10us();
}
void I2CWriteAck(void)
{
delay10us();
IO_SDA_KEY_LOW;
delay10us();
IO_SCL_KEYM_IN;
delay10us();
IO_SCL_KEY_LOW;
delay10us();
}
void I2CWriteByte(u8 u8data)
{
static u8 i;
for(i=0u;i<8u;i++)
{
if (0!=(u8data&0x80u))
{
IO_SDA_KEYM_IN;
}
else
{
IO_SDA_KEY_LOW;
}
delay10us();
IO_SCL_KEYM_IN;
delay10us();
IO_SCL_KEY_LOW;
delay10us();
u8data<<=1u;
}
}
u8 I2CReadByte(void)
{
static u8 i,u8data;
u8data=0;
IO_SCL_KEY_LOW;
delay10us();
IO_SDA_KEYM_IN;//设为输入状态
delay10us();
for (i=0u;i<8u;i++)
{
IO_SCL_KEYM_IN;
delay10us();
u8data <<= 1u;
if (IO_SDA_KEY_RD)
{
u8data|=0x01;
}
else
{
nop();
}
IO_SCL_KEY_LOW;
delay10us();
}
return (u8data);
}
/*******************************************************
* 函数名:SignalReadI2CData
* 描述 :读取I2C数据
* 输入 :无
* 输出 :无
* 调用 :5ms调用
*********************************************************/
u8 SignalReadI2CData(u8 Reg_Addr)
{
static u8 u8key_data;
// while(1)
// {
// Reg_Addr=0x4B;
// I2CStart();
// I2CWriteByte(MAC_ADDR+I2C_Write);
// if(I2CReadAck()==C_NACK)
// {
// I2CStop();
// return C_ERROR;
// }
//
// I2CWriteByte(Reg_Addr);
// if(I2CReadAck()==C_NACK)
// {
// I2CStop();
// return C_ERROR;
// }
// I2CStart();
// I2CWriteByte(MAC_ADDR+I2C_Read);
// if(I2CReadAck()==C_NACK)
// {
// I2CStop();
// return C_ERROR;
// }
// u8key_data=I2CReadByte();
// I2CWriteNoAck();
// I2CStop();
//
// if(u8key_data!=0)
// {
// delay_5us(200);
// }
// WDTR = 0x5a;
// delay_5us(200);
// }
I2CStart();
I2CWriteByte(MAC_ADDR+I2C_Write);
if(I2CReadAck()==C_NACK)
{
I2CStop();
return C_ERROR;
}
I2CWriteByte(Reg_Addr);
if(I2CReadAck()==C_NACK)
{
I2CStop();
return C_ERROR;
}
I2CStart();
I2CWriteByte(MAC_ADDR+I2C_Read);
if(I2CReadAck()==C_NACK)
{
I2CStop();
return C_ERROR;
}
u8key_data=I2CReadByte();
I2CWriteNoAck();
I2CStop();
return (u8key_data);
}
/*******************************************************
* 函数名:MulReadI2CData
* 描述 :连续读取I2C数据
* 输入 :无
* 输出 :无
* 调用 :5ms调用
*********************************************************/
u8 MulReadI2CData(u8 Strart_Reg_Addr,u8 LEN,u8 *buf)
{
u8 i;
I2CStart();
I2CWriteByte(MAC_ADDR+I2C_Write);
if(I2CReadAck()==C_NACK)
{
I2CStop();
return C_ERROR;
}
I2CWriteByte(Strart_Reg_Addr);
if(I2CReadAck()==C_NACK)
{
I2CStop();
return C_ERROR;
}
I2CStart();
I2CWriteByte(MAC_ADDR+I2C_Read);
if(I2CReadAck()==C_NACK)
{
I2CStop();
return C_ERROR;
}
for(i=0;i<LEN;i++)
{
*buf++=I2CReadByte();
I2CWriteAck();
}
I2CWriteNoAck();
I2CStop();
return C_SUCCESS;
}
/*******************************************************
* 函数名:WriteI2CData
* 描述 : 写入I2C数据
* 输入 :无
* 输出 :无
* 调用 :5ms调用
*********************************************************/
u8 WriteI2CData(u8 Reg_Addr,u8 *dat,u8 len)
{
u8 i;
I2CStart();
I2CWriteByte(MAC_ADDR+I2C_Write);
if(I2CReadAck()!=C_ACK){I2CStop(); return C_ERROR;}
I2CWriteByte(Reg_Addr);
if(I2CReadAck()!=C_ACK){I2CStop(); return C_ERROR;}
for(i=0;i<len;i++)
{
I2CWriteByte(*(dat+i));
if(I2CReadAck()!=C_ACK){I2CStop(); return C_ERROR;}
}
I2CStop();
return C_SUCCESS;
}
u8 SignalReadI2CData_test(u8 Reg_Addr,u8 *dat)
{
I2CStart();
I2CWriteByte(MAC_ADDR+I2C_Write);
if(I2CReadAck()==C_NACK)
{
I2CStop();
return C_ERROR;
}
I2CWriteByte(Reg_Addr);
if(I2CReadAck()==C_NACK)
{
I2CStop();
return C_ERROR;
}
I2CStart();
I2CWriteByte(MAC_ADDR+I2C_Read);
if(I2CReadAck()==C_NACK)
{
I2CStop();
return C_ERROR;
}
*dat=I2CReadByte();
I2CWriteNoAck();
I2CStop();
return C_SUCCESS;
}