STM32 模拟IIC读写24C02程序代码
2016-09-06 来源:eefocus
#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;
//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