(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文章
7534浏览量
164487 -
EEPROM
+关注
关注
9文章
1033浏览量
82072 -
存储芯片
+关注
关注
11文章
903浏览量
43323
发布评论请先 登录
相关推荐
小白高手都适用,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
•3179次阅读
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>)](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
STM32入门学习笔记之EEPROM存储实验1
EEPROM(Electrically Erasable Programmable read only memory),称为带电可擦除可编程只读存储器,是一种可以断电保存数据的存储芯片,EEP
![<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](https://file.elecfans.com/web2/M00/91/7D/poYBAGPtyiWAeoeHAACNhEVxF-A785.jpg)
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芯片一般用在需要频繁存储数据,但是数据量不大的场合,本实
![<b class='flag-5'>EEPROM</b><b class='flag-5'>存储</b><b class='flag-5'>实验</b>](https://file.elecfans.com/web2/M00/91/7D/poYBAGPtyiWAeoeHAACNhEVxF-A785.jpg)
评论