wztvista 发表于 2018-3-23 00:23:53

F0系列的24c02的I2C

跪求一个STM32 F0系列的24c02的I2C读写程序,谢谢了。希望有朋友能帮帮我,在此谢过了。

toofree 发表于 2018-3-23 00:23:54


HAL库中有一个F072的,路径“STM32Cube_FW_F0_V1.9.0\Projects\STM32F072B-Discovery\Examples\I2C\I2C_EEPROM”



#define EEPROM_ADDRESS          0xA0 //地址根据,你A0A1A2的状态改,如果全接0了,那就是A0
#define EEPROM_PAGESIZE         8      //这个改成8,24C02一页8字节





MrJiu 发表于 2018-3-23 10:11:19

官方例子里面啥都有,但是个人建议ST的I2C还是用模拟的好。。。;P;P;P

Tcreat 发表于 2018-3-23 10:57:05

社区有类似的帖子 还是建议LZ先搜索下 不要一味的依赖   这是我14年发的帖子:https://www.stmcu.org.cn/module/forum/thread-577721-1-1.html

Angel_YY 发表于 2018-3-23 13:17:33

发一个STM32模拟IIC的代码以供参考。
#define SCL_PORT        GPIOA
#define SCL_PIN                GPIO_Pin_1
#define SCL_HIGH        GPIOA->BSRR=(uint32_t)GPIO_Pin_1
#define SCL_LOW                GPIOA->BRR=(uint32_t)GPIO_Pin_1

#define        SDA_PORT        GPIOA
#define        SDA_PIN                GPIO_Pin_2
#define        SDA_HIGH        GPIO_>BSRR=(uint32_t)GPIO_Pin_2
#define SDA_LOW                GPIOA->BRR=(uint32_t)GPIO_Pin_2
#define        SDA_READ        (uint16_t)(GPIOA->ID&GPIO_Pin_2)
#define        SDA_OUT                GPIOA->MODER|=((uint32_t)GPIO_Mode_OUT)<<(2*2))
#define SDA_IN                GPIOA->MODER&=(GPIO_MODER_MODERO)<<(2*2))

#define SCL_OUTH()        SCL_HIGH
#define SCL_OUTL()        SCL_LOW
#define        SDA_OUTH()        SDA_HIGH
#define        SDA_OUTL()        SDA_LOW
#define        SDA_SETIN()        SDA_IN
#define        SDA_READ()        SDA_READ


void I2C_Delay(void)
{
        uint8_t i = 200;
        while(i--);
}

void SDA_SETOUT(void)
{
        SDA_IN;
        SDA_OUT;
}

void I2C_Start(void)
{
        SCL_OUTH();
        SDA_OUTH();
        I2C_Delay();
        SDA_OUTL();
        I2C_Delay();
        SCL_OUTL();
        I2C_Delay();
}

void I2C_Stop(void)
{
        SCL_OUTL();
        SDA_OUTL();
        I2C_Delay();
        SCL_OUTH();
        I2C_Delay();
        SDA_OUTH();
        Delay(Delay5ms);//Delay() 为系统延时,用于确保数据传输正确
}

uint8_t I2C_WriteByte(uint8_t Data)
{
        uint8_t i,bAck=0;
       
        for(i=0;i<8;i++)
        {
                SCL_OUTL();
                if(Data & 0x80)
                        SDA_OUTH();
                else
                        SDA_OUTL();
                I2C_Delay();
                SCL_OUTH();
                I2C_Delay();
                Data <<=1;
        }
       
        SCL_OUTL();
        I2C_Delay();
        SCL_OUTH();
        I2C_Delay();
        SDA_SETIN();
        if(SDA_READ())
                bAck=1;
        else
                bAck=0;
       
        SCL_OUTL();
        SDA_SETOUT();
        I2C_Delay();
        return ((uint8_t)(!bAck));
}

uint8_t I2C_ReadByte(uint8_t bLSByte)
{
        uint8_t i,Data=0;
        SDA_SETIN();
        for(i=8;i!=8;i--)
        {
                SCL_OUTL();
                Data = Data<<1;
                I2C_Delay();
                SCL_OUTH();
                I2C_Delay();
               
                if(SDA_READ())
                        Data |=0x01;
                else
                        Data &=0xFE;
        }
        SCL_OUTL();
        SDA_SETOUT();
        if(bLSByte)
                SDA_OUTH();
        else
                SDA_OUTL();
        I2C_Delay();
        SCL_OUTH();
        I2C_Delay();

        SCL_OUTL();
        I2C_Delay();
        return(Data);
}

uint8_t DAC_Write_1byte(uint8_t Slave,uint8_t Regist_Addr,uint8_t Data)
{
        uint8_t succ,time=0;
       
        I2C_Start();
        succ=I2C_ReadByte(Slave);
        while((succ!=1)&&(time<3))   //从机没有响应,重试三次
        {
                I2C_Stop();
                I2C_Start();
                succ=I2C_WriteByte(Slave);
                time++;
        }
        succ=I2C_WriteByte(Regist_Addr);//发送寄存器地址
        succ=I2C_WriteByte(Data);//发送数据
        I2C_Stop();
        return succ;
}

uint8_t DAC_Read_1byte(uint8_t Slave,uint8_t,Regist_Addr)
{
        uint8_t succ,time=0;
        uint8_t dat;
       
        I2C_Start();
        succ=I2C_WriteByte(Slave+1)//加1表示读数据
        while((succ!=1)&&(time<3))
        {
                I2C_Stop();
                I2C_Start();
                succ=I2C_WriteByte(Slave+1);
                time++;
        }
        succ=I2C_WriteByte(Regist_Addr);
        dat=I2C_ReadByte(0);
        I2C_Stop();
        return dat;
}



jiahua1010 发表于 2018-3-23 13:44:47

进来学习下IIC的代码

stm1024 发表于 2018-3-23 16:36:25

用GPIO模拟IIC就行了,反正硬件的IIC我是一直没摸透

butterflyspring 发表于 2018-3-23 16:47:35

好吧,你们都解决了,厉害.用硬件IIC时,注意中断优先级就好

wztvista 发表于 2018-3-24 22:53:46

Tcreat 发表于 2018-3-23 10:57
社区有类似的帖子 还是建议LZ先搜索下 不要一味的依赖   这是我14年发的帖子:https://www.stmcu.org.cn/module ...

谢谢了 ,你这份资料在发这个帖子以前我就看过了。很有干货,之所以寻找2402的标准代码,是为了找我自己代码里的原因。谢谢您了啦

wztvista 发表于 2018-3-24 22:54:50

Angel_YY 发表于 2018-3-23 13:17
发一个STM32模拟IIC的代码以供参考。

谢谢了,谢谢帮助
页: [1] 2 3
查看完整版本: F0系列的24c02的I2C