/**
******************************************************************************
* @file SimI2C.c
* @author LEE
* @version V0.1
* @date 2017-10-24
* @brief This file provides a simulate I2C functions.
******************************************************************************
* @attention
*
* Not ensure the effect of these code!
*
* copyright LEE
*
******************************************************************************
*/
/* Includes ------------------------------------------------------------------*/
#include "SimI2C.h"
//SIMI2C_DEV_DEF Example
//Num SDA SCL
//1 PB13 PB13
//2 PB15 PC6
//3 PC7 PC8
//4 PC9 PA8
//5 PA9 PA10
//6 PC10 PC11
//7 PC12 PD2
//8 PB3 PB4
//9 PB5 PB6
SimI2C_Device_t DevCollection[] = {
{ 0x52, GPIOB, GPIO_Pin_13, RCC_APB2Periph_GPIOB, GPIOB, GPIO_Pin_14, RCC_APB2Periph_GPIOB},
{ 0x52, GPIOB, GPIO_Pin_15, RCC_APB2Periph_GPIOB, GPIOC, GPIO_Pin_6, RCC_APB2Periph_GPIOC},
{ 0x52, GPIOC, GPIO_Pin_7, RCC_APB2Periph_GPIOC, GPIOC, GPIO_Pin_8, RCC_APB2Periph_GPIOC},
{ 0x52, GPIOC, GPIO_Pin_9, RCC_APB2Periph_GPIOC, GPIOA, GPIO_Pin_8, RCC_APB2Periph_GPIOA},
{ 0x52, GPIOA, GPIO_Pin_9, RCC_APB2Periph_GPIOA, GPIOA, GPIO_Pin_10, RCC_APB2Periph_GPIOA},
{ 0x52, GPIOC, GPIO_Pin_10, RCC_APB2Periph_GPIOC, GPIOC, GPIO_Pin_11, RCC_APB2Periph_GPIOC},
{ 0x52, GPIOC, GPIO_Pin_12, RCC_APB2Periph_GPIOC, GPIOD, GPIO_Pin_2, RCC_APB2Periph_GPIOD},
{ 0x52, GPIOB, GPIO_Pin_3, RCC_APB2Periph_GPIOB, GPIOB, GPIO_Pin_4, RCC_APB2Periph_GPIOB},
{ 0x52, GPIOB, GPIO_Pin_5, RCC_APB2Periph_GPIOB, GPIOB, GPIO_Pin_6, RCC_APB2Periph_GPIOB},
};
/// <summary>
/// Simulate I2C port init.
/// </summary>
void SimI2C_Init(void)
{
SimI2C_Do_Init;
}
/// <summary>
/// Simulate I2C blocking delay.
/// </summary>
void SimI2C_Delay(void)
{
int i;
for (i = 0; i < 12; i++)
{
;
}
}
/// <summary>
/// Simulate I2C start.
/// </summary>
/// <param name="dev">Simulate I2C Channel</param>
void SimI2C_Start(SimI2C_Device_t dev)
{
SimI2C_SDA_H(dev);
SimI2C_SCL_H(dev);
SimI2C_Delay();
SimI2C_SDA_L(dev);
SimI2C_Delay();
SimI2C_SCL_L(dev);
}
/// <summary>
/// Simulate I2C stop.
/// </summary>
/// <param name="dev">Simulate I2C Channel</param>
void SimI2C_Stop(SimI2C_Device_t dev)
{
SimI2C_SDA_L(dev);
SimI2C_SCL_H(dev);
SimI2C_Delay();
SimI2C_SDA_H(dev);
SimI2C_Delay();
}
/// <summary>
/// Simulate I2C Receive Ack.
/// </summary>
/// <param name="dev">Simulate I2C Channel</param>
/// <returns>IsAck</returns>
unsigned char SimI2C_Recv_Ack(SimI2C_Device_t dev)
{
unsigned char ack;
SimI2C_SDA_IN(dev);
SimI2C_SCL_H(dev);
SimI2C_Delay();
if(SimI2C_SDA_READ(dev))
{
ack = 1;
}
else
{
ack = 0;
}
SimI2C_SCL_L(dev);
SimI2C_SDA_OUT(dev);
SimI2C_Delay();
return ack ;
}
/// <summary>
/// Simulate I2C Send Ack.
/// </summary>
/// <param name="dev">Simulate I2C Channel</param>
/// <param name="ack">Ack</param>
void SimI2C_Send_Ack(SimI2C_Device_t dev,unsigned char ack)
{
if(ack)
{
SimI2C_SDA_H(dev);
}
else
{
SimI2C_SDA_L(dev);
}
SimI2C_SCL_H(dev);
SimI2C_Delay();
SimI2C_SCL_L(dev);
SimI2C_Delay();
}
/// <summary>
/// Simulate I2C Receive Byte.
/// </summary>
/// <param name="dev">Simulate I2C Channel</param>
/// <returns>Data</returns>
unsigned char SimI2C_Recv_Byte(SimI2C_Device_t dev)
{
unsigned char i, data;
SimI2C_SDA_H(dev);
SimI2C_Delay();
SimI2C_SDA_IN(dev);
SimI2C_Delay();
for( i=0; i<8; i++)
{
data <<= 1;
SimI2C_SCL_H(dev);
SimI2C_Delay();
if(SimI2C_SDA_READ(dev))
data++;
SimI2C_SCL_L(dev);
SimI2C_Delay();
}
SimI2C_SDA_OUT(dev);
return data;
}
/// <summary>
/// Simulate I2C Send Byte.
/// </summary>
/// <param name="dev">Simulate I2C Channel</param>
/// <param name="data">Data</param>
void SimI2C_Send_Byte(SimI2C_Device_t dev,unsigned char data)
{
unsigned char i;
for( i=0; i<8; i++)
{
if((data << i) & 0x80)
{
SimI2C_SDA_H(dev);
}
else
{
SimI2C_SDA_L(dev);
}
SimI2C_Delay();
SimI2C_SCL_H(dev);
SimI2C_Delay();
SimI2C_SCL_L(dev);
}
SimI2C_Recv_Ack(dev);
}
/// <summary>
/// Simulate I2C Send Byte.
/// </summary>
/// <param name="dev">Simulate I2C Channel</param>
/// <param name="reg">Register Address</param>
/// <param name="length"></param>
/// <param name="data">Register Address</param>
void SimI2C_Read(SimI2C_Device_t dev,unsigned char reg,unsigned char length,unsigned char* data)
{
unsigned char i;
SimI2C_Start(dev);
SimI2C_Send_Byte(dev, dev.Address);
SimI2C_Send_Byte(dev, reg);
SimI2C_Stop(dev);
SimI2C_Start(dev);
SimI2C_Send_Byte(dev, dev.Address + 1);
for( i=0; i<length; i++)
{
data[i] = SimI2C_Recv_Byte(dev) ;
if(i == length-1)
SimI2C_Send_Ack(dev, _NACK) ;
else
SimI2C_Send_Ack(dev, _ACK) ;
}
SimI2C_Stop(dev);
}
/// <summary>
/// Simulate I2C Send Byte.
/// </summary>
/// <param name="dev">Simulate I2C Channel</param>
/// <param name="data">Data</param>
void SimI2C_Write(SimI2C_Device_t dev,unsigned char reg,unsigned char length,unsigned char* data)
{
unsigned char i;
SimI2C_Start(dev);
SimI2C_Send_Byte(dev, dev.Address);
SimI2C_Send_Byte(dev, reg);
for( i=0; i<length; i++)
{
SimI2C_Send_Byte(dev,data[i]);
}
SimI2C_Stop(dev);
}