OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 8323|回复: 10

IIC连续读写遇到问题

[复制链接]

8

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
74
金钱
74
注册时间
2015-2-24
在线时间
0 小时
发表于 2015-3-13 11:22:31 | 显示全部楼层 |阅读模式
5金钱
void IIC_Continus_Write(u8 WriteAddrs,u8 *Num,u16 NumToWrite)
{
IIC_Start(); //开始信号
IIC_Send_Byte(0xA0); //写入器件地址+0
IIC_Wait_Ack(); //等待应答
IIC_Send_Byte(WriteAddrs); //写入目标内存地址
IIC_Wait_Ack();
while(NumToWrite) //开始写入
{
IIC_Send_Byte(*Num);
IIC_Wait_Ack();
++Num;
NumToWrite--;
}
IIC_Stop(); //结束IIC
}
void IIC_Continus_Read(u8 ReadAddrs,u8 *Array,u16 Len)
{
IIC_Start(); //开始信号
IIC_Send_Byte(0xA0); //写入器件地址+0
IIC_Wait_Ack(); //等待应答
IIC_Send_Byte(ReadAddrs); //写入要读取的内存地址
IIC_Wait_Ack();
IIC_Start(); //重新发送开始信号
IIC_Send_Byte(0xA1); //写入器件地址+1
IIC_Wait_Ack();
while(Len)
{
*Array=IIC_Read_Byte();
IIC_Ack();
++Array;
Len--;
}
IIC_Stop();
}

原子哥,就我想实现IIC的连续读写,为什么上面贴的代码就是不行?

最佳答案

查看完整内容[请看2#楼]

两次写操作,中间要加入延时, 可能长达几毫秒,看手册。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11558
金钱
11558
注册时间
2014-4-1
在线时间
1318 小时
发表于 2015-3-13 11:22:32 | 显示全部楼层
两次写操作,中间要加入延时,
可能长达几毫秒,看手册。
回复

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11558
金钱
11558
注册时间
2014-4-1
在线时间
1318 小时
发表于 2015-3-13 11:30:15 | 显示全部楼层
延时????
回复

使用道具 举报

10

主题

561

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1839
金钱
1839
注册时间
2014-6-27
在线时间
982 小时
发表于 2015-3-13 14:21:50 | 显示全部楼层
有的IC不加延时是可以的,有的需要加延时,如果是批量生产的话,最好加延时,延时的时间可以测试出来,一般2MS就可以了。
回复

使用道具 举报

8

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
74
金钱
74
注册时间
2015-2-24
在线时间
0 小时
 楼主| 发表于 2015-3-13 16:21:11 | 显示全部楼层
回复【2楼】xuande:
---------------------------------
啥延时?能不能说明白点
回复

使用道具 举报

8

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
74
金钱
74
注册时间
2015-2-24
在线时间
0 小时
 楼主| 发表于 2015-3-13 17:15:30 | 显示全部楼层
回复【5楼】xuande:
---------------------------------
手册上面没有看到这个啊,是不是就是说要在连续发送一串数据中的一个之后都要延时2ms?
十分感谢啊!
回复

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11558
金钱
11558
注册时间
2014-4-1
在线时间
1318 小时
发表于 2015-3-13 23:01:54 | 显示全部楼层

类似这个参数:


回复

使用道具 举报

8

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
74
金钱
74
注册时间
2015-2-24
在线时间
0 小时
 楼主| 发表于 2015-3-14 11:16:21 | 显示全部楼层
回复【7楼】xuande:
--------------------------------
还有点问题啊,就是那个代码是连续发送的啊,中间没有Start和Stop信号啊?
求解啊!
谢谢啊!
回复

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11558
金钱
11558
注册时间
2014-4-1
在线时间
1318 小时
发表于 2015-3-14 16:16:09 | 显示全部楼层
不明白 7L 说什么。

这个延时是指:

一次写入操作完成后,必须延时一段时间,才能再次写入。
回复

使用道具 举报

8

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
74
金钱
74
注册时间
2015-2-24
在线时间
0 小时
 楼主| 发表于 2015-3-18 19:27:36 | 显示全部楼层
回复【9楼】xuande:
---------------------------------
#include"sys.h"
#include"iic.h"
#include"24c02.h"
#include"delay.h"

void IIC_Continus_Write(u8 WriteAddrs,u8 *Num,u16 NumToWrite)
{
IIC_Start(); //开始信号
IIC_Send_Byte(0xA0); //写入器件地址+0
delay_ms(2);
IIC_Wait_Ack(); //等待应答
IIC_Send_Byte(WriteAddrs); //写入目标内存地址
delay_ms(2);
IIC_Wait_Ack();
while(NumToWrite) //开始写入
{
IIC_Send_Byte(*Num);
IIC_Wait_Ack();
++Num;
NumToWrite--;
delay_ms(2);
}
IIC_Stop(); //结束IIC
}
void IIC_Continus_Read(u8 ReadAddrs,u8 *Array,u16 Len)
{
IIC_Start(); //开始信号
IIC_Send_Byte(0xA0); //写入器件地址+0
delay_ms(2);
IIC_Wait_Ack(); //等待应答
IIC_Send_Byte(ReadAddrs); //写入要读取的内存地址
delay_ms(2);
IIC_Wait_Ack();
IIC_Start(); //重新发送开始信号
IIC_Send_Byte(0xA1); //写入器件地址+1
delay_ms(2);
IIC_Wait_Ack();
while(Len)
{
*Array=IIC_Read_Byte();
IIC_Ack();
++Array;
Len--;
}
IIC_Stop();
}


我表示我延时了,还是不行。。。究竟是什么情况啊?
麻烦了,非常感谢!
回复

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11558
金钱
11558
注册时间
2014-4-1
在线时间
1318 小时
发表于 2015-3-18 19:51:36 | 显示全部楼层
唉,不是这样延时。。。。

是在连续调用IIC_Continus_Write时,中间必须有足够延时,因为芯片正忙着执行你上次的写操作。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-24 16:39

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表