新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > STM32 模拟IIC读写24C02程序代码

STM32 模拟IIC读写24C02程序代码

作者: 时间:2016-11-18 来源:网络 收藏
引脚定义和配置:

#define SCL GPIO_Pin_6 //24C02 SCL
#define SDA GPIO_Pin_7 //24C02 SDA

本文引用地址:https://www.eepw.com.cn/article/201611/316004.htm

void GPIO_Configuration(void)
{

RCC_APB2PeriphClockCmd( RCC_APB2Periph_USART1 |RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB |
RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD |
RCC_APB2Periph_GPIOE, ENABLE);

GPIO_InitStructure.GPIO_Pin = SCL; //24C02 SCL
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = SDA; //24C02 SDA 作为输出
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);

}


void AT24C02_SDA_IO_SET(unsigned char io_set) //SDA引脚输入输出设置
{
if(io_set==0)
{
GPIO_InitStructure.GPIO_Pin = SDA; //24C02 SDA 作为输出
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
else if(io_set==1)
{
GPIO_InitStructure.GPIO_Pin = SDA; //24C02 SDA 作为输入
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //上拉输入
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
else
{;}
}


////////////////////////////////////主程序//////////////////////////////////////////////////////////////////////

////////
int main(void)
{ uchar i;
uchar data_24c02;
RCC_Configuration(); //时钟配置
GPIO_Configuration();//GPIO配置
USARTx_configuration();//串口配置


WIN24C02_init();
delayms(5000);//延时


for(i=0;i<20;i++)//写EEPROM数据
{ WIN24C02_write(0x00+i,i);delayms(100);}//存数据到EEPROM
delayms(1000);//延时

while(1)//串口3发送读取的EEPROM的数据
{
for(i=0;i<20;i++)
{ data_24c02=WIN24C02_read(0x00+i);//读取24C02数据
USART_SendData(USART3 ,data_24c02);
while(USART_GetFlagStatus(USART3, USART_FLAG_TC)==RESET);
}
delayms(5000);//延时
}

}

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////

WIN_24C02.H头文件


/**********************中文版本*******************************/
/*****功能描述 : STM32 24C02 读写程序 *****/
/*****作 者 : 郑文(ClimberWin) *****/
/*****编写日期 : 2013年1月21日 *****/
/*****版本信息 : V1.0 *****/
/*****修改日期 : *****/
/*************************************************************/
#ifndef __WIN24C02_H__
#define __WIN24C02_H__

#include"STM32_Config.h"
#define uchar unsigned char
#define uint unsigned int


uchar WIN24C02_read(uchar address); //从24c02的地址address中读取一个字节数据

void WIN24C02_write(uchar address,uchar info); //向24c02的address地址中写入一字节数据info

void WIN24C02_init(); //24c02初始化子程序

void delay_nop(void);

void delay2(uint x);

void start();

void stop();

void writex(uchar j);

uchar readx();

void clock();

void delay2(uint x)
{
uint i;
for(i=0;i}

void delay_nop(void)
{
uint8_t i=10; //i=10延时1.5us//这里可以优化速度 ,经测试最低到5还能写入
while(i--);

}

void WIN24C02_init()
{

//SCL=1;
GPIO_SetBits(GPIOB,SCL);
delay_nop();
//SDA=1;
GPIO_SetBits(GPIOB,SDA);
delay_nop();
}

void start()
{
//SDA=1;
GPIO_SetBits(GPIOB,SDA);
delay_nop();
//SCL=1;
GPIO_SetBits(GPIOB,SCL);
delay_nop();
//SDA=0;
GPIO_ResetBits(GPIOB, SDA);
delay_nop();
//SCL=0;
GPIO_ResetBits(GPIOB, SCL);
delay_nop();
}

void stop()

{
//SDA=0;
GPIO_ResetBits(GPIOB, SDA);
delay_nop();
//SCL=1;
GPIO_SetBits(GPIOB,SCL);
delay_nop();
//SDA=1;
GPIO_SetBits(GPIOB,SDA);
delay_nop();
}

void writex(uchar j)

{
uchar i,temp,temp1;

temp=j;
//AT24C02_SDA_IO_SET(0);
for (i=0;i<8;i++)
{
temp1=temp & 0x80;
temp=temp<<1;

//SCL=0;
GPIO_ResetBits(GPIOB, SCL);
delay_nop();

//SDA=CY;
if(temp1==0x80)
{GPIO_SetBits(GPIOB, SDA);}
else
{GPIO_ResetBits(GPIOB, SDA);}

delay_nop();
// SCL=1;
GPIO_SetBits(GPIOB,SCL);
delay_nop();
}
//AT24C02_SDA_IO_SET(0);
//SCL=0;
GPIO_ResetBits(GPIOB, SCL);
delay_nop();
//SDA=1;
GPIO_SetBits(GPIOB,SDA);
delay_nop();

}

uchar readx()
{
uchar i,j,k=0;

//SCL=0;
GPIO_ResetBits(GPIOB, SCL);
delay_nop();
//SDA=1;
GPIO_SetBits(GPIOB,SDA);

AT24C02_SDA_IO_SET(1);
for (i=0;i<8;i++)
{
delay_nop();
//SCL=1;
GPIO_SetBits(GPIOB,SCL);
delay_nop();
//if (SDA==1) j=1;
if( GPIO_ReadInputDataBit(GPIOB,SDA)==1 )
{j=1;}
else
{j=0;}
k=(k<<1)|j;
//SCL=0;
GPIO_ResetBits(GPIOB, SCL);
}
AT24C02_SDA_IO_SET(0);
delay_nop();
return(k);

}

void clock()

{
uint i=0;
AT24C02_SDA_IO_SET(1);
//SCL=1;
GPIO_SetBits(GPIOB,SCL);
delay_nop();
while ((GPIO_ReadInputDataBit(GPIOB,SDA)==1)&&(i<5000))i++;
//SCL=0;
GPIO_ResetBits(GPIOB, SCL);
delay_nop();
AT24C02_SDA_IO_SET(0);

}

uchar WIN24C02_read(uchar address)

{
uchar i;
start();
writex(0xa0);
clock();
writex(address);
clock();
start();
writex(0xa1);
clock();
i=readx();
stop();
//delay2(10);
delay2(50);
return(i);

}

void WIN24C02_write(uchar address,uchar info)

{

start();
writex(0xa0);
clock();
writex(address);
clock();
writex(info);
clock();
stop();
//delay2(50);
delay2(250);

}

#endif



评论


技术专区

关闭