
EV5、EV6并不是错误。
EV5事件:
程序中是这样调用的
//检测 EV5 事件并清除标志
while(! I2C_CheckEvent(EEPROM_I2C,I2C_EVENT_MASTER_MODE_SELECT))
{
if ((I2CTimeout--) == 0) return I2C_TIMEOUT_UserCallback(1)
}
可以看到这里有一个宏I2C_EVENT_MASTER_MODE_SELECT,它定义在stm32f4xx_i2c.h头文件中(答主用的STM32F4单片机)
它的值为((uint32_t)0x00030001)。
这里还有一个函数I2C_CheckEvent()
这个函数将I2C的两个16位寄存器SR1和SR2合并成一个32位数据再与FLAG_MASK (这也是一个宏,在stm32f4xx_i2c.c中,它的值为((uint32_t)0x00FFFFFF)) 做按位与运算,得到SR1的低8位数据和SR2的全部16位数据,这个数据再与宏 I2C_EVENT_MASTER_MODE_SELECT 做按位与运算这个宏的值为((uint32_t)0x00030001) ,取出了SR1寄存器的位0、位1,SR2寄存器的位0 的值。
我们来看看 SR1寄存器的位0、位1,SR2寄存器的位0 表示的什么含义?
在STM32F4xx中文参考手册中查到:
SR1:
SR2:
可见,EV5事件是判断起始位有没有产生、判断是主模式还是从模式,地址有没有发送的? 判断完成,无异常接下来就开始发送从设备地址了。
EV6事件同理,如果不懂,说明还没有理解上面的EV5事件,继续看EV5。
基本定时器为减1计数,当程序进入运行状态后,定时控制逻辑行接通的瞬间定时器开始工作。
工作过程是先将设定值寄存器SV5中的内容装入经过值寄存器EV5中。然后每经过一个定时时钟0.1s(EV5中的内容做减1计数,直至EV5中内容为0,该定时器对应的常开触点T5闭合,常闭触点T5断开。
此后若定时器控制逻辑行一直保持接通状态,则其触点动作保持,直至控制逻辑行断开,各触点复位。若控制逻辑行接通时间未达到定时器设定时间就断开,定时器触点不动作,EV5复位直至控制逻辑行再次接通,重新开始计时。
扩展资料
当PLC投入运行后,其工作过程一般分为三个阶段,即输入采样、用户程序执行和输出刷新三个阶段。完成上述三个阶段称作一个扫描周期。在整个运行期间,可编程逻辑控制器的CPU以一定的扫描速度重复执行上述三个阶段。
在输入采样阶段,PLC以扫描方式依次地读入所有输入状态和数据,并将它们存入I/O映象区中的相应的单元内。输入采样结束后,转入用户程序执行和输出刷新阶段。
在这两个阶段中,即使输入状态和数据发生变化,I/O映象区中的相应单元的状态和数据也不会改变。因此,如果输入是脉冲信号,则该脉冲信号的宽度必须大于一个扫描周期,才能保证在任何情况下,该输入均能被读入。
参考资料来源:百度百科-可编程逻辑控制器 (可编程控制器件)
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)