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