微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > STM32 模拟IIC读写24C02程序代码

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

时间:11-18 来源:互联网 点击:
引脚定义和配置:

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

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;

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top