#include "app_gpio_i2c.h" #define APP_GPIO_I2C_SDA_PORT PORT_0 #define APP_GPIO_I2C_SDA_PIN PIN_3 #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_2 #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)/2; 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"); } }