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
258 lines
5.2 KiB
5 months ago
|
#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");
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|