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

发布时间:2024-03-25  

(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个数据

文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>