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

发布者:colchery最新更新时间:2016-09-06 来源: eefocus关键字:STM32  模拟IIC  读写24C02 手机看文章 扫描二维码
随时随地手机看文章
引脚定义和配置:

#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

关键字:STM32  模拟IIC  读写24C02 引用地址:STM32 模拟IIC读写24C02程序代码

上一篇:STM32F103V 模拟IO 读取DS1302 程序
下一篇:STM32F103V 4串口电路

推荐阅读最新更新时间:2024-03-16 15:08

stm32的DMA空闲中断数据配置
对于串口2的示例: void USART2_Config(void) { GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; DMA_InitTypeDef DMA_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE); RCC_AHBPeriphClockCmd(
[单片机]
STM32中的SPI总线介绍
SPI总线概述 SPI总线介绍 SPI是由摩托罗拉(Motorola)公司开发的全双工同步串行总线,是微处理控制单元(MCU)和外围设备之间进行通信的同步串行端口。主要应用在EEPROM、Flash、实时时钟(RTC)、数模转换器(ADC)、网络控制器、MCU、数字信号处理器(DSP)以及数字信号解码器之间。 SPI总线接口和物理拓扑结构 接口: 五线制接口(四线SPI):全双工 MOSI(主出从入)、MISO(主入从出)、SCK、CS、GND 四线制接口(三线SPI):半双工 IO(双向通信数据线)、SCK、CS、GND 物理拓扑结构:支持一主多从,依靠片选线区分从设备,每增加一个从设备就要增加一个片选线,消耗一个IO口。
[单片机]
<font color='red'>STM32</font>中的SPI总线介绍
STM32的SPI外设片选只有一个怎么破
之前用STM32的 SPI 需要控制很多外部芯片,可是一个SPI的外设只有一个片选,要实现独立片选一主多从,怎么实现呢? SPI总线拓扑 一般地,SPI总线按照下图方式进行连接,一主多从。 如上图: 每个从设备都有独立的片选引脚,主机同一时间段内,与一个从设备进行通信,也即选中一个从设备。MOSI/MISO/SCLK并联在一起MISO须是三态门,当从设备未选中时,该脚须设置为高阻态,而不能是输出态,否则会影响总线!对于MOSI/SCLK,虽然并联在一起,但是由于仅一个输出,多输入。 但是你看STM32的SPI外设,一个SPI仅有一个NSS信号,以STM32F407的SPI2为例: 那么要实现前面说的一主多从,怎么办呢?有
[单片机]
STM32内部RAM在线调试配置方法及详细说明 (基于Keil开发工具)
Ⅰ、写在前面 本文主要讲述的内容:基于Keil开发工具下,STM32内部RAM在线调试配置方法,以及每一项配置的详细说明。 让程序运行在RAM中调试代码有两优点:1.速度快;2.减少对芯片FLASH读写次数,增加芯片寿命。 本文牵涉的知识比较多,如果弄明白所有细节问题,对自己这方面的技能是一种很大的提升。 本文基于ST公司Cortex-M内核的STM32来讲述其配置方法,其实也适用于其他公司(如:TI、NXP等)的Cortex-M芯片,原理都是一样的。 本文PDF文章可以在我360云盘下载: https://yunpan.cn/ckvUU7t8vuWbn访问密码 42b3 关于本文的更多详情请往下看。 Ⅱ、本文要点
[单片机]
<font color='red'>STM32</font>内部RAM在线调试配置方法及详细说明 (基于Keil开发工具)
STM32中断向量表偏移量0x200详解
ST公司重定位向量表的库函数: void NVIC_SetVectorTable(uint32_t NVIC_VectTab, uint32_t Offset) { assert_param(IS_NVIC_VECTTAB(NVIC_VectTab)); assert_param(IS_NVIC_OFFSET(Offset)); SCB- VTOR = NVIC_VectTab | (Offset & (uint32_t)0x1FFFFF80); } 其中NVIC_VectTab要么是FLASH要么是RAM的起始位置,Offset: Vector Table base offset field.
[单片机]
关于STM32的D M A问题集锦
1、求教DMA存取AD9235的数据问题 问:AD9235输出12位数据(D11-D0),将(D11-D0)分别接到13个I/O口上,用stm32的DMA将数据存进stm32内部? 答:可以,也可以通过实时的去读取IO口的状态。 2、是否可以直接使用DMA将高速的SPI数据传输并写到内部FLASH?这样是否存在溢出问题? 问:使用DMA将SPI的数据传输并写到内部FLASH时,如果SPI速度较高,是否会存在溢出问题,通常是如何解决的呢? 答:任何接受数据处理的时候都会遇到溢出的问题,只要产生中断,马上把数据读取走就不会溢出。而在处理的过程中,建议使用缓冲区功能,将数据放入缓冲区,然后再放入到FLASH中。
[单片机]
stm32 Fatfs 读写SD卡
读写SD是嵌入式系统中一个比较基础的功能,在很多应用中都可以用得上SD卡。折腾了几天,总算移植成功了 最新版Fatfs(Fatfs R0.09) ,成功读写SD卡下文件。 FatFs ( http://elm-chan.org/fsw/ff/00index_e.html )是一个通用的文件系统模块,用于在小型嵌入式系统中实现FAT文件系统。 FatFs 的编写遵循ANSI C,因此不依赖于硬件平台。它可以嵌入到便宜的微控制器中,如 8051, PIC, AVR, SH, Z80, H8, ARM 等等,不需要做任何修改。 1. SD卡/TF卡 硬件接口 SD卡有两种操作接口,SDIO和SPI。
[单片机]
<font color='red'>stm32</font> Fatfs <font color='red'>读写</font>SD卡
STM32 SysTick定时器讲解
STM32 SysTick定时器讲解 本文将介绍SysTick定时器、其工作原理与寄存器、及对应的应用实例 SysTick定时器简介 首先、我们先解释下定时器,“定时器”:能够定时、计数的器件 SysTick称为系统滴答定时器,它位于Cortex 内核中是一个定时器,可以对输入的时钟进行计数、若输入的时钟具有周期性的变化,则计数也相当于计时。 系统滴答定时器一般用于操作系统,为操作系统提供时基、维持操作系统的心跳; 系统滴答定时器每过一段时间会产生一个中断,根据这个特性、操作系统就可以实现时间片的任务调度。 工作原理分析 从上述两张图我们可以看出: 系统滴答定时器的时钟源是从SYSCLK处经过分频得到的,另外它处于内核中
[单片机]
<font color='red'>STM32</font> SysTick定时器讲解
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved