(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 ) ; //禁止应答
上一篇:什么是串口通讯?STM32中的串口通讯接口有哪些
下一篇:STM32入门学习笔记之EEPROM存储实验2
推荐阅读最新更新时间:2024-11-07 12:39
设计资源 培训 开发板 精华推荐
- C3012360_CH376S芯片方案验证板
- OP262GSZ-REEL高速仪表放大器典型应用电路
- Solar Power Bank
- 用于 300Khz 非自举 N 沟道晶体管的 Tc110501Ect Pfm/Pwm 升压直流/直流控制器的典型应用
- 使用 Diodes Incorporated 的 PT8A 3514D 的参考设计
- TWR-K22F120M,基于 MK22FN512 MCU 的 Kinetis K22 塔式系统模块
- LT1021CCN8-5 由电流源驱动的负分流基准的典型应用
- LTM8053IY 5Vout 从 7Vin 到 40Vin 降压转换器的典型应用电路
- LTC2634-LMI12 四通道、12 位数模转换器的典型应用
- 彩色丝印PCB遇上手绘画
- 找小伙伴们一起去闯 STM32 F7英雄联盟设计大赛
- 有奖直播 | 与英飞凌一同革新您的电动汽车温控系统:集成热管理系统(低压侧)
- 瑞萨电子100套开发套件等你来抢
- 免费申请测评 | Sipeed MAix BiT AIoT 开发套件,搭载K210、屏幕和摄像头
- 下载安森美半导体 KNX 技术文档赢精美礼品!
- 以科技之力,成就安全 PI与您一起驾驭明天的智慧 答题赢好礼!
- 下载汽车电气化精品文章,赢【体脂秤、罗技鼠标、手持风扇】,开启MPS汽车技术进阶之旅!
- 免费尝鲜:ST 双核无线 MCU STM32WB55 开发板
- 注册赢好礼~京东卡等您拿!
- ADI有奖下载活动之2——太阳能光伏发电解决方案