硬汉嵌入式论坛

 找回密码
 立即注册
查看: 5473|回复: 1
收起左侧

[有问必答] STM32F401的I2C接口AcknowledgePolling

[复制链接]

69

主题

483

回帖

695

积分

金牌会员

积分
695
发表于 2020-2-5 17:44:51 | 显示全部楼层 |阅读模式
//As soon (and as long) as internal Write is in progress, the Slave will not
//acknowledge the Master. This feature enables the Master to immediately follow
//up with a new Read or Write request, rather than wait for the maximum specified
//Write time (tWR) to elapse. Upon receiving a NoACK response from the Slave, the
//Master simply repeats the request until the Slave responds with ACK.
上面这段儿话摘自于CAT24C64中关于Acknowledge Polling的描述,意思是说器件儿内部如果正在进行写动作,那么器件儿不会acknowledge主机,利用器件儿的这个特性,主机可以向器件儿发送连续的读或者写命令,也好于死等固定的时间长度要好,如果器件儿应答的是NoACK,那么主机就一直重复发送读或写命令,直到器件儿应答的是ACK
在我们读写I2C设备之前,都要对器件儿进行忙状态查询,下面是我的代码:
void I2C_AcknowledgePolling(u8 sla)
{   
    do
    {
        I2C_ClearFlag(I2C1, I2C_FLAG_AF); //1处

        I2C_GenerateSTART(I2C1, ENABLE); //2处
        while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT)); //3处

        I2C_Send7bitAddress(I2C1, sla, I2C_Direction_Transmitter); //4处
        while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)); //5处
    }while(!(I2C_ReadRegister(I2C1, I2C_Register_SR1) & I2C_FLAG_AF));
}
sla是器件儿地址,我这里操作的是PCF8563,那么这个器件儿的从地址是0xa2,这个不重要
在//1处,软件清除I2C_FLAG_AF标记
在//2处,软件产生一个启动信号
在//3处,软件无限等待I2C外设成功发送启动信号
在//4处,向PCF8563写从器件地址0xa2,然后下面的while()是等待PCF8563给出ACK应答后才退出,那么问题在//4处之后,要不要加上//5处的那句话,然后再等待从器件返回ACK信号?我认为//5处这句话是要加上的,因为//5这句话是等待F4的I2C外设发送完sla信号,在这之后才是PCF8563给出ACK或者NACK应答,不知道我分析的对不对,请各路高手指点

本人的 51 ARM PC RTOS 研究群:725436073
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117586
QQ
发表于 2020-2-6 01:22:57 | 显示全部楼层
帮顶下吧,没有用过STM32自带的硬件I2C
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-8-17 05:46 , Processed in 0.036050 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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