2025-04-26 16:03:23 +08:00

271 lines
8.0 KiB
C

/** ##########################################################################
** Filename : i2c_simu.c
** Project :
** Module :
** Processor :
** Version : 1.0
** Compiler :
** Date/Time :
** Abstract :
** Contents :
** Note : 模拟I2C
**
** (c) Copyright dmdz Co.,Ltd
** --------------------------------------------------------------------------
** R E V I S I O N H I S T O R Y
** --------------------------------------------------------------------------
** Date Ver Author Description
** -20230602- --V1.0-- --mingyea--- --修改--
** #########################################################################*/
/*---------------------------------------------------------------------------
- I N C L U D E F I L E S
----------------------------------------------------------------------------*/
//#include "Events.h"
#include "common_cfg.h"
#include "common_memory.h"
#include "i2c_simu.h"
/*---------------------------------------------------------------------------
- D E F I N E S / M A C R O S
----------------------------------------------------------------------------*/
/*---------------------------------------------------------------------------
- T Y P E D E F I N I T I O N S
----------------------------------------------------------------------------*/
/*---------------------------------------------------------------------------
- S T A T I C V A R I A B L E S
----------------------------------------------------------------------------*/
/*---------------------------------------------------------------------------
- G L O B A L V A R I A B L E S
----------------------------------------------------------------------------*/
/*---------------------------------------------------------------------------
- C O N S T A N T S
----------------------------------------------------------------------------*/
/*---------------------------------------------------------------------------
- F U N C T I O N P R O T O T Y P E
----------------------------------------------------------------------------*/
/*---------------------------------------------------------------------------
|Prototype : i2c_simu_init
|Called by : None
|Preconditions : None
|Input parameters : None
|Output parameters : None
|Return value : None
|Description : 初始化
----------------------------------------------------------------------------*/
void i2c_simu_init(void)
{
i2c_simu_sda_init_output();
i2c_simu_scl_init_output();
I2C_SIMU_SCL_HIGH();
I2C_SIMU_SDA_HIGH();
} /* End of function i2c_simu_init*/
/*---------------------------------------------------------------------------
|Prototype : void i2c_simu_task(void)
|Called by : None
|Preconditions : None
|Input parameters : None
|Output parameters : None
|Return value : None
|Description : 预留
----------------------------------------------------------------------------*/
void i2c_simu_task(void)
{
} /* End of function i2c_simu_task*/
/*---------------------------------------------------------------------------
|Prototype : void i2c_simu_start(void)
|Called by : None
|Preconditions : None
|Input parameters : None
|Output parameters : None
|Return value : None
|Description : 启动
----------------------------------------------------------------------------*/
void i2c_simu_start(void)
{
i2c_simu_sda_init_output();
I2C_SIMU_SDA_HIGH();
I2C_SIMU_SCL_HIGH();
i2c_simu_delay_us(I2C_SIMU_START_STOP_DELAY);
I2C_SIMU_SDA_LOW();//START:when CLK is high,DATA change form high to low
i2c_simu_delay_us(I2C_SIMU_START_STOP_DELAY);
I2C_SIMU_SCL_LOW() ;
} /* End of function i2c_simu_start*/
/*---------------------------------------------------------------------------
|Prototype : void i2c_simu_stop(void)
|Called by : None
|Preconditions : None
|Input parameters : None
|Output parameters : None
|Return value : None
|Description : 停止
----------------------------------------------------------------------------*/
void i2c_simu_stop(void)
{
i2c_simu_sda_init_output();
I2C_SIMU_SCL_LOW();
I2C_SIMU_SDA_LOW();//STOP:when CLK is high DATA change form low to high
i2c_simu_delay_us(I2C_SIMU_START_STOP_DELAY);
I2C_SIMU_SCL_HIGH();
I2C_SIMU_SDA_HIGH();
i2c_simu_delay_us(I2C_SIMU_START_STOP_DELAY);
} /* End of function i2c_simu_stop*/
/*---------------------------------------------------------------------------
|Prototype : u8 i2c_simu_wait_ack(void)
|Called by : None
|Preconditions : None
|Input parameters : None
|Output parameters : None
|Return value : None
|Description : wait ack
----------------------------------------------------------------------------*/
u8 i2c_simu_wait_ack(void)
{
u8 ucErrTime=0u;
i2c_simu_sda_init_input();
I2C_SIMU_SDA_HIGH();
i2c_simu_delay_us(I2C_SIMU_WAIT_ACK_DELAY);
I2C_SIMU_SCL_HIGH();
i2c_simu_delay_us(I2C_SIMU_WAIT_ACK_DELAY);
while(I2C_SIMU_READ_SDA_PIN())
{
ucErrTime++;
if(ucErrTime>I2C_SIMU_ACK_WAIT_DELAY)
{
i2c_simu_stop();
return 1;
}
}
I2C_SIMU_SCL_LOW();
return 0;
} /* End of function i2c_simu_wait_ack*/
/*---------------------------------------------------------------------------
|Prototype : void i2c_simu_ack(void)
|Called by : None
|Preconditions : None
|Input parameters : None
|Output parameters : None
|Return value : None
|Description : ack
----------------------------------------------------------------------------*/
void i2c_simu_ack(void)
{
I2C_SIMU_SCL_LOW() ;
i2c_simu_sda_init_output();
I2C_SIMU_SDA_LOW();
i2c_simu_delay_us(I2C_SIMU_ACK_DELAY);
I2C_SIMU_SCL_HIGH();
i2c_simu_delay_us(I2C_SIMU_ACK_DELAY);
I2C_SIMU_SCL_LOW();
} /* End of function i2c_simu_ack*/
/*---------------------------------------------------------------------------
|Prototype : void i2c_simu_nack(void)
|Called by : None
|Preconditions : None
|Input parameters : None
|Output parameters : None
|Return value : None
|Description : nack
----------------------------------------------------------------------------*/
void i2c_simu_nack(void)
{
I2C_SIMU_SCL_LOW() ;
i2c_simu_sda_init_output();
I2C_SIMU_SDA_HIGH();
i2c_simu_delay_us(I2C_SIMU_NACK_DELAY);
I2C_SIMU_SCL_HIGH();
i2c_simu_delay_us(I2C_SIMU_NACK_DELAY);
I2C_SIMU_SCL_LOW() ;
} /* End of function i2c_simu_nack*/
/*---------------------------------------------------------------------------
|Prototype : void i2c_simu_send_byte(i2c_simu_data_t txd)
|Called by : None
|Preconditions : None
|Input parameters : None
|Output parameters : None
|Return value : None
|Description : nack
----------------------------------------------------------------------------*/
void i2c_simu_send_byte(i2c_simu_data_t txd)
{
u8 t;
i2c_simu_sda_init_output();
I2C_SIMU_SCL_LOW();
for(t=0u;t<8u;t++)
{
if((txd&0x80))
{
I2C_SIMU_SDA_HIGH();
}
else
{
I2C_SIMU_SDA_LOW();
}
txd<<=1;
i2c_simu_delay_us(I2C_SIMU_SEND_DATA_DELAY);
I2C_SIMU_SCL_HIGH();
i2c_simu_delay_us(I2C_SIMU_SEND_SCL_H_DELAY);
I2C_SIMU_SCL_LOW();
i2c_simu_delay_us(I2C_SIMU_SEND_SCL_L_DELAY);
}
} /* End of function i2c_simu_send_byte*/
/*---------------------------------------------------------------------------
|Prototype : i2c_simu_data_t i2c_simu_read_byte(i2c_simu_ack_t ack)
|Called by : None
|Preconditions : None
|Input parameters : None
|Output parameters : None
|Return value : None
|Description : nack
----------------------------------------------------------------------------*/
i2c_simu_data_t i2c_simu_read_byte(i2c_simu_ack_t ack)
{
u8 i;
i2c_simu_data_t receive=0u;
i2c_simu_sda_init_input();
for(i=0u;i<8u;i++ )
{
I2C_SIMU_SCL_LOW();
i2c_simu_delay_us(I2C_SIMU_READ_DATA_DELAY);
I2C_SIMU_SCL_HIGH();
receive<<=1;
if(I2C_SIMU_READ_SDA_PIN())
{
receive++;
}
i2c_simu_delay_us(I2C_SIMU_READ_DATA_DELAY1);
}
if (!ack)
{
i2c_simu_nack();
}
else
{
i2c_simu_ack();
}
return receive;
} /* End of function i2c_simu_read_byte*/
/* [] END OF FILE */