您的位置 首页 产品

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

引脚定义和配置:#defineSCLGPIO_Pin_6//24C02SCL#defineSDAGPIO_Pin_7//24C02SDAvoidGPIO_Configuration(void){RCC

引脚界说和装备:

#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

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/xinpin/chanpin/267119.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部