1、iic总线从机没有返回应答给主机
硬件上检查下iic设备有没有虚焊,总线有没有冲突,示波器点下scl和sda线有没有半高电平;
如果你的代码不保证是成熟的,建议示波器触发一下看看时序满不满足iic协议要求;
读出的数据是总线默认状态ff,说明设备没响应,最有可能:
地址不对;
时序不对;
速率不匹配。
2、i2c主机和从机代码可以烧到哪些芯片上
作为从机,只能接收主机的指令,不能主动发送数据。所以必须明白,所有的通信都是由主机发起的,主机要读取从机的数据,首先向从机发送读数据指令,从机接收到之后,发出应答信号,就会想主机发送要求的数据。当然,如果从机是遵循I2C的传感器芯片,肯定有对应的指令格式,你得先看看数据手册。
3、I2C是什么
I²C(Inter-Integrated Circuit)是内部整合电路的称呼,是一种串行通讯总线,使用多主从架构,由飞利浦公司在1980年代为了让主板、嵌入式系统或手机用以连接低速周边装置而发展。I²C(读作"I-squared-C" ),还有可选的拼写方式是I2C(读作I-two-C)以及IIC(读作I-I-C),在中国则多以"I方C"称之。
I2C(Inter-Integrated Circuit)总线是由PHILIPS公司开发的两线式串行总线,用于连接微控制器及其外围设备。是微电子通信控制领域广泛采用的一种总线标准。它是同步通信的一种特殊形式,具有接口线少,控制方式简单,器件封装形式小,通信速率较高等优点。I2C 总线支持任何IC 生产过程(CMOS、双极性)。通过串行数据(SDA)线和串行时钟 (SCL)线在连接到总线的器件间传递信息。每个器件都有一个唯一的地址识别(无论是微控制器——MCU、LCD 驱动器、存储器或键盘接口),而且都可以作为一个发送器或接收器(由器件的功能决定)。LCD 驱动器只能作为接收器,而存储器则既可以接收又可以发送数据。除了发送器和接收器外,器件在执行数据传输时也可以被看作是主机或从机(见表1)。主机是初始化总线的数据传输并产生允许传输的时钟信号的器件。此时,任何被寻址的器件都被认为是从机。
特征:
1、只要求两条总线线路:一条串行数据线SDA,一条串行时钟线SCL;
2、每个连接到总线的器件都可以通过唯一的地址和一直存在的简单的主机/从机关系软件设定地址,主机可以作为主机发送器或主机接收器;
3、它是一个真正的多主机总线,如果两个或更多主机同时初始化,数据传输可以通过冲突检测和仲裁防止数据被破坏;
4、串行的8 位双向数据传输位速率在标准模式下可达100kbit/s,快速模式下可达400kbit/s,高速模式下可达3.4Mbit/s;
5、连接到相同总线的IC 数量只受到总线的最大电容400pF 限制。
【详细资料请参阅网络《I2C》或《IIC》】
4、主机如何确定IIC总线上的器件的地址?
IIC总线上的器件都是只通过SCL和SDA这两条线连接到IIC总线上的吗?
是的
IIC上的每个器件都要一个地址寄存器来确定自己的地址吗?
不一定,很多器件都是通过硬件来确定地址的。
有的在出厂时地址就设置好了,用户不可以更改;
有的确定了几位,剩下几位由硬件确定(比如有三位由用户确定,就留有3个控制地址的引脚),此类较多;
还有的有地址寄存器。
"如果主机向从机发送地址,从机怎么知道这个地址就是主机的,这个地址是怎么计算出来的"
严格讲,主机不是向从机发送地址,而是主机往总线上发送地址(这个地址是某个从机的,而不是主机的,所以不存在“从机怎么知道这个地址就是主机的”的问题),所有的从机都能接收到主机发出的地址,然后每个从机都将主机发出的地址与自己的地址比较,如果匹配上了,这个从机就会向主机发出一个响应信号。主机收到响应信号后,开始向总线上发送数据,与这个从机的通讯就建立起来了。如果主机没有收到响应信号,则表示寻址失败。
“比如IIC总线上接了两块单片机,一块是主机,另一块是从机,如何定义从机的这个地址”
如果是带IIC的单片机,会有地址寄存器,寄存器里的值即为它作为从机时的地址。
以ATmega48为例,有TWI从机地址寄存器—TWAR,先要确定工作模式(主机模式或从机模式),若工作在从机模式,,TWI将根据这个地址进行响应。
如果是不带IIC的单片机,没有地址寄存器。所以一般不用做从机。以AT89C51为例,用它的普通IO口模拟IIC时序时,一般都是用作主机。特殊情况下51用作从机时,可以通过扫描总线的方式,若发现总线上出现某个地址信号便响应(严格来说,这种方式只是在IIC基础上z用户定义的通信方式)。
最常见的情况,如前面所说,主从器件的角色是确定的,也就是说从机一直工作在从机模式。它的地址确定方法我已经说过了。不同的器件定义地址的方式是不同的,有的是软件定义,有的是硬件定义。你找个数据手册看看就明白了,纸上谈兵很难说清楚。
5、iic(i2c)的应答信号是由主机发起告诉从机,还是由从机发起告诉主机啊?
相互的,都有
6、6) IIC总线挂载多个从机时,主机如何区分?
通过地址可以区分,
一般eeprom上面有A1,A2,A3 3个脚,就是脚;
你可以分别接为 000 到 111 八个地址 ,可以挂8个从机
7、IIC的主机应答和从机应答有什么区别,分别用在什么地方,就是说什么时候用主机应答,什么时候用从机应答?
IIC是按字节来传输的,当每传输完一个字节的数据,后面必须紧跟一个校验位,这个校验位是接收端通过控制SDA(数据线)来实现的,以提醒发送端数据我这边已经接收完成。
(SDA=0为ACK 接收完成 SDA=1为NACK 繁忙中)
主机应答: 传输完一个字节数据以后(数据传输方向:从机--->主机),主机控制(此时是接收端)SDA来提醒从机(发送端)我这边接受完成
从机应答: 传输完一个字节数据以后(数据传输方向:主机--->从机),从机控制(此时是接收端)SDA来提醒主机(发送端)我这边接受完成
8、iic中主机读取一个字节的时候,从机怎么知道什么时候给主机发送数据呢
单片机一般先发一个命令给二总线模块(比如e2prom....)。
然后得到总线模块的回应。
再发地址码,随后接受数据。
i2c_SCL只是同步信号,在两个脉冲之间得到的i2c_sda数据视为一个完整数据。
9、单片机IIC通信,从机可以随时控制主机吗?
从机只要发送特定信号到主机,主机收到特定的信号,处理特定的服务程序即可
10、双机iic通讯,从机如何发数据给主机
通过gpio口的拉高拉低,在拉高拉低中间读取数据即可,配置和普通io口一致