You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

258 lines
5.2 KiB

#include "app_gpio_i2c.h"
#define APP_GPIO_I2C_SDA_PORT PORT_0
#define APP_GPIO_I2C_SDA_PIN PIN_9
#define APP_GPIO_I2C_SDA_OUTPUT App_Gpio_I2C_Port_Output(APP_GPIO_I2C_SDA_PORT, APP_GPIO_I2C_SDA_PIN)
#define APP_GPIO_I2C_SDA_INPUT App_Gpio_I2C_Port_Input(APP_GPIO_I2C_SDA_PORT, APP_GPIO_I2C_SDA_PIN)
#define APP_GPIO_I2C_SDA_H App_Gpio_I2C_Port_H(APP_GPIO_I2C_SDA_PORT, APP_GPIO_I2C_SDA_PIN)
#define APP_GPIO_I2C_SDA_L App_Gpio_I2C_Port_L(APP_GPIO_I2C_SDA_PORT, APP_GPIO_I2C_SDA_PIN)
#define APP_GPIO_I2C_READ App_Gpio_I2C_Port_Read(APP_GPIO_I2C_SDA_PORT, APP_GPIO_I2C_SDA_PIN)
#define APP_GPIO_I2C_SCL_PORT PORT_0
#define APP_GPIO_I2C_SCL_PIN PIN_8
#define APP_GPIO_I2C_SCL_H App_Gpio_I2C_Port_H(APP_GPIO_I2C_SCL_PORT, APP_GPIO_I2C_SCL_PIN)
#define APP_GPIO_I2C_SCL_L App_Gpio_I2C_Port_L(APP_GPIO_I2C_SCL_PORT, APP_GPIO_I2C_SCL_PIN)
static void App_Gpio_I2C_Port_Output(uint32_t Port, uint32_t Pin);
static void App_Gpio_I2C_Port_Input(uint32_t Port, uint32_t Pin);
static bool App_Gpio_I2C_Port_Read(uint32_t Port, uint32_t Pin);
static void App_Gpio_I2C_Port_H(uint32_t Port, uint32_t Pin);
static void App_Gpio_I2C_Port_L(uint32_t Port, uint32_t Pin);
static void App_Gpio_I2C_Delay(void);
static uint32_t DelayCount;
void App_Gpio_I2C_Initialization(uint32_t Frequency)
{
SYS_ClockEnable(SYS_PERIPH_CLOCK_GPIO0);
App_Gpio_I2C_Port_Output(APP_GPIO_I2C_SDA_PORT, APP_GPIO_I2C_SDA_PIN);
App_Gpio_I2C_Port_Output(APP_GPIO_I2C_SCL_PORT, APP_GPIO_I2C_SCL_PIN);
APP_GPIO_I2C_SDA_H;
APP_GPIO_I2C_SCL_H;
DelayCount = (1000000 / Frequency) + 1;
App_Gpio_I2C_Stop();
}
void App_Gpio_I2C_Start(void)
{
App_Gpio_I2C_Delay();
APP_GPIO_I2C_SDA_H;
APP_GPIO_I2C_SCL_H;
App_Gpio_I2C_Delay();
APP_GPIO_I2C_SDA_L;
App_Gpio_I2C_Delay();
APP_GPIO_I2C_SCL_L;
App_Gpio_I2C_Delay();
}
bool App_Gpio_I2C_WriteData(uint8_t TxData)
{
uint8_t i;
bool bRet;
APP_GPIO_I2C_SDA_OUTPUT;
for(i = 0 ; i < 8 ; i++)
{
if((TxData & 0x80)==0x80)
{
APP_GPIO_I2C_SDA_H;
}
else
{
APP_GPIO_I2C_SDA_L;
}
TxData<<=1;
App_Gpio_I2C_Delay();
APP_GPIO_I2C_SCL_H;
App_Gpio_I2C_Delay();
APP_GPIO_I2C_SCL_L;
App_Gpio_I2C_Delay();
}
APP_GPIO_I2C_SDA_INPUT;
APP_GPIO_I2C_SCL_H;
App_Gpio_I2C_Delay();
bRet = APP_GPIO_I2C_READ;
App_Gpio_I2C_Delay();
APP_GPIO_I2C_SCL_L;
return bRet;
}
bool App_Gpio_I2C_ReadData(uint8_t* pRxData, bool isAck)
{
bool bRet;
uint8_t i;
uint8_t Ret = 0x00;
APP_GPIO_I2C_SDA_INPUT;
for(i = 0 ; i < 8 ; i++)
{
APP_GPIO_I2C_SCL_H;
App_Gpio_I2C_Delay();
Ret <<= 1;
if(APP_GPIO_I2C_READ != 0)
{
Ret |= 0x01;
}
APP_GPIO_I2C_SCL_L;
App_Gpio_I2C_Delay();
}
APP_GPIO_I2C_SDA_OUTPUT;
if(isAck == true)
{
APP_GPIO_I2C_SDA_L;
}
else
{
APP_GPIO_I2C_SDA_H;
}
APP_GPIO_I2C_SCL_H;
App_Gpio_I2C_Delay();
APP_GPIO_I2C_SCL_L;
App_Gpio_I2C_Delay();
return bRet;
}
void App_Gpio_I2C_Stop(void)
{
APP_GPIO_I2C_SDA_L;
APP_GPIO_I2C_SDA_OUTPUT;
APP_GPIO_I2C_SDA_L;
App_Gpio_I2C_Delay();
APP_GPIO_I2C_SCL_H;
App_Gpio_I2C_Delay();
APP_GPIO_I2C_SDA_H;
}
bool App_Gpio_I2C_Write(uint8_t Address, uint8_t* pWriteData, uint32_t TxSize)
{
bool bRet;
uint16_t i;
App_Gpio_I2C_Start();
bRet = App_Gpio_I2C_WriteData(Address << 1);
if(bRet == false)
{
App_Gpio_I2C_Stop();
return false;
}
for(i = 0 ; i < TxSize ; i++)
{
bRet = App_Gpio_I2C_WriteData(pWriteData[i]);
if(bRet == false)
{
App_Gpio_I2C_Stop();
return false;
}
}
App_Gpio_I2C_Stop();
return bRet;
}
bool App_Gpio_I2C_Read(uint8_t Address, uint8_t* pReadData, uint32_t RxSize)
{
bool bRet;
uint16_t i;
App_Gpio_I2C_Start();
bRet = App_Gpio_I2C_WriteData((Address << 1) | 1);
if(bRet == false)
{
App_Gpio_I2C_Stop();
return false;
}
for(i = 0 ; i < RxSize-1 ; i++)
{
bRet = App_Gpio_I2C_ReadData(&pReadData[i], true);
if(bRet == false)
{
App_Gpio_I2C_Stop();
return false;
}
}
bRet = App_Gpio_I2C_ReadData(&pReadData[i], false);
App_Gpio_I2C_Stop();
return bRet;
}
static void App_Gpio_I2C_Port_Output(uint32_t Port, uint32_t Pin)
{
gpio_cfg_t gpio_out;
gpio_out.port = Port;
gpio_out.mask = Pin;
gpio_out.pad = GPIO_PAD_NONE;
gpio_out.func = GPIO_FUNC_OUT;
GPIO_Config(&gpio_out);
}
static void App_Gpio_I2C_Port_Input(uint32_t Port, uint32_t Pin)
{
gpio_cfg_t gpio_out;
gpio_out.port = Port;
gpio_out.mask = Pin;
gpio_out.pad = GPIO_PAD_NONE;
gpio_out.func = GPIO_FUNC_IN;
GPIO_Config(&gpio_out);
}
static void App_Gpio_I2C_Port_H(uint32_t Port, uint32_t Pin)
{
mxc_gpio_regs_t *gpio = MXC_GPIO_GET_GPIO(Port);
gpio->out_set = Pin;
}
static void App_Gpio_I2C_Port_L(uint32_t Port, uint32_t Pin)
{
mxc_gpio_regs_t *gpio = MXC_GPIO_GET_GPIO(Port);
gpio->out_clr = Pin;
}
static bool App_Gpio_I2C_Port_Read(uint32_t Port, uint32_t Pin)
{
mxc_gpio_regs_t *gpio = MXC_GPIO_GET_GPIO(Port);
return (gpio->in & Pin) ? false : true;
}
static void App_Gpio_I2C_Delay(void)
{
uint32_t i;
for(i = 0 ; i < DelayCount ; i++)
asm("NOP");
}