Main Takeaway
Following 哈工深上传到B站的电控组培训来入门robomaster电控组,我购买了普中科技玄武套餐开发板作为硬件。
本篇介绍我学习IIC,EEPROM的见闻,并顺带介绍了J-scope软件的使用
Tips:基本全是copy仅添加一点个人的理解和整理,再次感谢前辈的分享。
IIC
简介
IIC(Inter-Integrated Circuit)总线是一种由PHILIPS公司在80年代开发的两线式串行总线,用于连接微控制器及其外围设备。它是半双工多设备通信方式。
IIC总线最主要的优点是其简单性和有效性。由于接口直接在组件之上,因此IIC总线占用的空间非常小,减少了电路板的空间和芯片管脚的数量,降低了互联成本。总线的长度可高达25英尺,并且能够以10Kbps的最大传输速率支持40个组件。
IIC总线的另一个优点是,它支持多主控(multimastering), 其中任何能够进行发送和接收的设备都可以成为主总线。一个主控能够控制信号的传输和时钟频率。
Tips:当然,在任何时间点上只能有一个主控。
IIC串行总线一般有两根信号线,一根是双向的数据线SDA,另一根是时钟线SCL,其时钟信号是由主控器件产生。所有接到IIC总线设备上的串行数据SDA都接到总线的SDA上,各设备的时钟线SCL接到总线的SCL上。对于并联在一条总线上的每个IC都有唯一的地址。

Tips:高阻态,有一个低电平信号全为低电平
一般情况下,数据线SDA和时钟线SCL都是处于上拉电阻状态。
Tips:因为在总线空闲状态时,这两根线一般被上面所接的上拉电阻拉高,保持着高电平。
目前绝大多数的MCU都附带IIC总线接口,STM32也不例外。但我们不使用STM32的硬件IIC,而是通过软件的方式来模拟(会占用MCU),因为STM32的硬件IIC非常复杂,更重要的是它并不稳定,故不推荐使用。
- 总线上发送数据的器件被称作发送器
- 接收数据的器件被称作接收器
- 控制信息交换的器件被称作主器件
- 受主器件控制的器件则被称作从器件
- 主器件产生串行时钟SCL, 控制总线的访问状态、产生START和STOP条件
IIC时序图详解
IIC总线在传输数据的过程中一共有三种类型信号,分别为:开始信号、结束信号和应答信号。
空闲状态
当IIC总线的数据线SDA和时钟线SCL两条信号线同时处于高电平时,规定为总线的空闲状态。此时各个器件的输出级场效应管均处在截止状态,即释放总线,由两条信号线各自的上拉电阻把电平拉高。
起始信号与停止信号
起始信号:当时钟线SCL为高期间,数据线SDA由高到低的跳变;启动信号是一种电平跳变时序信号,而不是一个电平信号;
停止信号:当时钟线SCL为高期间,数据线SDA由低到高的跳变;停止信号也是一种电平跳变时序信号,而不是一个电平信号。

应答信号
发送器每发送一个字节(8个bit),就在时钟脉冲9期间释放数据线,由接收器反馈一个应答信号。
应答信号为低电平时,规定为有效应答位(ACK,简称应答位),表示接收器已经成功地接收了该字节;
应答信号为高电平时,规定为非应答位(NACK),一般表示接收器接收该字节没有成功。

对于反馈有效应答位ACK的要求是:接收器在第9个时钟脉冲之前的低电平期间将数据线SDA拉低,并且确保在该时钟的高电平期间为稳定的低电平。
如果接收器是主控器,则在它收到最后一个字节后,发送一个NACK信号,以通知被控发送器结束数据发送,并释放数据线SDA,以便主控接收器发送一个停止信号P。
数据有效性
IIC总线进行数据传送时,时钟信号为高电平期间,数据线上的数据必须保持稳定;只有在时钟线上的信号为低电平期间,数据线上的高电平或低电平状态才允许变化。
Tips:即数据在时钟线SCL的上升沿到来之前就需准备好。并在在下降沿到来之前必须稳定。

数据的传达
每个时钟脉冲传送一位数据(或同步控制),即在SCL串行时钟的配合下,在SDA上逐位地串行传送每一位数据。数据位的传输是边沿触发。
SCL为高时SDA必须保持稳定,因为此时SDA的改变被认为是控制信号。
延时时间

IIC总线的数据传送
IIC总线上的每一个设备都可以作为主设备或者从设备,而且每一个设备都会对应一个唯一的地址(地址通过物理接地或者拉高),主从设备之间就通过这个地址来确定与哪个器件进行通信。
- 主设备在传输有效数据之前要先指定从设备的地址,地址指定的过程和上面数据传输的过程一样(大多数从设备的地址是7位的)
- 然后协议规定再给地址添加一个最低位用来表示接下来数据传输的方向:
- 0表示主设备向从设备写数据
- 1表示主设备向从设备读数据。

主设备往从设备中写数据。数据传输格式如下:
Tips:淡蓝色部分表示数据由主机向从机传送,粉红色部分则表示数据由从机向主机传送。写用0来表示(高电平),读用1来表示(低电平)。
主设备从从设备中读数据。数据传输格式如下:
Notes:在从机产生响应时,主机从发送变成接收,从机从接收变成发送。之后,数据由从机发送,主机接收,每个应答由主机产生,时钟信号仍由主机产生。若主机要终止本次传输,则发送一个非应答信号,接着主机产生停止条件。
IIC仲裁
如果有两个或两个以上的节点都向总线上发送启动信号并开始传送数据,这样就形成了冲突。要解决这种冲突,就要进行仲裁的判决,这就是I2C总线上的仲裁。
高阻态,当有2个设备同时发送数据,当发送的1和0相冲突(高阻态变为0),发送1的设备检测到不对自动退出。(和CAN差不多)
EEPROM
简介
EEPROM的全称是电可擦除可编程只读存储器(Electrically Erasable Programmable Read-Only Memory)。是一种非易失性存储器,它可以在不断电的情况下保持数据的完整性。EEPROM的特点是可以通过电子信号来擦除和重写其中的数据,而不需要像EPROM那样使用紫外线。EEPROM的最小擦写单位是字节,这意味着可以对单个字节进行修改,而不必擦除整个芯片。
器件寻址
起始条件使能芯片读写操作后,EEPROM都要求有8位的器件地址信息:
器件地址信息由"1"、"0"序列组成,前4位如图中所示,对于所有串行EEPROM都是一样的。对于24C02/32/64, 随后3位A2、A1和A0为器件地址位,必须与硬件输入引脚保持一致。
Tips:如上面的A0,A1,A2跟GND连接,所以为0
对于24C04, 随后2位A2和A1为器件地址位,另1位为页地址位。A2和A1必须与硬件输入引脚保挣一致,而A0是空脚。
对于24C08, 随后1位A2为器件地址位,另2位为页地址位。A2必须与硬件输入引脚保持一致,而A1和A0是空脚。
对于24C06, 无器件地址位,3位都为页地址位,而A2、A1和A0是空脚。
器件地址信息的LSB为读/写操作选择位,高为读操作1,低为写操作0。
若比较器件地址一致,EEPROM将输出应答"0"。如果不一致,则返回到待机状态。
实验
实验还是选择用硬件实现IIC,并向EEPROM写入和读出数据
CubeMX
现在开发板原理图中找到想要使用的IIC
选择Fast Mode:400000Hz,其他保持默认即可
Tips:这个实验没用任何中断,所以没有设置
Code
哈工深提供了EEPROM库的代码,然后直接利用I2C_EEPROM_WriteBuffer(),I2C_EEPROM_ReadBuffer()两个函数来进行读写
J-Scope
简介
J-Scope是J-link的功能之一:实时分析数据并图形化显示的软件。
J-Scope可以以类似示波器的方式显示多个变量的值。它读取elf或axf文件并允许选择多个变量进行可视化。
只需将目标微控制器连接到J-Link并启动J-Scope,几个步骤即可配置J-Scope,并选择要显示的符号。
工作模式
J-Scope主要有RTT和HSS两种工作模式。
RTT模式:需要用户在MCU上添加代码,有点类似串口上传数据,因为有额外的代码,所以需要占用MCU的资源。优点是速度快,缺点是需要额外的代码。
HSS模式:不需要用户在MCU上添加任何代码,只需要使用J_Scope加载MDK或IAR的可执行文件即可,而且可以随时链接MCU,不影响MCU的正常功能,不需要额外的资源。使用标准的SWD接口即可。优点是不需要添加代码,缺点是速度较慢,一般为1K。
J-Scope这么强大,但是依旧取代不了通过硬件串口发送给PC虚拟示波器的软件,因为J-Scope只能读取全局变量的数据,我们使用硬件串口可以将函数的局部变量发给虚拟示波器。
References
哈工深B站视频
EEPROM存储器24C02手册(中文):13.详细操作说明