0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

STM32入门学习笔记之EEPROM存储实验4

jf_78858299 来源:滑小稽笔记 作者:电子技术园地 2023-02-16 14:22 次阅读

(2)创建at24cxx.c文件,并输入以下代码。

/*********************************************************************************************************
                EEPROM    驱    动    程    序
*********************************************************************************************************/
#include "at24cxx.h"
#include "delay.h"
/***************************************************
Name    :IIC_Start
Function  :IIC起始信号
Paramater  :None
Return    :None
***************************************************/
void IIC_Start()
{
  GPIOB->CRL &= 0x0FFFFFFF ;                                      //PB7推挽输出
  GPIOB->CRL |= 0x30000000 ;
  IIC_SDA = 1 ;
  IIC_SCL = 1 ;
  delay_us( 4 ) ;
  IIC_SDA = 0 ;
  delay_us( 4 ) ;
  IIC_SCL = 0 ;
}
/***************************************************
Name    :IIC_Stop
Function  :IIC停止信号
Paramater  :None
Return    :None
***************************************************/
void IIC_Stop()
{
  GPIOB->CRL &= 0x0FFFFFFF ;                                      //PB7推挽输出
  GPIOB->CRL |= 0x30000000 ;
  IIC_SCL = 0 ;
  IIC_SDA = 0 ;
   delay_us( 4 ) ;
  IIC_SCL = 1 ;
  IIC_SDA = 1 ;
  delay_us( 4 ) ;
}
/***************************************************
Name    :IIC_Wait_Ack
Function  :IIC等待应答
Paramater  :None
Return    :
      0:成功
      1:失败
***************************************************/
void IIC_Wait_Ack()
{
  u8 Time = 0 ;
  GPIOB->CRL &= 0x0FFFFFFF ;
  GPIOB->CRL |= 0x80000000 ;
  IIC_SDA = 1 ;
  delay_us( 1 ) ;
  IIC_SCL = 1 ;
  delay_us( 1 ) ;
  while( IIC_SDA_READ )
  {
    Time ++ ;
    if( Time>250 )
    {
      IIC_Stop() ;
      break ;
    }
  }
  IIC_SCL = 0 ;
}
/***************************************************
Name    :IIC_Send_Byte
Function  :IIC发送一个字节
Paramater  :
      ack:应答使能
        0:不应答
        1:应答
Return    :None
***************************************************/
void IIC_Send_Byte( u8 Byte )
{
  u8 i;
  GPIOB->CRL &= 0x0FFFFFFF ;                                      //PB7推挽输出
  GPIOB->CRL |= 0x30000000 ;
  IIC_SCL = 0 ;
  for( i=0; i<8; i++ )
  {
    if( ( Byte&0x80 )==0x80 )
      IIC_SDA = 1 ;
    else
      IIC_SDA = 0 ;
    Byte <<= 1 ;
    delay_us( 2 ) ;
    IIC_SCL = 1 ;
    delay_us( 2 ) ;
    IIC_SCL = 0 ;
    delay_us( 2 ) ;
  }
}
/***************************************************
Name    :IIC_Read_Byte
Function  :IIC读取一个字节
Paramater  :
      ack:应答使能
        0:不应答
        1:应答
Return    :None
***************************************************/
u8 IIC_Read_Byte( u8 Ack )
{
  u8 i,Byte=0;
  GPIOB->CRL &= 0x0FFFFFFF ;
  GPIOB->CRL |= 0x80000000 ;
  for( i=0; i<8; i++ )
  {
    IIC_SCL = 0 ;
    delay_us( 2 ) ;
    IIC_SCL = 1 ;
    Byte <<= 1 ;
    if( IIC_SDA_READ )
      Byte |= 0x01 ;
    delay_us( 1 ) ;
  }
  IIC_SCL = 0 ;
  GPIOB->CRL &= 0x0FFFFFFF ;                                      //PB7推挽输出
  GPIOB->CRL |= 0x30000000 ;
  IIC_SDA = 1 - Ack ;
  delay_us( 2 ) ;
  IIC_SCL = 1 ;
  delay_us( 2 ) ;
  IIC_SCL = 0 ;
  return Byte ;
}
/***************************************************
Name    :AT24Cxx_Write_Data
Function  :写入1个数据
Paramater  :
      Address:地址
      Data:数据
Return    :读到的数据
***************************************************/
void AT24Cxx_Write_Data( u16 Address, u8 Data )
{                                                      
  IIC_Start() ;
  IIC_Send_Byte( 0xA0|( Address/256 )<<1 ) ;                              //发送器件地址,写数据
  IIC_Wait_Ack() ;
  IIC_Send_Byte( Address%256 ) ;                                    //发送低地址
  IIC_Wait_Ack() ;
  IIC_Send_Byte( Data ) ;                                        //发送字节
  IIC_Wait_Ack() ;
  IIC_Stop() ;                                            //产生一个停止条件
  delay_ms( 10 ) ;                                          //EEPROM的写入速度比较慢
}
/***************************************************
Name    :AT24Cxx_Write_nData
Function  :写入n个数据
Paramater  :
      Address:地址
      *Buffer:数据缓存
      Len:数据长度
Return    :None
***************************************************/
void AT24Cxx_Write_nData( u16 Address, u8 *Buffer, u16 Len ) 
{
  u16 i ;
  for( i=0; iAPB2ENR |= 1<<3 ;                                        //先使能外设GPIOB时钟
  GPIOB->CRL &= 0x00FFFFFF ;                                      //PB6和PB7推挽输出
  GPIOB->CRL |= 0x33000000 ;
  GPIOB->ODR |= 3<<6 ;                                        //PB6和PB7输出高
  while( AT24Cxx_Check()==0 ) ;
}

(3)创建1.c文件并输入以下代码。

#include "sys.h"
#include "delay.h"
#include "usart1.h"
#include "lcd.h"
#include "at24cxx.h"


u8 TEXT_Buffer[] = "STM32F103 IIC Test" ;
int main()
{
  u8 datatemp[ 17 ] ;
  STM32_Clock_Init( 9 ) ;                                        //STM32时钟初始化
  SysTick_Init( 72 ) ;                                        //SysTick初始化
  USART1_Init( 72, 115200 ) ;                                      //初始化串口1波特率115200
  LCD_Init() ;                                            //LCD初始化
  AT24Cxx_Init() ;                                          //AT24C初始化
   POINT_COLOR = RED ;                                          //设置字体为红色
  AT24Cxx_Write_nData( 0, TEXT_Buffer, 18 ) ;                              //从第0个地址处开始写入
  AT24Cxx_Read_nData( 0, datatemp, 18 ) ;                                //从第0个地址处开始读出
  LCD_ShowString( 0, 0, datatemp ) ;                                  //显示读到的字符串
  while( 1 )
  {

  }
}

16.4.2 硬件IIC控制

注:由于STM32的硬件IIC总是容易卡死(这也是为什么网络上几乎没有硬件IIC通讯的例子的原因),所以这里采用了ST内部提供的通讯机制来保证IIC的正常使用。

(1)创建at24cxx.h文件并输入以下代码。

/*********************************************************************************************************
                EEPROM    驱    动    文    件
*********************************************************************************************************/
#ifndef _AT24Cxx_H_
#define _AT24Cxx_H_


#include "sys.h"
/*********************************************************************************************************
                    函    数    列    表
*********************************************************************************************************/
void AT24Cxx_Init( void ) ;                                        //AT24C初始化
void IIC_Write_Data( u8 Address, u8 Data ) ;                              //写入1个数据
void AT24Cxx_Write_nData( u16 Address, u8 *Buffer, u16 Len ) ;                      //写入n个数据
void AT24Cxx_Read_Data( u16 Address, u8 *Data ) ;                            //读取1个数据
void AT24Cxx_Read_nData( u16 Address, u8 *Buffer, u16 Len ) ;                      //读取n个数据


#endif
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 存储器
    +关注

    关注

    38

    文章

    7484

    浏览量

    163774
  • EEPROM
    +关注

    关注

    9

    文章

    1019

    浏览量

    81564
  • 存储芯片
    +关注

    关注

    11

    文章

    896

    浏览量

    43136
收藏 人收藏

    评论

    相关推荐

    小白高手都适用,STM32学习教程(入门合集、自学笔记和例程)

    、安全特性等方面对STM32进行全面的剖析;第4章主要介绍开发工具;第5章则引导读者针对STM32的外设进行一系列的基础实验设计;第6章通过10篇高级应用文章介绍
    发表于 04-10 14:56

    CubeMX入门STM32 HAL库的学习笔记

    STM32CubeMX是ST官方开发的一款很好用的软件,主要用于STM32系列单片机的硬件驱动层的配置。网上也有一些关于STM32CubeMX的相关教程,对它的相关操作进行说明。从今天起,小柯希望能将自己从CubeMX
    发表于 08-17 06:55

    STM32入门学习笔记 精选资料分享

    STM32入门学习笔记本文为笔者入门学习过程的记录,只是零散的记录了一些个人不太懂得,觉得需要经
    发表于 08-24 07:56

    EEPROM开机记忆存储实验

    EEPROM开机记忆存储实验
    发表于 07-13 18:10 25次下载

    STM32各模块学习笔记

    ..........................................................4 STM32笔记STM3
    发表于 11-30 03:32 3158次阅读

    单片机学习EEPROM-IIC实验的资料合集免费下载

    本文档的主要内容详细介绍的是单片机学习EEPROM-IIC实验的资料合集免费下载。
    发表于 07-21 08:00 1次下载
    单片机<b class='flag-5'>学习</b><b class='flag-5'>之</b><b class='flag-5'>EEPROM</b>-IIC<b class='flag-5'>实验</b>的资料合集免费下载

    STM32F4 I2C-EEPROM实验例程

    STM32F4 I2C-EEPROM实验例程(嵌入式开发专业课程)-STM32F4 I2C-EEPROM
    发表于 07-30 16:02 19次下载
    <b class='flag-5'>STM32F4</b> I2C-<b class='flag-5'>EEPROM</b><b class='flag-5'>实验</b>例程

    STM32学习笔记1——软硬件基础keil5编程与GPIO开发

    STM32学习笔记1——软硬件基础keil5编程与GPIO开发
    发表于 11-30 12:36 4次下载
    <b class='flag-5'>STM32</b><b class='flag-5'>学习</b><b class='flag-5'>笔记</b>1——软硬件基础<b class='flag-5'>之</b>keil5编程与GPIO开发

    STM32学习I2C协议(读写EEPROM

    关于STM32学习分享第七章 I2C协议(读写EEPROM)文章目录关于STM32学习分享前言二、代码1.i2c.c2.i2c.h3.mai
    发表于 11-30 15:21 32次下载
    <b class='flag-5'>STM32</b><b class='flag-5'>学习</b><b class='flag-5'>之</b>I2C协议(读写<b class='flag-5'>EEPROM</b>)

    STM32入门学习笔记EEPROM存储实验1

    EEPROM(Electrically Erasable Programmable read only memory),称为带电可擦除可编程只读存储器,是一种可以断电保存数据的存储芯片,EEP
    的头像 发表于 02-16 14:22 2383次阅读
    <b class='flag-5'>STM32</b><b class='flag-5'>入门</b><b class='flag-5'>学习</b><b class='flag-5'>笔记</b><b class='flag-5'>之</b><b class='flag-5'>EEPROM</b><b class='flag-5'>存储</b><b class='flag-5'>实验</b>1

    STM32入门学习笔记EEPROM存储实验2

    EEPROM(Electrically Erasable Programmable read only memory),称为带电可擦除可编程只读存储器,是一种可以断电保存数据的存储芯片,EEP
    的头像 发表于 02-16 14:22 940次阅读

    STM32入门学习笔记EEPROM存储实验3

    EEPROM(Electrically Erasable Programmable read only memory),称为带电可擦除可编程只读存储器,是一种可以断电保存数据的存储芯片,EEP
    的头像 发表于 02-16 14:22 1119次阅读

    STM32入门学习笔记EEPROM存储实验5

    EEPROM(Electrically Erasable Programmable read only memory),称为带电可擦除可编程只读存储器,是一种可以断电保存数据的存储芯片,EEP
    的头像 发表于 02-16 14:23 617次阅读

    STM32入门学习笔记SD卡基础读写实验4

    SD卡是嵌入式系统中最常见的存储器,不仅容量可以做的很大,并且接口通用,支持SPI/SDIO驱动,尺寸可供选择,能满足不同应用的要求。STM32F1系列自带了标准的4位SDIO接口,最高通信速度可达24MHz,最高每秒能传输12
    的头像 发表于 02-16 15:09 1454次阅读

    EEPROM存储实验

    可以在电脑上或专用设备上擦除已有信息,重新编程,一般用在即插即用设备中,这种存储芯片可以通过高于普通电压的作用来擦除或重写,EEPROM芯片一般用在需要频繁存储数据,但是数据量不大的场合,本
    的头像 发表于 03-01 14:54 9506次阅读
    <b class='flag-5'>EEPROM</b><b class='flag-5'>存储</b><b class='flag-5'>实验</b>