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.

437 lines
7.7 KiB

#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;
}