Files
CHJ/user/Drivers/SoftI2C.c
2026-03-20 21:16:58 +08:00

237 lines
4.4 KiB
C
Executable File

#include "../main/SystemInclude.h"
//##############################################################################
void SI2C_Init(void)
{
SCL_OUT();
SDA_OUT();
SET_SCL();
SET_SDA();
}
/******************************************************************************/
void SI2C_Start(void)
{
SCL_OUT();
SDA_OUT();
//CLR_SCL();
SET_SDA();
//SI2C_Delay();
SET_SCL();
//SI2C_Delay();
CLR_SDA();
SI2C_Delay();
CLR_SCL();
//SI2C_Delay();
}
/******************************************************************************/
void SI2C_Stop(void)
{
CLR_SCL();
SI2C_Delay();
CLR_SDA();
SI2C_Delay();
SET_SCL();
SET_SDA();
}
/******************************************************************************/
void SI2C_Ack(void)
{
CLR_SDA();
SI2C_Delay();
SET_SCL();
SI2C_Delay();
CLR_SCL();
SI2C_Delay();
SET_SDA();
}
/******************************************************************************/
void SI2C_NoAck(void)
{
SET_SDA();
SI2C_Delay();
SET_SCL();
SI2C_Delay();
CLR_SCL();
}
/******************************************************************************/
u8 SI2C_TestAck(void)
{
u8 ack;
SDA_IN();
SET_SCL();
SI2C_Delay();
ack = READ_SDA();
CLR_SCL();
SDA_OUT();
if(ack != 0) return 1;
return 0;
}
/******************************************************************************/
u8 SI2C_Write(u8 writeData)
{
u32 temp;
for(temp=0; temp<8; temp++)
{
if((writeData & 0x80) == 0) CLR_SDA();
else SET_SDA();
SET_SCL();
SI2C_Delay();
writeData = writeData << 1;
CLR_SCL();
SI2C_Delay();
}
return SI2C_TestAck();
}
/******************************************************************************/
u8 SI2C_Read(void)
{
u8 reedByte=0;
u32 temp;
SDA_IN();
for(temp=0; temp<8; temp++)
{
SET_SCL();
SI2C_Delay();
reedByte = reedByte << 1;
if(READ_SDA() != 0) reedByte |= 0x01;
CLR_SCL();
SI2C_Delay();
}
SDA_OUT();
return(reedByte);
}
/******************************************************************************/
//void SI2C_Start(void)
//{
// SDA_OUT();
// SCL_OUT();
// SET_SCL();
// SET_SDA();
//
// SI2C_Delay();
// CLR_SDA();
// SI2C_Delay();
//
// CLR_SCL();
//}
///******************************************************************************/
//void SI2C_Stop(void)
//{
// SDA_OUT();
// SCL_OUT();
// SET_SCL();
// CLR_SDA();
// SI2C_Delay();
//
// SET_SDA();
// SI2C_Delay();
//}
///******************************************************************************/
//void SI2C_Ack(void)
//{
// SDA_OUT();
// CLR_SDA();
// SI2C_Delay();
//
// SET_SCL();
// SI2C_Delay();
// CLR_SCL();
//}
///******************************************************************************/
//void SI2C_NoAck(void)
//{
// SDA_OUT();
// SET_SDA();
// SI2C_Delay();
//
// SET_SCL();
// SI2C_Delay();
// CLR_SCL();
//}
///******************************************************************************/
//u8 SI2C_TestAck(void)
//{
// u8 ack;
//
// SDA_IN();
//
// SET_SCL();
// SI2C_Delay();
// ack = READ_SDA();
// CLR_SCL();
// SI2C_Delay();
//
// //SDA_OUT();
// //SET_SDA();
// //SI2C_Delay();
//
// if (ack == 0) return 0;
//
// return 0;
//}
///******************************************************************************/
//u8 SI2C_Write(u8 writeData)
//{
// SDA_OUT();
// SI2C_Delay();
// for(u16 temp=0; temp<8; temp++)
// {
// if((writeData & 0x80) == 0x80) SET_SDA();
// else CLR_SDA();
//
// SET_SCL();
// writeData <<= 1;
// SI2C_Delay();
// CLR_SCL();
// SI2C_Delay();
// }
//
// SET_SDA();
// return SI2C_TestAck();
//
//}
///******************************************************************************/
//u8 SI2C_Read(void)
//{
// u8 reedByte=0;
//
// SDA_IN();
// for(u16 temp=0; temp<8; temp++)
// {
// SET_SCL();
// SI2C_Delay();
// reedByte = reedByte << 1;
// if(READ_SDA() == GPIO_PIN_SET) reedByte |= 0x01;
// CLR_SCL();
// SI2C_Delay();
// }
//
// return(reedByte);
//}