STM32F103系列IIC通讯代码

CH1--SDA;

CH2--SCL。

 

#include "iic.h"
void IIC_GPIO_Init(void)
{
    GPIO_InitTypeDef   GPIO_InitStruct;

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_1;
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; //PA1 - SCL
    

    GPIO_Init(GPIOA, &GPIO_InitStruct);//SCL会被拉低

    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; //PA0 - SDA SDA会被拉低

    GPIO_Init(GPIOA, &GPIO_InitStruct);

    

    
}
void IIC_SDA_OUT(void)
{
    GPIO_InitTypeDef   GPIO_InitStruct;

    

    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; //PA0 - SDA

    GPIO_Init(GPIOA, &GPIO_InitStruct);
}

void IIC_SDA_IN(void)
{
    GPIO_InitTypeDef   GPIO_InitStruct;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;

    GPIO_Init(GPIOA, &GPIO_InitStruct);
}
void IIC_Init(void)
{
    IIC_SCL_H;
    IIC_SDA_H;
}

void IIC_Start(void)
{
     
     IIC_SDA_H;
     Delayus(5);
     IIC_SCL_H;
     Delayus(6);
     IIC_SDA_L;
     Delayus(5);
     IIC_SCL_L;
     Delayus(5);


}

void IIC_Stop(void)
{
     
     IIC_SDA_L;
     Delayus(5);
     IIC_SCL_H;
     
     Delayus(6);
     IIC_SDA_H;
     Delayus(5);
    
}

void IIC_Ack(void)
{
    IIC_SDA_IN();
    Delayus(5);
    if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0)==0)
    {
        IIC_SDA_OUT();
        IIC_SDA_L;
        
    }
    else
    {
        IIC_SDA_OUT();
        IIC_SDA_H;
    }
    IIC_SCL_H;
    Delayus(5);


    IIC_SCL_L;
    Delayus(5);
}


void IIC_NoAck(void)
{
    Delayus(6);
    

    IIC_SDA_H;

    Delayus(5);

    IIC_SCL_L;
    Delayus(5);
    IIC_SDA_L;

    Delayus(5);
}



void IIC_Write(uint8_t byte)
{
    uint8_t i;

    Delayus(5);
    for(i = 0; i < 8; i ++)
    {
        
        if((byte&0x80) == 0x80)
        {
            IIC_SDA_H;
        }
        else
        {
            IIC_SDA_L;
        }
        byte = byte << 1;

        Delayus(5);
        IIC_SCL_H;
        Delayus(5);
        IIC_SCL_L;
        Delayus(5);


    }
    IIC_SDA_L;
    IIC_SCL_L;
    
}

uint8_t IIC_Read(void)
{
    uint8_t i = 0,val = 0;
    IIC_SDA_IN();

    for(i = 0; i < 8; i ++)
    {
        
        IIC_SCL_L;
        
        Delayus(5);
        val = (val << 1);
        if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0))
        {
            val |= 0x01;
        }
        else
        {
            val |= 0x00;
        }
        

        Delayus(5);
        IIC_SCL_H;
        Delayus(5);

    }
    IIC_SCL_L;
    Delayus(5);
    

    
    IIC_SDA_OUT();

    return val;
}

void IIC_WriteByte(uint8_t addr, uint8_t data)
{
//    IIC_Init();
    IIC_Start();
    IIC_Write(0xae);
    IIC_Ack();
    IIC_Write(addr);
    IIC_Ack();
    IIC_Write(data);
    IIC_Ack();
    IIC_Stop();
}

uint8_t IIC_ReadByte(uint8_t addr)
{
    uint8_t val = 0;
    IIC_Start();
    IIC_Write(0xae);
    IIC_Ack();
    IIC_Write(addr);
    IIC_Ack();


    IIC_Start();
    IIC_Write(0xaf);
    IIC_Ack();
    val = IIC_Read();
    IIC_NoAck();
    IIC_Stop();

    return val;
}
#include "stm32f10x.h"

#include "delay.h"
#include "iic.h"
#include "led.h"

uint8_t Value = 0;

int main(void)
{
    
    Delay_Init();
    IIC_GPIO_Init();
    LED_GPIO_Init();
    
    IIC_WriteByte(0x01, 0xF5);
    Delayus(500000);
    Delayus(500000);

    Value = IIC_ReadByte(0x01);
    Delayus(500000);
    while(1)
    {
        if(Value == 0xF5)LED_Test();
        else
        {
              LED(ON);
        }
    }
    
}

 

posted @ 2024-04-02 13:54  了解2号  阅读(111)  评论(0编辑  收藏  举报