完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
原子哥在I2C的代码有些没有看懂下面这段代码里,IIC_Wait_Ack()函数应该会返回一个0或1,这里并没有用它的返回值,而是直接往下运行了,那如果这里的返回值是0,代码里并没有给出相应的处理啊,求大佬帮助一下,多谢多谢
void AT24CXX_WriteOneByte(u16 WriteAddr,u8 DataToWrite) { IIC_Start(); if(EE_TYPE>AT24C16) { IIC_Send_Byte(0XA0); //发送写命令 IIC_Wait_Ack(); IIC_Send_Byte(WriteAddr>>8);//发送高地址,即WriteAddr高八位 }else IIC_Send_Byte(0XA0+((WriteAddr/256)<<1)); //发送器件地址0XA0,写数据 IIC_Wait_Ack(); IIC_Send_Byte(WriteAddr%256); //发送低地址,即WriteAddr低八位 IIC_Wait_Ack(); IIC_Send_Byte(DataToWrite); //发送字节 IIC_Wait_Ack(); IIC_Stop();//产生一个停止条件 delay_ms(10); } |
|
相关推荐
10个回答
|
|
本帖最后由 wenyangzeng 于 2018-3-28 22:25 编辑
IIC_Wait_Ack()应答信号只是回复1个低电平; IIC_NAck()回复1个高电平而已。 AT24CXX_WriteOneByte()里 执行IIC_Send_Byte()后就要一直等到低电平的到来。 |
|
|
|
|
|
|
|
光从函数名来看,IIC_Wait_Ack()就应该是等待应答,而不是发送相应的电平。 IIC_NAck()才是发送相应的电平 |
|
|
|
IIC_Wait_Ack()没有处理应答,你可以自己添加相应的处理,比如应答错误的话,重新开始IIC通讯过程等等。
比如IIC写EEPROM时,可以不处理应答,通过写入再读取的方式判断是否成功;当然也可以通过处理应答的方式来判断是否成功;就看个人而已。 |
|
|
|
也就是说发完一个字节的数据必须空出一个SCL脉冲的时间去读这个应答,而不能继续发数据,所以就有了IIC_Wait_Ack()这个函数。 也像楼下说的,这个应答是成功还是失败可以自己再写相应的程序去处理,只不过这里没有管应答成功还是失败就继续传下一个字节了,这个理解对吗? |
|
|
|
“发送相应的电平”,指的是主机发送SCL上升下降的脉冲,来读由从机发来的应答信号吗 然后再问一下,主机如果是发送设备,是不需要用IIC_NAck()的对吧?只有从机是接受设备,而且接受完一个字节的时候,才需要发送一个IIC_NAck(),用来释放SDA |
|
|
|
这个ACK相当于是IIC从设备给主设备的一个回执,通常我们假定是正确的,当然也可以添加自己的错误处理机制。
但是主设备从设备读取多条字节指令时,最后一条要求主设备应答NACK,然后停止IIC总线。 |
|
|
|
hrt666 发表于 2018-8-17 07:13 如果器件没有接收到正确的数据,自然不会返回正确的应答信号。以此来判断本次通讯成功与否。 如楼主所述:“这个应答是成功还是失败可以自己再写相应的程序去处理”。 |
|
|
|
ctwewer 发表于 2018-8-17 07:39 好的,谢谢您的解答! |
|
|
|
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
1980 浏览 1 评论
AD7686芯片不传输数据给STM32,但是手按住就会有数据。
1836 浏览 3 评论
4416 浏览 0 评论
如何解决MPU-9250与STM32通讯时,出现HAL_ERROR = 0x01U
1985 浏览 1 评论
hal库中i2c卡死在HAL_I2C_Master_Transmit
2489 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-19 13:19 , Processed in 0.773183 second(s), Total 89, Slave 73 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号