(2)創(chuàng)建at24cxx.c文件,并輸入以下代碼。
/*********************************************************************************************************
EEPROM 驅(qū) 動(dòng) 程 序
*********************************************************************************************************/
#include "at24cxx.h"
#include "delay.h"
/***************************************************
Name :IIC_Start
Function :IIC起始信號(hào)
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停止信號(hào)
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等待應(yīng)答
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發(fā)送一個(gè)字節(jié)
Paramater :
ack:應(yīng)答使能
0:不應(yīng)答
1:應(yīng)答
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讀取一個(gè)字節(jié)
Paramater :
ack:應(yīng)答使能
0:不應(yīng)答
1:應(yīng)答
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個(gè)數(shù)據(jù)
Paramater :
Address:地址
Data:數(shù)據(jù)
Return :讀到的數(shù)據(jù)
***************************************************/
void AT24Cxx_Write_Data( u16 Address, u8 Data )
{
IIC_Start() ;
IIC_Send_Byte( 0xA0|( Address/256 )<<1 ) ; //發(fā)送器件地址,寫數(shù)據(jù)
IIC_Wait_Ack() ;
IIC_Send_Byte( Address%256 ) ; //發(fā)送低地址
IIC_Wait_Ack() ;
IIC_Send_Byte( Data ) ; //發(fā)送字節(jié)
IIC_Wait_Ack() ;
IIC_Stop() ; //產(chǎn)生一個(gè)停止條件
delay_ms( 10 ) ; //EEPROM的寫入速度比較慢
}
/***************************************************
Name :AT24Cxx_Write_nData
Function :寫入n個(gè)數(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 APB2ENR |= 1<<3 ; //先使能外設(shè)GPIOB時(shí)鐘
GPIOB->CRL &= 0x00FFFFFF ; //PB6和PB7推挽輸出
GPIOB->CRL |= 0x33000000 ;
GPIOB->ODR |= 3<<6 ; //PB6和PB7輸出高
while( AT24Cxx_Check()==0 ) ;
}
(3)創(chuàng)建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時(shí)鐘初始化
SysTick_Init( 72 ) ; //SysTick初始化
USART1_Init( 72, 115200 ) ; //初始化串口1波特率115200
LCD_Init() ; //LCD初始化
AT24Cxx_Init() ; //AT24C初始化
POINT_COLOR = RED ; //設(shè)置字體為紅色
AT24Cxx_Write_nData( 0, TEXT_Buffer, 18 ) ; //從第0個(gè)地址處開始寫入
AT24Cxx_Read_nData( 0, datatemp, 18 ) ; //從第0個(gè)地址處開始讀出
LCD_ShowString( 0, 0, datatemp ) ; //顯示讀到的字符串
while( 1 )
{
}
}
16.4.2 硬件IIC控制
注:由于STM32的硬件IIC總是容易卡死(這也是為什么網(wǎng)絡(luò)上幾乎沒有硬件IIC通訊的例子的原因),所以這里采用了ST內(nèi)部提供的通訊機(jī)制來保證IIC的正常使用。
(1)創(chuàng)建at24cxx.h文件并輸入以下代碼。
/*********************************************************************************************************
EEPROM 驅(qū) 動(dòng) 文 件
*********************************************************************************************************/
#ifndef _AT24Cxx_H_
#define _AT24Cxx_H_
#include "sys.h"
/*********************************************************************************************************
函 數(shù) 列 表
*********************************************************************************************************/
void AT24Cxx_Init( void ) ; //AT24C初始化
void IIC_Write_Data( u8 Address, u8 Data ) ; //寫入1個(gè)數(shù)據(jù)
void AT24Cxx_Write_nData( u16 Address, u8 *Buffer, u16 Len ) ; //寫入n個(gè)數(shù)據(jù)
void AT24Cxx_Read_Data( u16 Address, u8 *Data ) ; //讀取1個(gè)數(shù)據(jù)
void AT24Cxx_Read_nData( u16 Address, u8 *Buffer, u16 Len ) ; //讀取n個(gè)數(shù)據(jù)
#endif
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。
舉報(bào)投訴
-
存儲(chǔ)器
+關(guān)注
關(guān)注
38文章
7513瀏覽量
163988 -
EEPROM
+關(guān)注
關(guān)注
9文章
1022瀏覽量
81687 -
存儲(chǔ)芯片
+關(guān)注
關(guān)注
11文章
897瀏覽量
43181
發(fā)布評(píng)論請先 登錄
相關(guān)推薦
STM32學(xué)習(xí)筆記(初學(xué)者快速入門)
STM32學(xué)習(xí)筆記(初學(xué)者快速入門)資料來自網(wǎng)絡(luò)資源
發(fā)表于 06-11 20:23
小白高手都適用,STM32學(xué)習(xí)教程(入門合集、自學(xué)筆記和例程)
、安全特性等方面對(duì)STM32進(jìn)行全面的剖析;第4章主要介紹開發(fā)工具;第5章則引導(dǎo)讀者針對(duì)STM32的外設(shè)進(jìn)行一系列的基礎(chǔ)實(shí)驗(yàn)設(shè)計(jì);第6章通過10篇高級(jí)應(yīng)用文章介紹
發(fā)表于 04-10 14:56
CubeMX入門STM32 HAL庫的學(xué)習(xí)筆記
STM32CubeMX是ST官方開發(fā)的一款很好用的軟件,主要用于STM32系列單片機(jī)的硬件驅(qū)動(dòng)層的配置。網(wǎng)上也有一些關(guān)于STM32CubeMX的相關(guān)教程,對(duì)它的相關(guān)操作進(jìn)行說明。從今天起,小柯希望能將自己從CubeMX
發(fā)表于 08-17 06:55
STM32入門學(xué)習(xí)筆記 精選資料分享
STM32入門學(xué)習(xí)筆記本文為筆者入門學(xué)習(xí)過程的記錄,只是零散的記錄了一些個(gè)人不太懂得,覺得需要經(jīng)
發(fā)表于 08-24 07:56
STM32各模塊學(xué)習(xí)筆記
..........................................................4 STM32筆記之四 STM3
發(fā)表于 11-30 03:32
?3169次閱讀
單片機(jī)學(xué)習(xí)之EEPROM-IIC實(shí)驗(yàn)的資料合集免費(fèi)下載
本文檔的主要內(nèi)容詳細(xì)介紹的是單片機(jī)學(xué)習(xí)之EEPROM-IIC實(shí)驗(yàn)的資料合集免費(fèi)下載。
發(fā)表于 07-21 08:00
?1次下載
STM32F4 I2C-EEPROM實(shí)驗(yàn)例程
STM32F4 I2C-EEPROM實(shí)驗(yàn)例程(嵌入式開發(fā)專業(yè)課程)-STM32F4 I2C-EEPROM
發(fā)表于 07-30 16:02
?19次下載
STM32學(xué)習(xí)筆記1——軟硬件基礎(chǔ)之keil5編程與GPIO開發(fā)
STM32學(xué)習(xí)筆記1——軟硬件基礎(chǔ)之keil5編程與GPIO開發(fā)
發(fā)表于 11-30 12:36
?4次下載
STM32學(xué)習(xí)之I2C協(xié)議(讀寫EEPROM)
關(guān)于STM32學(xué)習(xí)分享第七章 I2C協(xié)議(讀寫EEPROM)文章目錄關(guān)于STM32學(xué)習(xí)分享前言二、代碼1.i2c.c2.i2c.h3.mai
發(fā)表于 11-30 15:21
?32次下載
STM32入門學(xué)習(xí)筆記之EEPROM存儲(chǔ)實(shí)驗(yàn)1
EEPROM(Electrically Erasable Programmable read only memory),稱為帶電可擦除可編程只讀存儲(chǔ)器,是一種可以斷電保存數(shù)據(jù)的存儲(chǔ)芯片,EEP
STM32入門學(xué)習(xí)筆記之EEPROM存儲(chǔ)實(shí)驗(yàn)2
EEPROM(Electrically Erasable Programmable read only memory),稱為帶電可擦除可編程只讀存儲(chǔ)器,是一種可以斷電保存數(shù)據(jù)的存儲(chǔ)芯片,EEP
STM32入門學(xué)習(xí)筆記之EEPROM存儲(chǔ)實(shí)驗(yàn)3
EEPROM(Electrically Erasable Programmable read only memory),稱為帶電可擦除可編程只讀存儲(chǔ)器,是一種可以斷電保存數(shù)據(jù)的存儲(chǔ)芯片,EEP
STM32入門學(xué)習(xí)筆記之EEPROM存儲(chǔ)實(shí)驗(yàn)5
EEPROM(Electrically Erasable Programmable read only memory),稱為帶電可擦除可編程只讀存儲(chǔ)器,是一種可以斷電保存數(shù)據(jù)的存儲(chǔ)芯片,EEP
EEPROM存儲(chǔ)實(shí)驗(yàn)
可以在電腦上或?qū)S迷O(shè)備上擦除已有信息,重新編程,一般用在即插即用設(shè)備中,這種存儲(chǔ)芯片可以通過高于普通電壓的作用來擦除或重寫,EEPROM芯片一般用在需要頻繁存儲(chǔ)數(shù)據(jù),但是數(shù)據(jù)量不大的場合,本實(shí)
評(píng)論