单片机
返回首页

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

进入单片机查看更多内容>>
相关视频
  • RISC-V嵌入式系统开发

  • SOC系统级芯片设计实验

  • 云龙51单片机实训视频教程(王云,字幕版)

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

精选电路图
  • 红外线探测报警器

  • 短波AM发射器电路设计图

  • RS-485基础知识:处理空闲总线条件的两种常见方法

  • 如何调制IC555振荡器

  • 基于ICL296的大电流开关稳压器电源电路

  • 基于TDA2003的简单低功耗汽车立体声放大器电路

    相关电子头条文章