(2)創(chuàng)建at24cxx.c文件并輸入以下代碼。
/*********************************************************************************************************
EEPROM 驅 動 程 序
*********************************************************************************************************/
#include "at24cxx.h"
#include "delay.h"
/***************************************************
Name :IIC_Write_Data
Function :寫入1個數(shù)據(jù)
Paramater :
Address:地址
Byte:讀取的字節(jié)
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 ; //發(fā)送從機地址
//等待地址發(fā)送結束
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 ; //發(fā)送寄存器地址
//等待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 ; //發(fā)送數(shù)據(jù)
//等待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個數(shù)據(jù)
Paramater :
Address:地址
Return :讀取的數(shù)據(jù)
***************************************************/
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
//發(fā)送從機地址
I2C1->CR1 |= 1<<8 ; //開始信號
Time = 0 ;
//等待SB標志置1
while( ( ( I2C1->SR1&0x01 )==0 )&&( Time<65535 ) )
Time ++ ;
I2C1->DR = 0xA0 ; //發(fā)送從機地址
//等待地址發(fā)送結束
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 ; //寫入數(shù)據(jù)
//等待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
//發(fā)送從機地址
I2C1->CR1 |= 1<<10 ; //開啟應答信號
I2C1->CR1 |= 1<<8 ; //開始信號
//等待SB標志置1
Time = 0 ;
while( ( ( I2C1->SR1&0x01 )==0 )&&( Time<65535 ) )
Time ++ ;
I2C1->DR = 0xA1 ; //發(fā)送從機地址
//等待地址標志置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讀取數(shù)據(jù)
}
/***************************************************
Name :AT24Cxx_Write_nData
Function :寫入n個數(shù)據(jù)
Paramater :
Address:地址
*Buffer:數(shù)據(jù)緩存
Len:數(shù)據(jù)長度
Return :None
***************************************************/
void AT24Cxx_Write_nData( u16 Address, u8 *Buffer, u16 Len )
{
u16 i ;
for( i=0; i/***************************************************
Name :AT24Cxx_Read_nData
Function :讀取n個數(shù)據(jù)
Paramater :
Address:地址
*Buffer:數(shù)據(jù)緩存
Len:數(shù)據(jù)長度
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)創(chuàng)建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 )
{
}
}
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。
舉報投訴
-
存儲器
+關注
關注
38文章
7636瀏覽量
166449 -
EEPROM
+關注
關注
9文章
1082瀏覽量
83301 -
存儲芯片
+關注
關注
11文章
931瀏覽量
43944
發(fā)布評論請先 登錄
相關推薦
熱點推薦
小白高手都適用,STM32學習教程(入門合集、自學筆記和例程)
、安全特性等方面對STM32進行全面的剖析;第4章主要介紹開發(fā)工具;第5章則引導讀者針對STM32的外設進行一系列的基礎實驗設計;第6章通過10篇高級應用文章介紹
發(fā)表于 04-10 14:56
CubeMX入門STM32 HAL庫的學習筆記
STM32CubeMX是ST官方開發(fā)的一款很好用的軟件,主要用于STM32系列單片機的硬件驅動層的配置。網(wǎng)上也有一些關于STM32CubeMX的相關教程,對它的相關操作進行說明。從今天起,小柯希望能將自己從CubeMX
發(fā)表于 08-17 06:55
STM32各模塊學習筆記
STM32個模塊學習筆記 目錄 STM32筆記之一 中斷優(yōu)先級.......................................
發(fā)表于 11-30 03:32
?3231次閱讀
單片機學習之EEPROM-IIC實驗的資料合集免費下載
本文檔的主要內(nèi)容詳細介紹的是單片機學習之EEPROM-IIC實驗的資料合集免費下載。
發(fā)表于 07-21 08:00
?1次下載

STM32學習之I2C協(xié)議(讀寫EEPROM)
關于STM32學習分享第七章 I2C協(xié)議(讀寫EEPROM)文章目錄關于STM32學習分享前言二、代碼1.i2c.c2.i2c.h3.mai
發(fā)表于 11-30 15:21
?32次下載

STM32入門學習筆記之EEPROM存儲實驗1
EEPROM(Electrically Erasable Programmable read only memory),稱為帶電可擦除可編程只讀存儲器,是一種可以斷電保存數(shù)據(jù)的存儲芯片,EEP

STM32入門學習筆記之EEPROM存儲實驗2
EEPROM(Electrically Erasable Programmable read only memory),稱為帶電可擦除可編程只讀存儲器,是一種可以斷電保存數(shù)據(jù)的存儲芯片,EEP
STM32入門學習筆記之EEPROM存儲實驗3
EEPROM(Electrically Erasable Programmable read only memory),稱為帶電可擦除可編程只讀存儲器,是一種可以斷電保存數(shù)據(jù)的存儲芯片,EEP
STM32入門學習筆記之EEPROM存儲實驗4
EEPROM(Electrically Erasable Programmable read only memory),稱為帶電可擦除可編程只讀存儲器,是一種可以斷電保存數(shù)據(jù)的存儲芯片,EEP
EEPROM存儲實驗
可以在電腦上或專用設備上擦除已有信息,重新編程,一般用在即插即用設備中,這種存儲芯片可以通過高于普通電壓的作用來擦除或重寫,EEPROM芯片一般用在需要頻繁存儲數(shù)據(jù),但是數(shù)據(jù)量不大的場合,本實

評論