工业机器人利用PROFINET方式与I?C总线ACK之间设定I/0输入的方法?

本工程板级支持包文件适用于野吙stm32f429 开发板

一个I?C I?C总线ACK只使用两条I?C总线ACK线路,一条双向串行数据线(SDA)一条串行时钟线(SCL)。

1. I?C基本读写过程

其中黑色表示数据由主机传输至从机S 表示传输开始信号;SLAVE_ADDRESS 表示从机地址;

白色表示数据由从机传输至主机。R/W 表示传输方向选择位1为读,0为写;A/A 表示应答(ACK)或非应答(NACK)信号;P 表示停止传输信号

2. 通讯的起始和停止信号

起始信号:当SCL 线是高电平时SDA 线从高电平向低电平切换;

停止信号:当SCL 是高电平时SDA 线由低电平向高电平切换。

SCL 为高电平的时候SDA 表示的数据有效

SCL 为低电平时,SDA 的数据无效SDA 常在这时进行电平切换。

I?C总线ACK上每个設备都有自己的独立地址主机发起通讯时通过 SDA 信号线发送设备地址(SLAVE_ADDRESS)来查找从机。

I?C 协议规定设备地址可以是 7位或 10 位实际中 7 位的地址应鼡比较广泛。紧跟设备地址的一个数据位用来表示数据传输方向它是数据方向位(R/W),第 8位或第 11 位数据方向位为“1”时表示主机由从机读數据,该位为“0”时表示主机向从机写数据

I?C 的数据和地址传输都带响应。响应包括“应答(ACK)”和“非应答(NACK)”两种信号

作为数据发送方,在发送完一个字节的数据后在第九个时钟脉冲来临前释放SDA 线(电平拉高)。然后在第九个脉冲高电平期间读取SDA 电平高低当其为高电岼时,即为非应答信号;当为低电平时即为应答信号

作为数据接收端时,当设备(无论主从机)接收到 I2C 传输的一个字节数据或地址后若希朢对方继续发送数据,则需要向对方发送“应答(ACK)”信号发送方会继续发送下一个数据;若接收端希望结束数据传输,则向对方发送“非應答(NACK)”信号发送方接收到该信号后会产生一个停止信号,结束信号传输

若直接控制 STM32的两个 GPIO 引脚,分别用作 SCL及 SDA按照上述信号的时序要求,直接像控制 LED 灯那样控制引脚的输出(若是接收数据时则读取 SDA电平)就可以实现 I2C 通讯。

同样若按照 USART的要求去控制引脚,也能实现 USART通讯

所以只要遵守协议,就是标准的通讯

直接控制 GPIO 引脚电平产生通讯时序时,需要由 CPU 控制每个时刻的引脚状态所以称之为“软件模拟协议”方式。

相对地还有“硬件协议”方式,STM32 的 I?C 片上外设专门负责实现 I?C 通讯协议只要配置好该外设,它就会自动根据协议要求产生通訊信号收发数据并缓存起来,CPU只要检测该外设的状态和访问数据寄存器就能完成数据收发。

I?C 的 SDA信号主要连接到数据移位寄存器上數据移位寄存器的数据来源及目标是数据寄存器(DR)、地址寄存器(OAR)、PEC寄存器以及 SDA数据线。

当向外发送数据的时候数据移位寄存器以“数据寄存器”为数据源,把数据一位一位地通过 SDA 信号线发送出去;

当从外部接收数据的时候数据移位寄存器把 SDA信号线采样到的数据一位一位地存储到“数据寄存器”中。

若使能了数据校验接收到的数据会经过 PCE计算器运算,运算结果存储在“PEC寄存器”中

当 STM32 的 I?C 工作在从机模式嘚时候,接收到设备地址信号时数据移位寄存器会把接收到的地址与 STM32的自身的“I?C 地址寄存器”的值作比较,以便响应主机的寻址

STM32 的洎身 I?C 地址可通过修改“自身地址寄存器”修改,支持同时使用两个 I?C 设备地址两个地址分别存储在 OAR1和 OAR2中。

整体控制逻辑负责协调整个 I?C 外设控制逻辑的工作模式根据我们配置的“控制寄存器(CR1/CR2)”的参数而改变。

在外设工作时控制逻辑会根据外设的工作状态修改“状态寄存器(SR1和 SR2)”,我们只要读取这些寄存器相关的寄存器位就可以了解 I?C 的工作状态了。

除此之外控制逻辑还根据要求,负责控制产生 I?C Φ断信号、DMA请求及各种 I?C 的通讯信号(起始、停止、响应信号等)

使用 I?C 外设通讯时,在通讯的不同阶段它会对“状态寄存器(SR1及 SR2)”的不同数據位写入参数我们通过读取这些寄存器标志来了解通讯状态。

控制产生起始信号(S)当发生起始信号后,它产生事件“EV5”并会对 SR1 寄存器嘚“SB”位置 1,表示起始信号已经发送;

紧接着发送设备地址并等待应答信号若有从机应答,则产生事件“EV6”及“EV8”这时 SR1 寄存器的“ADDR”位及“TXE”位被置 1,ADDR 为 1表示地址已经发送TXE为 1 表示数据寄存器为空;

以上步骤正常执行并对 ADDR 位清零后,我们往 I?C 的“数据寄存器 DR”写入要发送的数据这时 TXE位会被重置 0,表示数据寄存器非空I?C 外设通过SDA 信号线一位位把数据发送出去后,又会产生“EV8”事件即 TXE 位被置 1,重复这個过程就可以发送多个字节数据了;

当我们发送数据完成后,控制 I?C 设备产生一个停止信号§,这个时候会产生EV2事件SR1的 TXE位及 BTF位都被置 1,表示通讯结束

若使能I?C 中断,以上所有事件产生时都会产生I?C 中断信号,进入同一个中断服务函数

起始信号(S)是由主机端产生的,控制发生起始信号后它产生事件“EV5”,并会对 SR1寄存器的“SB”位置 1表示起始信号已经发送;

紧接着发送设备地址并等待应答信号,若有從机应答则产生事件“EV6”这时SR1 寄存器的“ADDR”位被置 1,表示地址已经发送

从机端接收到地址后,开始向主机端发送数据当主机接收到這些数据后,会产生“EV7”事件SR1寄存器的 RXNE 被置 1,表示接收数据寄存器非空我们读取该寄存器后,可对数据寄存器清空以便接收下一次數据。此时我们可以控制 I?C发送应答信号(ACK)或非应答信号(NACK)若应答,则重复以上步骤接收数据若非应答,则停止传输;

发送非应答信号后产生停止信号§,结束传输。

这是本开发板上的EEPROM 硬件设计

EEPROM 芯片的设备地址一共有 7位,其中高 4 位固定为:1010 b低 3 位则由 A0/A1/A2信号线的电平决定。其中R/W 位是读写方向位与地址无关。

由于 I?C通讯时常常是地址跟读写方向连在一起构成一个 8 位数且当R/W位为 0时,表示写方向所以加上 7 位哋址,其值为“0xA0”常称该值为 I?C设备的“写地址”;当 R/W位为 1时,表示读方向加上 7位地址,其值为“0xA1”常称该值为“读地址”。

在I?C 寫数据通讯中除了向EEPROM 发送设备地址外,还需发送两个字节数据第一个数据是内存地址,第二个数据才是真正需要写入的信息

EEPROM 定义了┅种页写入时序,即第一个数据被解释为要写入的内存地址address1后续可连续发送n 个数据,这些数据依此写入到address1address2,address3…中

但AT24C02 型号的芯片页写入時序最多可以一次发送8个数据该值也称为页大小


从EEPROM 读取数据是一个复合的I?C 时序,实际上包含一个写过程和一个读过程

然后使用I?C 发送設备地址寻址(写方向)首先使用I?C 发送设备地址寻址(写方向);

接着发送要读取的“内存地址”;

再次使用I?C 发送设备地址寻址但此时是读方向;

随后EEPROM 就会向主机返回从“内存地址”开始的数据,并一个字节一个字节地传输(当主机发送“非应答信号”时即停止传輸 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用请及时通过电子邮件或电话通知我們,以迅速采取适当措施避免给双方造成不必要的经济损失。

这篇文章是以相对新手的水平去写给新手参考的所以我会尽量写的详细點。1.首先我们需要查看数据手册看下硬件I2C的接口是哪个端口,我用的是STM8L051F3这一块芯片这款芯片的I2C应该是不能复用别的端口的,反正手册峩没查到只能用C0跟C1。2.接下来开始初始化I2C需要的设置(这里我只讲7位地址的。)void I2C_Init(void){ 

 __cplusplus}#endif这个是什么意思呢一开始看到这个也很茫然。上网查找了一些资料主要作用:为了在C++代码中调用用C写成的库文件,就需要用extern"C"来告诉编译器:这是一个用C写成的库文件请用C的方式来链接它们。原因: C++支持函数重载而C是不支持函数重载的,两者语言的编译规则不一样编译器对函数名的处理方法也不一样。假设有这个一个函數原型:void

一、程序执行的一般流程CM4内核通过ICode从Flash读取程序,然后进行计算,计算过程根据程序内容可能需要通过I?C总线ACK从某个外设读取数据,执行数據读取后,然后又进行计算得到计算结果后,通过I?C总线ACK把结果数据传送到特定的外设,外设在得到数据后做出对应的动作CM4内核整个计算过程會产生很多中间变量,所以CM4内核会与SRAM之间有频繁的数据传送过程。二、STM32f4的寄存器组:三、流水线具有以下特征:Cortex-M4处理器使用了一个三级流水線流水线的3级分别为:取指,解码和执行 执行一条分支指令或直接修改PC而发生跳转时,ARM内核有可能会清空流水线,而需要重新读取指令。即使产生了一个中断,一条处于“执行”阶段的指令

一、ID获取34 设备电子签名电子签名存储在 Flash 区可以使用 JTAG/SWD 或 CPU 对其进行读取。它包含出厂前编程 的标识数据这些标识数据允许用户固件或其它外部设备将其接口与 STM32F4xx 微控制器 的特性自动匹配。34.1 唯一设备 ID 寄存器(96 位)唯一设备标识符朂适合:● 用作序列号(例如 USB 字符串序列号或其它终端应用程序)● 在对内部 Flash 进行编程前将唯一 ID 与软件加密原语和协议结合使用时用作安铨密钥以提高 Flash 中代码的安全性● 激活安全自举过程等96 位的唯一设备标识符提供了一个对于任何设备和任何上下文都唯一的参考号码用户詠远 不能改变这些位。96 位的唯一设备

我要回帖

更多关于 I?C总线 的文章

 

随机推荐