AT24C02写一个数据然后读取一个数据是正确的,但是当写入多个数据时,读出数据就不正确,求指教?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AT24C02写一个数据然后读取一个数据是正确的,但是当写入多个数据时,读出数据就不正确,求指教?相关的知识,希望对你有一定的参考价值。

恩,这个问题困扰了两天,终于找到原因并且顺利解决了!原因是:单片机接收应答信号(向AT24C02写数据时)和发送应答信号(AT24C02向单片机发送数据)的代码是不一样的!
void ack()//acknowledge (单片机接收应答信号)

uchar i;
scl=1;
delay();
while((sda == 1)&&(i > 250))
i++;
scl=0;//注意此处,此处表示第九个时钟结束,不能不写
delay();


void ack2(bit response)//(单片机发送的应答信号,response=1时是非应答,response=0时是应答!)

sda=response;
scl=1;
delay();
scl=0;
delay();

//然后严格遵循datasheet的操作时序
//读数据的代码是这样的()
void read_add(uchar address)


start();
write_byte(0xa0);
ack();
write_byte(address);
ack();//dummy write
start();
write_byte(0xa1);
ack();
P1=read_byte();
ack2(0);//这个应答才正确
// ack();这个应答不正确
P1=read_byte();
ack2(1);
delay();
stop();


//这里注意,我用郭天祥老师的TX-1C,给P1口赋值让lcd灯来检验我的应答信号是否正确
参考技术A 我找了几个小时的bug,终于找到 了,,,,你是不是多写一个等待信号。
——————————————错误代码如下
unsigned int read_E2prom(unsigned char adr)

unsigned int re;
IIC_Start();
IIC_SendByte(0xa0);
IIC_WaitAck();
IIC_SendByte(adr);
IIC_WaitAck();

IIC_Start();
IIC_SendByte(0xa1);
IIC_WaitAck();
re=IIC_RecByte();
IIC_SendAck(0);
IIC_WaitAck();//这个代码多余,要删除。
re=(IIC_RecByte()<<8)|re;
IIC_Stop();
Delayms(5);
return re;


———————————————————正确代码如下
unsigned int read_E2prom(unsigned char adr)

unsigned int re;
IIC_Start();
IIC_SendByte(0xa0);
IIC_WaitAck();
IIC_SendByte(adr);
IIC_WaitAck();

IIC_Start();
IIC_SendByte(0xa1);
IIC_WaitAck();
re=IIC_RecByte();
IIC_SendAck(0);
re=(IIC_RecByte()<<8)|re;
IIC_Stop();
Delayms(5);
return re;
参考技术B 注意写入位置和读取位置。
另外读写程序也要注意是否正确

HttpClient读取数据乱码的解决方案

博主是一个近十年的老书虫了,从高中那会儿就开始看网络小说。每天半天看晚上看啊,终于眼睛也近视了,成绩也下降了(。。。。好像说远了)
最近在追辰东的《圣墟》,最近写到精彩部分了,一直等更新。但是也不能一直开着浏览器刷新啊。。。。
于是乎,就发挥了咱们程序员自给自足的精神,写一个程序去监听,然后等又更新的时候,自动打开浏览器,然后就可以愉快的看书了。。

-说干就干,打开VS2017,新建一个。。。。。。随便啥项目,然后写入

HttpClient httpClient = new HttpClient();
               
var message = await httpClient.GetAsync(a);
               
var html = await message.Content.ReadAsStringAsync();

-然后习惯性的Debug看一下html的值。。。。我的天。。。。

这啥玩意儿???

-然后我以为是编码问题,于是乎我又加上编码

var contentType = message.Content.Headers.ContentType;
if (string.IsNullOrEmpty(contentType.CharSet))
{
        contentType.CharSet = "utf-8";
}

-然后结果还是一样啊。。。。。我的天,难道这破网站有啥反爬虫机制???
-于是我又分析浏览器的请求,把请求头给加上

httpClient.DefaultRequestHeaders.Add("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8");
httpClient.DefaultRequestHeaders.Referrer = new Uri("http://m.gxwztv.com/");
httpClient.DefaultRequestHeaders.Add("Cookie", "cids_AC=92542; cids_AC3=12743; cids_NU=12533; ras=41901%2C2121%2C12743%2C92542; cids_AC1=2121%2C41901; cv=5; fs=16; which=2");
httpClient.DefaultRequestHeaders.Add("User-Agent", "Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13B143 Safari/601.1");
httpClient.DefaultRequestHeaders.Add("Accept-Language", "zh-CN,zh;q=0.8,en;q=0.6");
httpClient.DefaultRequestHeaders.Add("Connection", "keep-alive");
httpClient.DefaultRequestHeaders.Add("DNT", "1");
httpClient.DefaultRequestHeaders.Add("Accept-Encoding", "gzip, deflate, sdch");

这下终于对了把???然后F5运行。。。我的天,还是不对。。。。

-然后我又瞎找了十来分钟原因,最后瞟到上面那行代码。。。。对!没错,就是那个Gzip。。。。我想会不会是要解压啊。。。web程序员的我,平时这些都是浏览器帮我搞定了啊,我哪儿知道这些啊。
-于是又翻开万能的MSDN。。。找httclient解压Gzip的api。。。。

var handler = new HttpClientHandler()
{
       AutomaticDecompression = DecompressionMethods.GZip
};
HttpClient httpClient = new HttpClient(handler);

然后就这样,然后再次F5.。。。。这下终于对了。。。。

继续写吧,争取再23.30之前写完这个小工具。。。。

以上是关于AT24C02写一个数据然后读取一个数据是正确的,但是当写入多个数据时,读出数据就不正确,求指教?的主要内容,如果未能解决你的问题,请参考以下文章

IIC总线与AT24C02的使用

为啥这样写还是读不出来500数值,芯片是 24c02?

IIC AT24C02读写数据的一点小体会

I2C协议简介

Arduino UNO向AT24C02写入数据IIC完整通讯过程详解

Proteus仿真AT24C02数据读写+LCD1602显示