OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 903|回复: 0

AT24C02程序分享

[复制链接]

8

主题

28

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1044
金钱
1044
注册时间
2018-5-21
在线时间
114 小时
发表于 2019-3-4 16:45:09 | 显示全部楼层 |阅读模式
#include "at24c02.h"

GPIO_InitTypeDef  GPIO_InitStruct;

void  SDA_OUT()
{
           GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;
           GPIO_InitStruct.GPIO_Pin=GPIO_Pin_7;
           GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
     GPIO_Init(GPIOB,&GPIO_InitStruct);
}
void SDA_IN()
{
     GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IPU;
           GPIO_InitStruct.GPIO_Pin=GPIO_Pin_7;
     GPIO_Init(GPIOB,&GPIO_InitStruct);
}
void IICInit()
{
           RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
           GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;
           GPIO_InitStruct.GPIO_Pin=GPIO_Pin_6;
           GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
     GPIO_Init(GPIOB,&GPIO_InitStruct);
           SDA_OUT();
}
void IIC_Start()
{
     SDA_OUT();
           SCL=1;
           SDA=1;
           delay_us(4);
           SDA=0;
           delay_us(4);
           SCL=0;
}
void IIC_Stop()
{
     SDA_OUT();
           SCL=0;
           SDA=0;
           delay_us(4);
           SCL=1;
           delay_us(4);
           SDA=1;
           delay_us(4);
}
u8 IIC_Wait_Ack()
{
     u8 t=0;
           SDA_IN();
           delay_us(1);
           SCL=1;
           delay_us(1);
           while(RSDA)
                 {
                     t++;
                           if(t>250)
                                 {
                                    IIC_Stop();
            return 1;                                         
                                 }
                 }
                 SCL=0;
                 return 0;
}
void IIC_Send_Byte(u8 data)
{
     int i=0;
           SDA_OUT();
           SCL=0;
           for(i=0;i<8;i++)
           {
                           if((data&0x80)>>7)
                              SDA=1;
                                 else
                                          SDA=0;
                           data<<=1;
                           delay_us(2);
                           SCL=1;
                           delay_us(2);
                                 SCL=0;
                                 delay_us(2);
                 }
}
u8 IIC_Read_Byte()
{
     int i=0;
     u8 rdata;
     SDA_IN();
     for(i=0;i<8;i++)
     {
                     SCL=0;
                           delay_us(2);
                           SCL=1;
                           rdata<<=1;
                           if(RSDA) rdata++;
                           delay_us(2);
                 }
                 SDA_OUT();
     SCL=0;
     SDA=0;
     delay_us(2);
     SCL=1;
     delay_us(2);
     SCL=0;                 
                 return rdata;
}

u8 AT24C02_ReadOneByte(u16 addr)
{
     u8 data;
           IIC_Start();
           IIC_Send_Byte(0XA0);
           IIC_Wait_Ack();
           IIC_Send_Byte(addr);
           IIC_Wait_Ack();
           IIC_Start();
           IIC_Send_Byte(0XA1);
           IIC_Wait_Ack();
           data=IIC_Read_Byte();
           IIC_Stop();
           return data;
}
void AT24C02_WriteOneByte(u16 addr,u8 data)
{
     IIC_Start();
           IIC_Send_Byte(0XA0);
           IIC_Wait_Ack();
           IIC_Send_Byte(addr);
           IIC_Wait_Ack();
           IIC_Send_Byte(data);
           IIC_Wait_Ack();
           IIC_Stop();
           delay_ms(10);         
}


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-23 21:35

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表