(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; i APB2ENR |= 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文章
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各模塊學習筆記
..........................................................4 STM32筆記之四 STM3
發表于 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存儲實驗5
EEPROM(Electrically Erasable Programmable read only memory),稱為帶電可擦除可編程只讀存儲器,是一種可以斷電保存數據的存儲芯片,EEP
EEPROM存儲實驗
可以在電腦上或專用設備上擦除已有信息,重新編程,一般用在即插即用設備中,這種存儲芯片可以通過高于普通電壓的作用來擦除或重寫,EEPROM芯片一般用在需要頻繁存儲數據,但是數據量不大的場合,本實
評論