专家
公告
财富商城
电子网
旗下网站
首页
问题库
专栏
标签库
话题
专家
NEW
门户
发布
提问题
发文章
STM32
关于EEPROM的连续写最短写入延时问题?
2019-07-20 23:32
发布
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
站内问答
/
STM32/STM8
3922
7
1548
EEPROM在连续一页之后会进入,内部数据搬运时间Twr ,而这个时间我们不能继续写入,我们一般用延时最大时间5MS。我现在想提高连续写的速度,但是我不知道内部数据什么时候搬运完了可以继续写入?有什么方法可以实现更快速度呢?@
正点原子
友情提示:
此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
7条回答
正点原子
1楼-- · 2019-07-21 02:13
精彩回答 2 元偷偷看……
加载中...
ZGT6
2楼-- · 2019-07-21 05:22
求助原子哥
加载中...
xkwy
3楼-- · 2019-07-21 09:26
寻址
,
比如AT24C02地址为000b,
则在起始信号后发送0xA0,
若回应为ACK(0),则说明你可以继续操作,
若回应为NACK(1),则说明其忙碌(Busy),此时你可以反复地寻址,直到其空闲(Idle)
------不正经的分割线-----
加载中...
ZGT6
4楼-- · 2019-07-21 14:00
精彩回答 2 元偷偷看……
加载中...
ZGT6
5楼-- · 2019-07-21 14:18
精彩回答 2 元偷偷看……
加载中...
xkwy
6楼-- · 2019-07-21 16:42
你看看我之前写的代码:
[mw_shl_code=c,true]
# include "AT24C02.h"
# include "i2c.h"
/* 成功返回0,失败返回非零错误代码 */
uint8 EEPROM_write(uint8 *buf, uint8 addr, uint8 len)
{
uint8 i = 0;
/**参数有效性判断**/
if (len == 0) return 0x01; //若读入字节长度为0,退出
if (addr > 0xff-len) return 0x02; //若读入的起始地址太靠后,退出
while (len > 0)
{
/**先连接器件**/
while (1)
{
I2CStart();
if (0 == I2CWrite(0xA2)) break; //若接到应答则进行下一步
I2CStop();
if (i++ > 100) return 0x11; //若连接失败,退出
}
/**再写入操作地址**/
if (I2CWrite(addr)) return 0x21; //若不能接受地址,则退出
/**写入数据**/
while (len > 0)
{
if (I2CWrite(*buf++)) return 0x22; //若不能接受数据,则退出
len--;
addr++;
if ((addr&0x07) == 0) break; //若到达下一页,则翻页
}
I2CStop(); //停止本页写操作
}
return 0x00; //写入成功返回0
}
/* 成功返回0,失败返回非零错误代码 */
uint8 EEPROM_read(uint8 *buf, uint8 addr, uint8 len)
{
uint8 i = 0;
/**参数有效性判断**/
if (len == 0) return 0x01; //若读入字节长度为0,退出
if (addr > 0xff-len) return 0x02; //若读入的起始地址太靠后,退出
/**先连接器件**/
while (1)
{
I2CStart();
if (0 == I2CWrite(0xA2)) break; //若接到应答则进行下一步
I2CStop();
if (i++ > 100) return 0x11; //若连接失败,退出
}
/**告知其即将操作的地址**/
if (I2CWrite(addr)) return 0x21; //若不能接受地址,则退出
/**重启总线开始读取**/
I2CStart();
if (I2CWrite(0xA3)) return 0x22; //若没有应答,则退出
while (--len) *buf++ = I2CRead(0); //读取足数的字节
*buf = I2CRead(1); //读取最后一个字节并返回非应答位
I2CStop();
return 0x00; //读取成功返回0
}
[/mw_shl_code]
加载中...
1
2
下一页
一周热门
更多
>
相关问题
STM32F4上I2C(在PROTEUS中模拟)调试不通的问题
6 个回答
芯片供应紧张,准备换个MCU,MM32L系列替换STM32L系列的怎么样?
7 个回答
STM32同时使用两个串口进行数据收发时数据丢包的问题
5 个回答
STM32F103串口通信死机问题
4 个回答
STM32WLE5CC连接SX1268在LoRa模式下能与 SX1278互通吗?
2 个回答
STM32开发板免费用活动
7 个回答
stm32 处理 DHT11占用太多时间,大家程序是怎么设计的
8 个回答
分享一个STM32单片机做的离线编程器代码
9 个回答
相关文章
ST公司第一款无线低功耗单片机模块有效提高物联网设计生产效率
0个评论
如何实现对单片机寄存器的访问
0个评论
通过USB用STM32片内自带Bootloader下载程序及注意事项
0个评论
欲练此功必先自宫之STM32汇编启动,放慢是为了更好的前行
0个评论
×
关闭
采纳回答
向帮助了您的网友说句感谢的话吧!
非常感谢!
确 认
×
关闭
编辑标签
最多设置5个标签!
STM32
保存
关闭
×
关闭
举报内容
检举类型
检举内容
检举用户
检举原因
广告推广
恶意灌水
回答内容与提问无关
抄袭答案
其他
检举说明(必填)
提交
关闭
×
关闭
您已邀请
15
人回答
查看邀请
擅长该话题的人
回答过该话题的人
我关注的人
比如AT24C02地址为000b,
则在起始信号后发送0xA0,
若回应为ACK(0),则说明你可以继续操作,
若回应为NACK(1),则说明其忙碌(Busy),此时你可以反复地寻址,直到其空闲(Idle)
------不正经的分割线-----
[mw_shl_code=c,true]
# include "AT24C02.h"
# include "i2c.h"
/* 成功返回0,失败返回非零错误代码 */
uint8 EEPROM_write(uint8 *buf, uint8 addr, uint8 len)
{
uint8 i = 0;
/**参数有效性判断**/
if (len == 0) return 0x01; //若读入字节长度为0,退出
if (addr > 0xff-len) return 0x02; //若读入的起始地址太靠后,退出
while (len > 0)
{
/**先连接器件**/
while (1)
{
I2CStart();
if (0 == I2CWrite(0xA2)) break; //若接到应答则进行下一步
I2CStop();
if (i++ > 100) return 0x11; //若连接失败,退出
}
/**再写入操作地址**/
if (I2CWrite(addr)) return 0x21; //若不能接受地址,则退出
/**写入数据**/
while (len > 0)
{
if (I2CWrite(*buf++)) return 0x22; //若不能接受数据,则退出
len--;
addr++;
if ((addr&0x07) == 0) break; //若到达下一页,则翻页
}
I2CStop(); //停止本页写操作
}
return 0x00; //写入成功返回0
}
/* 成功返回0,失败返回非零错误代码 */
uint8 EEPROM_read(uint8 *buf, uint8 addr, uint8 len)
{
uint8 i = 0;
/**参数有效性判断**/
if (len == 0) return 0x01; //若读入字节长度为0,退出
if (addr > 0xff-len) return 0x02; //若读入的起始地址太靠后,退出
/**先连接器件**/
while (1)
{
I2CStart();
if (0 == I2CWrite(0xA2)) break; //若接到应答则进行下一步
I2CStop();
if (i++ > 100) return 0x11; //若连接失败,退出
}
/**告知其即将操作的地址**/
if (I2CWrite(addr)) return 0x21; //若不能接受地址,则退出
/**重启总线开始读取**/
I2CStart();
if (I2CWrite(0xA3)) return 0x22; //若没有应答,则退出
while (--len) *buf++ = I2CRead(0); //读取足数的字节
*buf = I2CRead(1); //读取最后一个字节并返回非应答位
I2CStop();
return 0x00; //读取成功返回0
}
[/mw_shl_code]
一周热门 更多>