STM32 IIC

#include "Type.h"
#include "IIC.h"
#include "Delay.h"
void I2C_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStructer;
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
    GPIO_InitStructer.GPIO_Pin=GPIO_Pin_2 | GPIO_Pin_3; //6--SCL   7--SDA
    GPIO_InitStructer.GPIO_Speed=GPIO_Speed_50MHz;
    GPIO_InitStructer.GPIO_Mode=GPIO_Mode_Out_PP;

    GPIO_Init(GPIOA, &GPIO_InitStructer);
}
void SDA_OUT(void)
{
    GPIO_InitTypeDef GPIO_InitStructer;
    GPIO_InitStructer.GPIO_Pin= GPIO_Pin_2;
    GPIO_InitStructer.GPIO_Speed=GPIO_Speed_50MHz;
    GPIO_InitStructer.GPIO_Mode=GPIO_Mode_Out_PP;
    GPIO_Init(GPIOA, &GPIO_InitStructer);
}
void SDA_IN(void)
{
    GPIO_InitTypeDef GPIO_InitStructer;
    GPIO_InitStructer.GPIO_Pin= GPIO_Pin_2;
    GPIO_InitStructer.GPIO_Speed=GPIO_Speed_50MHz;
    GPIO_InitStructer.GPIO_Mode=GPIO_Mode_IPU;
    GPIO_Init(GPIOA, &GPIO_InitStructer);
}
void SDA_Set()
{
    GPIOA->ODR |=  GPIO_Pin_2;
}
void SDA_Reset()
{
    GPIOA->ODR &=  (u16)(~GPIO_Pin_2);
}
uint8 SDA_Get()
{
    if(GPIOA->IDR&GPIO_Pin_2)
        return 0x01;
    else
        return 0x00;
}
void SCL_Set()
{
    GPIOA->ODR |=  GPIO_Pin_3;
}
void SCL_Reset()
{
    GPIOA->ODR &=  (u16)(~GPIO_Pin_3);
}
void I2C_Start(void)
{
    SDA_OUT();
    SDA_Set();//SDA H
        Delay_us(2);
    SCL_Set();//SCL H
    Delay_us(2);
    SDA_Reset();//SDA L
    Delay_us(2);
    SCL_Reset();//SCL L
    Delay_us(2);
}

void I2C_Stop(void)
{
        SDA_OUT();
        SDA_Reset();//SDA L
        Delay_us(2);
    SCL_Set();//SCL H
    Delay_us(2);
    SDA_Set();//SDA H
    Delay_us(2);
}
u8 I2C_Wait_Ask(void)
{
    int count=0;
    SDA_IN();
    SCL_Set();
    Delay_us(2);
    while(SDA_Get())
    {
        count++;
        if(count>100)
        {
            I2C_Stop();
            return 1;
        }   
                Delay_us(1);
    }
        SCL_Reset();
    Delay_us(2);
    return 0;
}
void I2C_WriteByte(u8 data)
{
    u8 i;
    SDA_OUT();
    for(i=0;i<8;i++)
    {
            if(data & 0x80)     //MSB,???????????
                    SDA_Set();
            else
                    SDA_Reset();
            Delay_us(2);
            SCL_Set();
            Delay_us(2);
      SCL_Reset();
            Delay_us(2);
      data<<=1;
    }
}
u8 I2C_ReadByte(void)
{
    u8 data,i;
        data = 0;
    SDA_IN();
    for(i=0;i<8;i++)
    {
            data<<=1;
            SCL_Set();
      Delay_us(2);
            if(SDA_Get())
                    data|=0x01;    
      SCL_Reset();
      Delay_us(2);
    }
    return data;
}
#define WD_DEVICE_ADDR  0xA6       //ALT ½ÓµØΪA6 ½ÓµçԴΪ3A
#define RD_DEVICE_ADDR  0xA7       //?????IIC???????,??ALT ADDRESS????????
void I2C_WriteData(uint8 addr, uint8 data)
{
    I2C_Start();
    I2C_WriteByte(WD_DEVICE_ADDR);//OLED??
    if(I2C_Wait_Ask()==1)
            return ;
    I2C_WriteByte(addr);//?????
    if(I2C_Wait_Ask()==1)
            return ;
    I2C_WriteByte(data);
    I2C_Wait_Ask();
    I2C_Stop();
}
uint8 I2C_ReadData(uint8 addr)
{
        uint8 temp;
    I2C_Start();
    I2C_WriteByte(WD_DEVICE_ADDR);//OLED??
    if(I2C_Wait_Ask()==1)
            return 0;
    I2C_WriteByte(addr);//?????
    if(I2C_Wait_Ask()==1)
            return 0;
    
    I2C_Start();
    I2C_WriteByte(RD_DEVICE_ADDR);//OLED??
    if(I2C_Wait_Ask()==1)
            return 0;
    temp = I2C_ReadByte();//?????
    I2C_Stop();
        return temp;
}

 

#ifndef __IIC_H__
#define __IIC_H__
#include "Type.h"
#include  "stm32f10x.h"

void I2C_Init(void);
void I2C_WriteData(uint8 addr, uint8 data);
uint8 I2C_ReadData(uint8 addr);

#endif

 

posted @ 2017-01-03 16:57  lort  阅读(378)  评论(0编辑  收藏  举报