STM32 模拟 IIC 读写 24C02 程序代码
引脚定义和配置:
#define SCL
#define SDA
GPIO_Pin_6 //24C02 SCL
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;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
//24C02 SCL
GPIO_InitStructure.GPIO_Pin = SDA;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
//24C02 SDA 作为输出
}
void AT24C02_SDA_IO_SET(unsigned char io_set) //SDA 引脚输入输出设置
{
if(io_set==0)
//24C02 SDA 作为输出
{
GPIO_InitStructure.GPIO_Pin = 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;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
//24C02 SDA 作为输入
//上拉输入
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 读写程序
/**********************中文版本*******************************/
/*****功能描述 :
*****/
/*****作 者 :
/*****编写日期 : 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);
据 info
//向 24c02 的 address 地址中写入一字节数
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