GPIO初始化
void IIC_Init(void)
{
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE,ENABLE);
GPIO_InitTypeDef GPIO_InitStructer;
GPIO_InitStructer.GPIO_Pin=GPIO_Pin_14|GPIO_Pin_15;
GPIO_InitStructer.GPIO_Mode=GPIO_Mode_OUT;
GPIO_InitStructer.GPIO_OType=GPIO_OType_PP;
GPIO_InitStructer.GPIO_PuPd=GPIO_PuPd_NOPULL;
GPIO_InitStructer.GPIO_Speed=GPIO_High_Speed;
GPIO_Init(GPIOF,&GPIO_InitStructer);
}
void i2c_scanf_addr(void)
{
uint8_t i2c_count = 0;
for (int i = 1; i < 128; i++)
{
if (!IIC_Start())
{
printf("External IIC Start Error:%d\n", i);
return;
}
IIC_Send_Byte(i << 1);
if (!IIC_Wait_Ack())
{
if (i == 127)
{
printf("External IIC Scanf End, Count=%d\n", i2c_count);
}
continue;
}
IIC_Stop();
i2c_count++;
printf("External IIC Found address:0x%2x\n", i);
g_addr[i] = i;
}
}
int IIC_Start(void)
{
SDA_OUT();
IIC_SDA = 1;
if (!READ_SDA)
return 0;
IIC_SCL = 1;
Delay_For_Pin(1);
IIC_SDA = 0;
if (READ_SDA)
return 0;
Delay_For_Pin(2);
IIC_SCL = 0;
return 1;
}
void IIC_Stop(void)
{
SDA_OUT();
IIC_SCL = 0;
IIC_SDA = 0;
Delay_For_Pin(2);
IIC_SCL = 1;
Delay_For_Pin(1);
IIC_SDA = 1;
Delay_For_Pin(2);
}
int IIC_Wait_Ack(void)
{
uint8_t ucErrTime = 0;
SDA_IN();
IIC_SDA = 1;
Delay_For_Pin(1);
IIC_SCL = 1;
Delay_For_Pin(1);
while (READ_SDA)
{
ucErrTime++;
if (ucErrTime > 50)
{
IIC_Stop();
return 0;
}
Delay_For_Pin(1);
}
IIC_SCL = 0;
return 1;
}
void IIC_Ack(void)
{
IIC_SCL = 0;
SDA_OUT();
IIC_SDA = 0;
Delay_For_Pin(1);
IIC_SCL = 1;
Delay_For_Pin(1);
IIC_SCL = 0;
}
void IIC_NAck(void)
{
IIC_SCL = 0;
SDA_OUT();
IIC_SDA = 1;
Delay_For_Pin(1);
IIC_SCL = 1;
Delay_For_Pin(1);
IIC_SCL = 0;
}
void IIC_Send_Byte(uint8_t txd)
{
uint8_t t;
SDA_OUT();
IIC_SCL = 0;
for (t = 0; t < 8; t++)
{
IIC_SDA = (txd & 0x80) >> 7;
txd <<= 1;
Delay_For_Pin(1);
IIC_SCL = 1;
Delay_For_Pin(1);
IIC_SCL = 0;
Delay_For_Pin(1);
}
}
uint8_t SSD1306_Init(void)
{
uint32_t p = 2500;
while (p > 0)
p--;
SSD1306_WRITECOMMAND(0xae);
SSD1306_WRITECOMMAND(0xa6);
SSD1306_WRITECOMMAND(0xAE);
SSD1306_WRITECOMMAND(0xD5);
SSD1306_WRITECOMMAND(0x80);
SSD1306_WRITECOMMAND(0xA8);
SSD1306_WRITECOMMAND(0x1F);
SSD1306_WRITECOMMAND(0xD3);
SSD1306_WRITECOMMAND(0x00);
SSD1306_WRITECOMMAND(0x40 | 0x0);
SSD1306_WRITECOMMAND(0x8D);
SSD1306_WRITECOMMAND(0x14);
SSD1306_WRITECOMMAND(0x20);
SSD1306_WRITECOMMAND(0x02);
SSD1306_WRITECOMMAND(0xa1);
SSD1306_WRITECOMMAND(0xc8);
SSD1306_WRITECOMMAND(0xda);
SSD1306_WRITECOMMAND(0x02);
SSD1306_WRITECOMMAND(0x81);
SSD1306_WRITECOMMAND(0xcf);
SSD1306_WRITECOMMAND(0xd9);
SSD1306_WRITECOMMAND(0xf1);
SSD1306_WRITECOMMAND(0xdb);
SSD1306_WRITECOMMAND(0x40);
SSD1306_WRITECOMMAND(0x2e);
SSD1306_WRITECOMMAND(0xa4);
SSD1306_WRITECOMMAND(0xa6);
SSD1306_WRITECOMMAND(0xaf);
SSD1306_Fill(SSD1306_COLOR_BLACK);
SSD1306_UpdateScreen();
SSD1306.CurrentX = 0;
SSD1306.CurrentY = 0;
SSD1306.Initialized = 1;
return 1;
}