#include "gpio_i2c.h" void Delay_I2C_Delay(uint32_t nDelay) { uint32_t i; for(i = 0 ; i < nDelay ; i++) { asm("NOP"); } } void GPIO_I2C0_Initialization(void) { // configure I2C1 SDA as a Output Mode HAL_GPIO_ConfigOutput((Pn_Type*)I2C0_SDA_PORT, I2C0_SDA_PIN, PUSH_PULL_OUTPUT ); HAL_GPIO_ConfigPullup((Pn_Type*)I2C0_SDA_PORT, I2C0_SDA_PIN, PUPDx_EnablePU ); // configure I2C1 SCL as a Output Mode HAL_GPIO_ConfigOutput((Pn_Type*)I2C0_SCL_PORT, I2C0_SCL_PIN, PUSH_PULL_OUTPUT ); HAL_GPIO_ConfigPullup((Pn_Type*)I2C0_SCL_PORT, I2C0_SCL_PIN, PUPDx_EnablePU ); I2C0_SDA_HIGH; I2C0_SCL_HIGH; } void GPIO_I2C0_Start(void) { I2C0_SDA_OUTPUT; Delay_I2C_Delay(I2C0_DELAY); I2C0_SDA_HIGH; I2C0_SCL_HIGH; Delay_I2C_Delay(I2C0_DELAY); I2C0_SDA_LOW; Delay_I2C_Delay(I2C0_DELAY); I2C0_SCL_LOW; Delay_I2C_Delay(I2C0_DELAY); } void GPIO_I2C0_Stop(void) { I2C0_SDA_LOW; I2C0_SDA_OUTPUT; I2C0_SDA_LOW; Delay_I2C_Delay(I2C0_DELAY); I2C0_SCL_HIGH; Delay_I2C_Delay(I2C0_DELAY); I2C0_SDA_HIGH; } uint8_t GPIO_I2C0_Write(uint8_t data) { uint8_t Ret; unsigned char i; I2C0_SDA_OUTPUT; for(i = 0 ; i < 8 ; i++) { if((data & 0x80)==0x80) { I2C0_SDA_HIGH; } else { I2C0_SDA_LOW; } data<<=1; Delay_I2C_Delay(I2C0_DELAY); I2C0_SCL_HIGH; Delay_I2C_Delay(I2C0_DELAY); I2C0_SCL_LOW; Delay_I2C_Delay(I2C0_DELAY); } I2C0_SDA_INPUTS; I2C0_SCL_HIGH; Delay_I2C_Delay(I2C0_DELAY); Ret = I2C0_SDA_READ; Delay_I2C_Delay(I2C0_DELAY); I2C0_SCL_LOW; return Ret; } uint8_t GPIO_I2C0_Read(uint8_t rs) { uint8_t i; uint8_t Ret = 0x00; I2C0_SDA_INPUTS; for(i = 0 ; i < 8 ; i++) { I2C0_SCL_HIGH; Delay_I2C_Delay(I2C0_DELAY); Ret <<= 1; if(I2C0_SDA_READ != 0) { Ret |= 0x01; } I2C0_SCL_LOW; Delay_I2C_Delay(I2C0_DELAY); } I2C0_SDA_OUTPUT; if(rs == I2C_ACK) { I2C0_SDA_LOW; } else { I2C0_SDA_HIGH; } I2C0_SCL_HIGH; Delay_I2C_Delay(I2C0_DELAY); I2C0_SCL_LOW; Delay_I2C_Delay(I2C0_DELAY); return Ret; } uint8_t I2C0_Write(uint8_t Address, uint8_t* pWriteData, uint8_t WriteDataSize) { uint16_t i; GPIO_I2C0_Start(); GPIO_I2C0_Write(Address << 1); for(i = 0 ; i < WriteDataSize ; i++) { GPIO_I2C0_Write(pWriteData[i]); } GPIO_I2C0_Stop(); return 0; } uint8_t I2C0_Read(uint8_t Address, uint8_t *pReadData, uint8_t ReadDataSize) { uint16_t i; GPIO_I2C0_Start(); GPIO_I2C0_Write((Address << 1) | 1); for(i = 0 ; i < ReadDataSize-1 ; i++) { pReadData[i] = GPIO_I2C0_Read(I2C_ACK); } pReadData[i] = GPIO_I2C0_Read(I2C_NACK); GPIO_I2C0_Stop(); return 0; } ///////////////////////////////////////////////////////////////////////////// void GPIO_I2C1_Initialization(void) { // configure I2C1 SDA as a Output Mode HAL_GPIO_ConfigOutput((Pn_Type*)I2C1_SDA_PORT, I2C1_SDA_PIN, PUSH_PULL_OUTPUT ); HAL_GPIO_ConfigPullup((Pn_Type*)I2C1_SDA_PORT, I2C1_SDA_PIN, PUPDx_EnablePU ); // configure I2C1 SCL as a Output Mode HAL_GPIO_ConfigOutput((Pn_Type*)I2C1_SCL_PORT, I2C1_SCL_PIN, PUSH_PULL_OUTPUT ); HAL_GPIO_ConfigPullup((Pn_Type*)I2C1_SCL_PORT, I2C1_SCL_PIN, PUPDx_EnablePU ); I2C1_SDA_HIGH; I2C1_SCL_HIGH; } void GPIO_I2C1_Start(void) { I2C1_SDA_OUTPUT; Delay_I2C_Delay(I2C1_DELAY); I2C1_SDA_HIGH; I2C1_SCL_HIGH; Delay_I2C_Delay(I2C1_DELAY); I2C1_SDA_LOW; Delay_I2C_Delay(I2C1_DELAY); I2C1_SCL_LOW; Delay_I2C_Delay(I2C1_DELAY); } void GPIO_I2C1_Stop(void) { I2C1_SDA_LOW; I2C1_SDA_OUTPUT; I2C1_SDA_LOW; Delay_I2C_Delay(I2C1_DELAY); I2C1_SCL_HIGH; Delay_I2C_Delay(I2C1_DELAY); I2C1_SDA_HIGH; } uint8_t GPIO_I2C1_Write(uint8_t data) { uint8_t Ret; unsigned char i; I2C1_SDA_OUTPUT; for(i = 0 ; i < 8 ; i++) { if((data & 0x80)==0x80) { I2C1_SDA_HIGH; } else { I2C1_SDA_LOW; } data<<=1; Delay_I2C_Delay(I2C1_DELAY); I2C1_SCL_HIGH; Delay_I2C_Delay(I2C1_DELAY); I2C1_SCL_LOW; Delay_I2C_Delay(I2C1_DELAY); } I2C1_SDA_INPUTS; I2C1_SCL_HIGH; Delay_I2C_Delay(I2C1_DELAY); Ret = I2C1_SDA_READ; Delay_I2C_Delay(I2C1_DELAY); I2C1_SCL_LOW; return Ret; } uint8_t GPIO_I2C1_Read(uint8_t rs) { uint8_t i; uint8_t Ret = 0x00; I2C1_SDA_INPUTS; for(i = 0 ; i < 8 ; i++) { I2C1_SCL_HIGH; Delay_I2C_Delay(I2C1_DELAY); Ret <<= 1; if(I2C1_SDA_READ != 0) { Ret |= 0x01; } I2C1_SCL_LOW; Delay_I2C_Delay(I2C1_DELAY); } I2C1_SDA_OUTPUT; if(rs == I2C_ACK) { I2C1_SDA_LOW; } else { I2C1_SDA_HIGH; } I2C1_SCL_HIGH; Delay_I2C_Delay(I2C1_DELAY); I2C1_SCL_LOW; Delay_I2C_Delay(I2C1_DELAY); return Ret; } uint8_t I2C1_Write(uint8_t Address, uint8_t* pWriteData, uint8_t WriteDataSize) { uint16_t i; GPIO_I2C1_Start(); GPIO_I2C1_Write(Address << 1); for(i = 0 ; i < WriteDataSize ; i++) { GPIO_I2C1_Write(pWriteData[i]); } GPIO_I2C1_Stop(); return 0; } uint8_t I2C1_Read(uint8_t Address, uint8_t *pReadData, uint8_t ReadDataSize) { uint16_t i; GPIO_I2C1_Start(); GPIO_I2C1_Write((Address << 1) | 1); for(i = 0 ; i < ReadDataSize-1 ; i++) { pReadData[i] = GPIO_I2C1_Read(I2C_ACK); } pReadData[i] = GPIO_I2C1_Read(I2C_NACK); GPIO_I2C1_Stop(); return 0; } ///////////////////////////////////////////////////////////////////////////// void GPIO_I2C2_Initialization(void) { // configure I2C1 SDA as a Output Mode HAL_GPIO_ConfigOutput((Pn_Type*)I2C2_SDA_PORT, I2C2_SDA_PIN, PUSH_PULL_OUTPUT ); HAL_GPIO_ConfigPullup((Pn_Type*)I2C2_SDA_PORT, I2C2_SDA_PIN, PUPDx_EnablePU ); // configure I2C2 SCL as a Output Mode HAL_GPIO_ConfigOutput((Pn_Type*)I2C2_SCL_PORT, I2C2_SCL_PIN, PUSH_PULL_OUTPUT ); HAL_GPIO_ConfigPullup((Pn_Type*)I2C2_SCL_PORT, I2C2_SCL_PIN, PUPDx_EnablePU ); I2C2_SDA_HIGH; I2C2_SCL_HIGH; } void GPIO_I2C2_Start(void) { I2C2_SDA_OUTPUT; Delay_I2C_Delay(I2C2_DELAY); I2C2_SDA_HIGH; I2C2_SCL_HIGH; Delay_I2C_Delay(I2C2_DELAY); I2C2_SDA_LOW; Delay_I2C_Delay(I2C2_DELAY); I2C2_SCL_LOW; Delay_I2C_Delay(I2C2_DELAY); } void GPIO_I2C2_Stop(void) { I2C2_SDA_LOW; I2C2_SDA_OUTPUT; I2C2_SDA_LOW; Delay_I2C_Delay(I2C2_DELAY); I2C2_SCL_HIGH; Delay_I2C_Delay(I2C2_DELAY); I2C2_SDA_HIGH; } uint8_t GPIO_I2C2_Write(uint8_t data) { uint8_t Ret; unsigned char i; I2C2_SDA_OUTPUT; for(i = 0 ; i < 8 ; i++) { if((data & 0x80)==0x80) { I2C2_SDA_HIGH; } else { I2C2_SDA_LOW; } data<<=1; Delay_I2C_Delay(I2C2_DELAY); I2C2_SCL_HIGH; Delay_I2C_Delay(I2C2_DELAY); I2C2_SCL_LOW; Delay_I2C_Delay(I2C2_DELAY); } I2C2_SDA_INPUTS; I2C2_SCL_HIGH; Delay_I2C_Delay(I2C2_DELAY); Ret = I2C2_SDA_READ; Delay_I2C_Delay(I2C2_DELAY); I2C2_SCL_LOW; return Ret; } uint8_t GPIO_I2C2_Read(uint8_t rs) { uint8_t i; uint8_t Ret = 0x00; I2C2_SDA_INPUTS; for(i = 0 ; i < 8 ; i++) { I2C2_SCL_HIGH; Delay_I2C_Delay(I2C2_DELAY); Ret <<= 1; if(I2C2_SDA_READ != 0) { Ret |= 0x01; } I2C2_SCL_LOW; Delay_I2C_Delay(I2C2_DELAY); } I2C2_SDA_OUTPUT; if(rs == I2C_ACK) { I2C2_SDA_LOW; } else { I2C2_SDA_HIGH; } I2C2_SCL_HIGH; Delay_I2C_Delay(I2C2_DELAY); I2C2_SCL_LOW; Delay_I2C_Delay(I2C2_DELAY); return Ret; } uint8_t I2C2_Write(uint8_t Address, uint8_t* pWriteData, uint8_t WriteDataSize) { uint16_t i; GPIO_I2C2_Start(); GPIO_I2C2_Write(Address << 1); for(i = 0 ; i < WriteDataSize ; i++) { GPIO_I2C2_Write(pWriteData[i]); } GPIO_I2C2_Stop(); return 0; } uint8_t I2C2_Read(uint8_t Address, uint8_t *pReadData, uint8_t ReadDataSize) { uint16_t i; GPIO_I2C2_Start(); GPIO_I2C2_Write((Address << 1) | 1); for(i = 0 ; i < ReadDataSize-1 ; i++) { pReadData[i] = GPIO_I2C2_Read(I2C_ACK); } pReadData[i] = GPIO_I2C2_Read(I2C_NACK); GPIO_I2C2_Stop(); return 0; }