在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

STM32入門學習筆記之EEPROM存儲實驗5

jf_78858299 ? 來源:滑小稽筆記 ? 作者:電子技術園地 ? 2023-02-16 14:23 ? 次閱讀

(2)創建at24cxx.c文件并輸入以下代碼。

/*********************************************************************************************************
                EEPROM    驅    動    程    序
*********************************************************************************************************/
#include "at24cxx.h"
#include "delay.h"
/***************************************************
Name    :IIC_Write_Data
Function  :寫入1個數據
Paramater  :
      Address:地址
      Byte:讀取的字節
Return    :None
***************************************************/
void IIC_Write_Data( u8 Address, u8 Byte )
{
  u16 Time, tmpreg ;
  tmpreg = tmpreg ;
  //等待BUSY標志置0
  Time = 0 ;
  while( ( ( I2C1->SR2&0x02 )==0x02 )&&( Time<65535 ) )
    Time ++ ;
  I2C1->CR1 &= ~( 1<<11 ) ;                                      //禁用Pos
  I2C1->CR1 |= 1<<8 ;                                          //開始信號
  //等待SB標志置1
  Time = 0 ;
  while( ( ( I2C1->SR1&0x01 )==0 )&&( Time<65535 ) )
    Time ++ ;
  I2C1->DR = 0xA0 ;                                          //發送從機地址
  //等待地址發送結束
  Time = 0 ;
  while( ( ( I2C1->SR1&0x02 )==0 )&&( Time<65535 ) )
  {
    Time ++ ;
    if( ( I2C1->SR1&0x400 )==0x400 )
    {
      I2C1->SR1 &= ~( 1<<10 ) ;                                  //清除AF標志
      I2C1->CR1 |= 1<<9 ;                                      //結束信號
      break ;
    }
  }
  tmpreg = I2C1->SR1 ;                                        //清除地址標志
  tmpreg = I2C1->SR2 ;
  //等待TXE標志置0
  Time = 0 ;
  while( ( ( I2C1->SR2&0x04)==0 )&&( Time<65535 ) )
  {
    Time ++ ;
    //檢查是否檢測到NACK
    if( ( I2C1->SR1&0x400 )==0x400 )
    {
      I2C1->SR1 &= ~( 1<<10 ) ;
      I2C1->CR1 |= 1<<9 ;                                      //結束信號
      break ;
    }
  }
  I2C1->DR = Address ;                                        //發送寄存器地址
  //等待TXE標志置1
  Time = 0 ;
  while( ( ( I2C1->SR1&0x80 )==0 )&&( Time<65535 ) )
  {
    Time ++ ;
    //檢查是否檢測到NACK
    if( ( I2C1->SR1&0x400 )==0x400 )
    {
      I2C1->SR1 &= ~( 1<<18 ) ;                                  //清除NACKF標志
      I2C1->CR1 |= 1<<9 ;                                      //結束信號
      break ;
    }
  }
  I2C1->DR = Byte ;                                          //發送數據
  //等待BTF標志被置1
  Time = 0 ;
  while( ( ( I2C1->SR1&0x04 )==0 )&&( Time<65535 ) )
  {
    Time ++ ;
    //檢查是否檢測到NACK
    if( ( I2C1->SR1&0x400 )==0x400 )
    {
      I2C1->SR1 &= ~( 1<<10 ) ;                                  //清除NACKF標志
      I2C1->CR1 |= 1<<9 ;                                      //結束信號
      break ;
    }
  }
  I2C1->CR1 |= 1<<9 ;                                          //結束信號
  delay_ms( 10 ) ;
}
/***************************************************
Name    :IIC_Read_Data
Function  :讀取1個數據
Paramater  :
      Address:地址
Return    :讀取的數據
***************************************************/
void IIC_Read_Data( u8 Address, u8 *Data )
{
  u16 tmpreg, Time;
  tmpreg = tmpreg ;
    //等待BUSY標志置0
  Time = 0 ;
  while( ( ( I2C1->SR1&0x02 )==0x02 )&&( Time<65535 ) )
    Time ++ ;
  I2C1->CR1 &= ~( 1<<11 ) ;                                      //禁用Pos
    //發送從機地址
  I2C1->CR1 |= 1<<8 ;                                          //開始信號
  Time = 0 ;
  //等待SB標志置1
  while( ( ( I2C1->SR1&0x01 )==0 )&&( Time<65535 ) )
    Time ++ ;
  I2C1->DR = 0xA0 ;                                          //發送從機地址
  //等待地址發送結束
  while( ( ( I2C1->SR1&0x02 )==0 )&&( Time<65535 ) )
  {
    if( ( I2C1->SR1&0x400 )==0x400 )
    {
      I2C1->SR1 &= ~( 1<<10 ) ;                                  //清除AF標志
      I2C1->CR1 |= 1<<9 ;                                      //停止信號
      break ;
    }
  }
  tmpreg = I2C1->SR1;                                          //清除ADDR標志
  tmpreg = I2C1->SR2;
  //等待TXE標志置1
  while( ( ( I2C1->SR1&0x80 )==0 )&&( Time<65535 ) )
  {
    //檢查是否檢測到NACK
    if( ( I2C1->SR1&0x400)==0x400 )
    {
      I2C1->SR1 &= ~( 1<<10 ) ;                                  //清除NACKF標志
      I2C1->CR1 |= 1<<9 ;                                      //通用結束
      break ;
    }
  }
  I2C1->DR = Address ;                                        //寫入數據
  //等待BTF標志置1
  while( ( ( I2C1->SR1&0x04 )==0 )&&( Time<65535 ) )
  {
    //檢查是否檢測到NACK
    if( ( I2C1->SR1&0x400)==0x400 )
    {
      I2C1->SR1 &= ~( 1<<10 ) ;                                  //清除NACKF標志
      I2C1->CR1 |= 1<<9 ;                                      //通用結束
      break ;
    }
  }
  I2C1->CR1 |= 1<<9 ;                                          //通用結束
  //等待忙標志退出
  Time = 0 ;
  while( ( ( I2C1->SR1&0x02 )==0x02 )&&( Time<65535 ) )
    Time ++ ;
  I2C1->CR1 &= ~( 1<<11 ) ;                                      //禁用Pos
    //發送從機地址
  I2C1->CR1 |= 1<<10 ;                                        //開啟應答信號
  I2C1->CR1 |= 1<<8 ;                                          //開始信號
  //等待SB標志置1
  Time = 0 ;
  while( ( ( I2C1->SR1&0x01 )==0 )&&( Time<65535 ) )
    Time ++ ;
  I2C1->DR = 0xA1 ;                                          //發送從機地址
  //等待地址標志置1
  while( ( ( I2C1->SR1&0x02 )==0 )&&( Time<65535 ) )
  {
    Time ++ ;
    //檢查是否檢測到STOPF
    if( ( I2C1->SR1&0x10 )==0x10 )
    {
      I2C1->SR1 &= ~( 1<<4 ) ;                                  //清除停止標志
      break ;
    }
  }
  I2C1->CR1 &= ~( 1<<10 ) ;                                      //禁止應答
  tmpreg = I2C1->SR1;                                          //清除ADDR標志
  tmpreg = I2C1->SR2;
  I2C1->CR1 |= 1<<9 ;                                          //通用應答
  //等待直到RXNE標志置1
  Time = 0 ;
  while( ( ( I2C1->SR1&0x40 )==0 )&&( Time<65535 ) )
  {
    Time ++ ;
    //檢查是否檢測到STOPF
    if( ( I2C1->SR1&0x10 )==0x10 )
    {
      I2C1->SR1 &= ~( 1<<4 ) ;                                  //清除停止標志
      break ;
    }
  }
  *Data = I2C1->DR ;                                          //從DR讀取數據
}
/***************************************************
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; i/***************************************************
Name    :AT24Cxx_Read_nData
Function  :讀取n個數據
Paramater  :
      Address:地址
      *Buffer:數據緩存
      Len:數據長度
Return    :None
***************************************************/
void AT24Cxx_Read_nData( u16 Address, u8 *Buffer, u16 Len )
{
  u16 i ;
  for( i=0; i/***************************************************
Name    :AT24Cxx_Check
Function  :檢查AT24C是否正常
Paramater  :None
Return    :
      0:成功
      1:失敗
***************************************************/
u8 AT24Cxx_Check()
{
  u8 Data ;
  IIC_Read_Data( 255, &Data ) ;
  if( Data!=0x55 )
  {
    IIC_Write_Data( 255, 0x55 ) ;
    IIC_Read_Data( 255, &Data ) ;
    if( Data!=0x55 )
      return 0 ;
  }
  return 1 ;
}
/***************************************************
Name    :AT24Cxx_Init
Function  :AT24C初始化
Paramater  :None
Return    :None
***************************************************/
void AT24Cxx_Init()
{
  RCC->APB2ENR |= 1<<3 ;                                        //先使能外設GPIOB時鐘
  GPIOB->CRL &= 0x00FFFFFF ;                                      //PB6和PB7推挽輸出
  GPIOB->CRL |= 0xFF000000 ;
  RCC->APB1ENR |= 1<<21 ;
  I2C1->CR1 |= 1<<15 ;
  I2C1->CR1 &= ~( 1<<15 ) ;
  I2C1->CR1 &= 1<<0 ;                                          //關閉I2C模塊
  I2C1->CR2 &= ~( 3<<0 ) ;
  I2C1->CR2 |= 16<<0 ;                                        //I2C頻率范圍
  I2C1->TRISE &= ~( 3<<0 ) ;
  I2C1->TRISE |= 17<<0 ;                                        //I2C上升時間
  I2C1->CCR &= ~( 1<<15 ) ;
  I2C1->CCR &= ~( 1<<14 ) ;
  I2C1->CCR &= ~( 0xFFF<<0 ) ;
  I2C1->CCR |= 80<<0 ;                                        //I2C速度
  I2C1->CR1 &= ~( 1<<6 ) ;
  I2C1->CR1 &= ~( 1<<7 ) ;                                      //通用應答模式
  //主機地址1+地址模式
  I2C1->OAR1 &= ~( 1<<15 ) ;
  I2C1->OAR1 &= ~( 3<<8 ) ;
  I2C1->OAR1 &= ~( 0xFE<<1 ) ;
  I2C1->OAR1 &= ~( 1<<0 ) ;
  I2C1->OAR1 |= 1<<14 ;                                        //地址模式
  //雙模式+主機地址2
  I2C1->OAR2 &= ~( 1<<0 ) ;
  I2C1->OAR2 &= ~( 0x7F<<1 ) ;
  I2C1->CR1 |= 1<<0 ;                                          //開啟I2C模塊

  while( AT24Cxx_Check()==0 ) ;
}

(3)創建1.c文件并輸入以下代碼。

#include "sys.h"
#include "delay.h"
#include "usart1.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
  AT24Cxx_Init() ;                                          //AT24C初始化
  AT24Cxx_Write_nData( 0, TEXT_Buffer, 18 ) ;                              //從第0個地址處開始寫入
  AT24Cxx_Read_nData( 0, datatemp, 18 ) ;                                //從第0個地址處開始讀出
  while( 1 )
  {

  }
}
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 存儲器
    +關注

    關注

    38

    文章

    7518

    瀏覽量

    164083
  • EEPROM
    +關注

    關注

    9

    文章

    1027

    瀏覽量

    81773
  • 存儲芯片
    +關注

    關注

    11

    文章

    900

    瀏覽量

    43205
收藏 人收藏

    評論

    相關推薦

    STM32學習筆記(初學者快速入門)

    本帖最后由 eehome 于 2013-1-5 10:08 編輯 STM32學習筆記(初學者快速入門)
    發表于 08-18 21:35

    STM32學習筆記(初學者快速入門)

    STM32學習筆記(初學者快速入門)資料來自網絡資源
    發表于 06-11 20:23

    小白高手都適用,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各模塊學習筆記

    STM32個模塊學習筆記 目錄 STM32筆記之一 中斷優先級.......................................
    發表于 11-30 03:32 ?3172次閱讀

    單片機學習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>的資料合集免費下載

    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>keil<b class='flag-5'>5</b>編程與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 ?2420次閱讀
    <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 ?969次閱讀

    STM32入門學習筆記EEPROM存儲實驗3

    EEPROM(Electrically Erasable Programmable read only memory),稱為帶電可擦除可編程只讀存儲器,是一種可以斷電保存數據的存儲芯片,EEP
    的頭像 發表于 02-16 14:22 ?1150次閱讀

    STM32入門學習筆記EEPROM存儲實驗4

    EEPROM(Electrically Erasable Programmable read only memory),稱為帶電可擦除可編程只讀存儲器,是一種可以斷電保存數據的存儲芯片,EEP
    的頭像 發表于 02-16 14:22 ?1555次閱讀

    EEPROM存儲實驗

    可以在電腦上或專用設備上擦除已有信息,重新編程,一般用在即插即用設備中,這種存儲芯片可以通過高于普通電壓的作用來擦除或重寫,EEPROM芯片一般用在需要頻繁存儲數據,但是數據量不大的場合,本
    的頭像 發表于 03-01 14:54 ?9605次閱讀
    <b class='flag-5'>EEPROM</b><b class='flag-5'>存儲</b><b class='flag-5'>實驗</b>
    主站蜘蛛池模板: 天天干狠狠| 77成人| 日韩三级精品| 午夜免费片在线观看不卡| 日本不卡免费新一区二区三区| 怡红院精品视频| 综合网天天| 婷婷综合激情| 日韩成人毛片高清视频免费看| 欧美一区二区三区免费| 久久国产精品久久久久久久久久| 国产色秀视频在线观看| 91精品国产91久久久久久青草| 天天做天天做天天综合网| 久久视频精品36线视频在线观看| 成人国产一区二区| 一区中文字幕| 午夜黄网站| 亚洲国产日韩女人aaaaaa毛片在线| 海棠高h粗暴调教双性男男| 亚洲伊人成综合成人网| 日韩一级欧美一级| 国产在线一卡| 午夜va| 国产偷啪视频一区| 亚洲黄色在线网站| 午夜爽爽视频| 久久一级毛片| 久久综合九色综合欧洲| 欧美人与禽交| 国产精品人成在线播放新网站| 午夜在线网站| 69国产视频| 国产主播一区二区| 四虎4hu永久在线观看| 久久精品高清视频| 亚洲国产午夜精品理论片的软件| 久久精品系列| 久久精品国产99国产精品免费看| 四虎a456tncom| 丁香月婷婷|