(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文章
7484浏览量
163774 -
EEPROM
+关注
关注
9文章
1019浏览量
81564 -
存储芯片
+关注
关注
11文章
896浏览量
43136
发布评论请先 登录
相关推荐
小白高手都适用,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
•3158次阅读
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
STM32入门学习笔记之SD卡基础读写实验4
SD卡是嵌入式系统中最常见的存储器,不仅容量可以做的很大,并且接口通用,支持SPI/SDIO驱动,尺寸可供选择,能满足不同应用的要求。STM32F1系列自带了标准的4位SDIO接口,最高通信速度可达24MHz,最高每秒能传输12
EEPROM存储实验
可以在电脑上或专用设备上擦除已有信息,重新编程,一般用在即插即用设备中,这种存储芯片可以通过高于普通电压的作用来擦除或重写,EEPROM芯片一般用在需要频繁存储数据,但是数据量不大的场合,本实
评论