271 lines
8.0 KiB
C
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 */
|
|
|