使用STM8S003F3P6的硬件I2C读写AT24C16的EEPROM的经验心得
由于工程需要,必须使用一个大容量的EEPROM才能够用,所以使用了16K的EEPROM,我使用的是FMD(辉芒微)公司的FT24C16A-ELR-T芯片,使用方式与AT24C16是一样的。
首先我在网上搜索到的现成的代码,有一些地址码直接就是U8的,8位地址最多只能支持到256字节,16K的有2048个字节,所以地位需要用U16的才够用,后来找到地址是U16的示范代码,去测试开始是没有问题的,但是当容量超过256个字节后会出错了。
废话不多说,直接贴上我修改后的读写函数和初始化三大主要部分。大家如果和我一样,使用STM8S003F3F6的芯片读写16KEEPROM时按下面的使用,应该就没有问题了。下面的代码中部分是从其它作者的代码中复制过来的,由于太懒没有标明出处,望见谅。
#define I2C_SPEED 400000
#define I2C_SLAVE_ADDRESS7 0xA0
void IIC_Read(uint16_t Addr , unsigned char *buffer , unsigned short num)
{
uint8_t Did;//设备ID
uint8_t Tmp;//方便计算中间量
Tmp=(Addr>>8);
if (Addr>255) Did=0xA0+(Tmp*2); //这里的计算目的就是把超过256字节部分需要做页偏移的数值计算到后四位中的p0 p1 p2的前三个位置
else Did=0xA0;
while (I2C_GetFlagStatus(I2C_FLAG_BUSBUSY));
//产生应答信号
I2C_AcknowledgeConfig(I2C_ACK_CURR);
//发送起始信号
I2C_GenerateSTART(ENABLE);
//等待起始信号产生
while (!I2C_CheckEvent(I2C_EVENT_MASTER_MODE_SELECT));
//发送器件地地址,并清除SB标志位
I2C_Send7bitAddress(Did, I2C_DIRECTION_TX);
//等待器件地址发送完成
while (!I2C_CheckEvent(I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
//发送数据地址
I2C_SendData((Addr&0x00FF));
//等待数据地址发送完成
while(!I2C_CheckEvent(I2C_EVENT_MASTER_BYTE_TRANSMITTED));
//重新发送起始信号
I2C_GenerateSTART(ENABLE);
//等待起始信号产生
while (!I2C_CheckEvent(I2C_EVENT_MASTER_MODE_SELECT));
//发送器件地地址,并清除SB标志位
I2C_Send7bitAddress(Did, I2C_DIRECTION_RX);
//等待器件地址发送完成
while (!I2C_CheckEvent(I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));
while(num)
{
if(num == 1)
{
I2C_AcknowledgeConfig(I2C_ACK_NONE);//最后一个字节不产生应答信号
}
//等待数据接收完成
while (!I2C_CheckEvent(I2C_EVENT_MASTER_BYTE_RECEIVED));
*buffer = I2C_ReceiveData(); //读出数据
buffer++; //读出数据缓存地址递加
num--; //接收数据数目减1
}
I2C_GenerateSTOP(ENABLE);
}
/*******************************************************************************
**函数名称:void IIC_Write(uint16_t Addr, unsigned char *buffer , unsigned short num)
**功能描述:向IIC器件写数据
**入口参数:
Addr : 确定器件写地址的起始地址
*buffer : 写数据的起址地址
num : 要写数据的个数 FT24C16A的页写模式最多支持16字节 要根据偏移量计算,本例中每次只写4个字节,可不考虑偏移量问题
**输出:无
*******************************************************************************/
void IIC_Write(uint16_t Addr, unsigned char *buffer , unsigned short num)
{
uint8_t Did;//设备ID
uint8_t Tmp;//方便计算中间量
Tmp=(Addr>>8);
if (Addr>255) Did=0xA0+(Tmp*2);
else Did=0xA0;
while(I2C_GetFlagStatus(I2C_FLAG_BUSBUSY));
//发送起始信号/*!< Send STRAT condition */
I2C_GenerateSTART( ENABLE);
//等待起始信号产生
while (!I2C_CheckEvent(I2C_EVENT_MASTER_MODE_SELECT));
//发送器件地地址,并清除SB标志位
I2C_Send7bitAddress(Did, I2C_DIRECTION_TX);
//等待器件地址发送完成并清除发送器件地址标志位
while (!I2C_CheckEvent(I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
//发送数据地址
I2C_SendData((Addr&0x00FF));
//等待数据地址发送完成
while(!I2C_CheckEvent(I2C_EVENT_MASTER_BYTE_TRANSMITTED));
while(num > 0)
{//发送器件存储首地址
I2C_SendData(*buffer);
//等待移位发送器发送完成
while (!I2C_CheckEvent(I2C_EVENT_MASTER_BYTE_TRANSMITTED));
buffer++;
num--;
}
//发送停止信号结束数据传输
I2C_GenerateSTOP(ENABLE);
}
/*******************************************************************************
**函数名称:void IIC_Init()
**功能描述:初始化IIC1接口
**入口参数:
**输出:无
*******************************************************************************/
void IIC_Init(void)
{
CLK_PeripheralClockConfig(CLK_PERIPHERAL_I2C, ENABLE);
I2C_Cmd(ENABLE);
/* sEE_I2C configuration after enabling it */
I2C_Init(I2C_SPEED, I2C_SLAVE_ADDRESS7,
I2C_DUTYCYCLE_2, I2C_ACK_CURR,
I2C_ADDMODE_7BIT, 16);
}
由于个人水平有限,可能上面写的并不专业,甚至可能还有错误,欢迎大家留言批评指正,谢谢!
使用STM8S003F3P6的硬件I2C读写AT24C16的EEPROM的经验心得相关推荐
- STM32F10x_硬件I2C读写EEPROM(标准外设库版本)
Ⅰ.写在前面 上一篇文章是"STM32F10x_模拟I2C读写EEPROM",讲述使用IO口模拟I2C总线通信,对EEPROM(AT24Xxx)进行读写操作的过程. 上一篇文章主要 ...
- STM-32:I2C外设总线—硬件I2C读写MPU6050
目录 一.I2C外设简介 二.I2C框图 三.I2C基本结构 四.主机发送 五.主机接收 六.I2C的中断请求 七.软件/硬件波形对比 八.应用实例:硬件I2C读写MPU6050 8.1接线图 8.2 ...
- 关于STM32使用硬件i2c读写AT24C256实验遇到的问题
硬件环境:XNUCLEO开发板(STM32F411RCT6芯片).MiniSTM32 V3.41开发板(STM32F103RCT6芯片) 软件环境:IAR for ARM 8.30.1.Keil5 现 ...
- STM32HAL库学习笔记--硬件I2C读写AT24C512
摘要:由于需要实现掉电存储功能,在无线传输模块上增加了一块EEPROM芯片,因为工程使用CubeMx配置并生成,为了方便不再使用IO口模拟I2C,而是使用f1自带的硬件I2C来实现.配置和调试过程和遇 ...
- STM32CubeMX学习教程之十:硬件I2C读写AT24C02
完整源码下载: https://github.com/simonliu009/STM32CubeMX-hardware-I2C-AT24C02 网上有流传已久一种说法,就是STM的I2C有bug,不好 ...
- bme280 环境传感器开发板_STM32Cube14 | 使用硬件I2C读写环境光强度传感器
更多精彩~点击上面蓝字关注我们呀! 寻求更好的阅读体验,请点击阅读原文移步:Mculover666的个人博客. 本篇详细的记录了如何使用STM32CubeMX配置STM32L431RCT6的硬件I ...
- STM32基于HAL工程硬件I2C读写AT24C02/04/08数据
STM32基于HAL工程硬件I2C读取AT24C02数据 ✨申明:本文章仅发表在CSDN网站,任何其他网站,未注明来源,见此内容均为盗链和爬取,请多多尊重和支持原创!
- STM32的硬件I2C与AT24C16
刚学STM32的时候就听闻STM32的硬件I2C存在重大bug,会导致运行卡死在等待ACK的过程中,所以一直以来对其避而远之,转而以模拟I2C取代之.最近这段时间一直在用STM32 CubeMX,图形 ...
- stm32hal库应用笔记之 硬件I2C读写ZD24C64
话不多说 直接上资料 这是ZD24C64 数据手册里面的读写操作时序. 数据手册网上有很多相信大家也能随便就找到. 如下图所示: 这是使用iic按字节写操作 器件地址:我的是0xA0 来不及解释了赶快 ...
- 【STM32Cube_15】使用硬件I2C读取温湿度传感器数据(SHT30)
上一篇:[STM32Cube_14]使用硬件I2C读写环境光强度传感器(BH1750) 寻求更好的阅读体验,请移步:Mculover666的个人博客. 本篇详细的记录了如何使用STM32CubeMX配 ...
最新文章
- PyTorch 实现经典模型5:ResNet
- DVWA--文件上传漏洞
- mysql error 1201_ERROR 1201 (HY000): Could not initialize master info structure; .....
- 信息学奥赛一本通(1186:出现次数超过一半的数)
- java数组包含某个值_如何检查Java数组是否包含值?
- ajax 同步和异步的区别
- 数据结构之简单排序算法
- 上传excel,并保存excel内容
- Java 算法刷题指南
- origin matlab调用,origin与matlab使用教程
- java两个字符串的重复率检查
- c#仿qq好友列表控件
- 360与腾讯之争,作为程序员,是愿意自己的项目进入市场得到些成功就被腾讯抄袭,还是软件刚一发布出去,就被360查杀?
- 电影记忆之20(恐怖游轮)
- phpcms 会员头像h5上传_phpcms v9前台会员中心上传头像可getshell及修复
- 搜索引擎蜘蛛 ajax,SEO中的搜索引擎蜘蛛技术探析
- 855 AIMA学习笔记(by菜菜子)
- 你有新的推送消息,请注意查收
- C++中 pair 和 make_pair 的用法
- MRD 和PRD的区别
热门文章
- Vmware、Hyper-V、Virtual PC虚拟机运用usb server使用USB加密狗设备
- 大数据集群治理与数据治理(PPT)
- selenium 网址
- 密码学术语中英文对照(持续更新中)
- 学习笔记(12):Google开发专家带你学 AI:入门到实战(Keras/Tensorflow)(附源码)-深度学习“四件套”:数据、模型、损失函数与优化器
- 足球机器人比赛3V3
- 工程实践,淘宝直播高画质低延时技术探索
- Odoo12有那些功能?『江苏odoo云整理』
- 5分钟了解什么是自然语言处理技术
- Xilinx FPGA PTP IEEE1588使用