(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學習教程(入門合集、自學筆記和例程)
、安全特性等方面對STM32進行全面的剖析;第4章主要介紹開發工具;第5章則引導讀者針對STM32的外設進行一系列的基礎實驗設計;第6章通過10篇高級應用文章介紹
發表于 04-10 14:56
CubeMX入門STM32 HAL庫的學習筆記
STM32CubeMX是ST官方開發的一款很好用的軟件,主要用于STM32系列單片機的硬件驅動層的配置。網上也有一些關于STM32CubeMX的相關教程,對它的相關操作進行說明。從今天起,小柯希望能將自己從CubeMX
發表于 08-17 06:55
STM32各模塊學習筆記
STM32個模塊學習筆記 目錄 STM32筆記之一 中斷優先級.......................................
發表于 11-30 03:32
?3172次閱讀
STM32學習之I2C協議(讀寫EEPROM)
關于STM32學習分享第七章 I2C協議(讀寫EEPROM)文章目錄關于STM32學習分享前言二、代碼1.i2c.c2.i2c.h3.mai
發表于 11-30 15:21
?32次下載
STM32入門學習筆記之EEPROM存儲實驗1
EEPROM(Electrically Erasable Programmable read only memory),稱為帶電可擦除可編程只讀存儲器,是一種可以斷電保存數據的存儲芯片,EEP
STM32入門學習筆記之EEPROM存儲實驗2
EEPROM(Electrically Erasable Programmable read only memory),稱為帶電可擦除可編程只讀存儲器,是一種可以斷電保存數據的存儲芯片,EEP
STM32入門學習筆記之EEPROM存儲實驗3
EEPROM(Electrically Erasable Programmable read only memory),稱為帶電可擦除可編程只讀存儲器,是一種可以斷電保存數據的存儲芯片,EEP
STM32入門學習筆記之EEPROM存儲實驗4
EEPROM(Electrically Erasable Programmable read only memory),稱為帶電可擦除可編程只讀存儲器,是一種可以斷電保存數據的存儲芯片,EEP
EEPROM存儲實驗
可以在電腦上或專用設備上擦除已有信息,重新編程,一般用在即插即用設備中,這種存儲芯片可以通過高于普通電壓的作用來擦除或重寫,EEPROM芯片一般用在需要頻繁存儲數據,但是數據量不大的場合,本實
評論