杂七杂八的整理——STM32、Proteus使用、UART、IIC、SPI、LIN

  • 简要介绍两款ARM架构单片机

一、 S32K1xx 系列单片机

S32K系列单片机是NXP比较新的车规级单片机,有S32K11x(基于ARM Cortex-M0+)和S32K14x(基于ARM Cortex-M4F)两个系列。NXP就是恩智浦,之前收购飞思卡尔的那个,NXP为自己的单片机提供了集成开发环境——S32 Design Studio,安装步骤如下:

1.在官网下载安装包,需要注册一个账号,按提示注册即可:
https://www.nxp.com/design/software/development-software/s32-design-studio-ide/s32-design-studio-for-s32-platform:S32DS-S32PLATFORM
2.安装软件,注意需要对许可协议进行“Accept”的时候把滚动条拉倒最下面才能点击“Accept”。
3.遇到需要输入激活码的地方,在刚刚下载的网页中找到Licensing-Licence list,然后找到Activation code。
4.选中Offline激活方式,保存生成的xml文件。
5.在刚刚下载的网页上选择offline方式激活,选择刚刚生成的xml文件进行激活。
接下来的详细步骤记不清了。。不难,按提示一步步来即可。应该是在网页上会利用xml文件再生成一个注册文件,再在软件中导入就行了。

这款单片机性能比较好,而且是ARM架构,NXP提供的开发环境还支持AUTOSAR架构,比较适合性能要求较高的场景。

开发时可以从S32DS的模板开始,有关这款单片机和其开发环境不多做介绍,给大家推荐一个微信公众号:汽车电子expert成长之路。博主是恩智浦的资深汽车电子应用工程师,经常在公众号分享单片机知识和开发方法,干货满满。下面这个资料就是他给别人培训这款单片机及开发环境的一个PPT,分享给大家,不要积分,借花献佛(不过CSDN貌似会不定期自动调整积分。。。)

//download.csdn.net/download/weixin_42967006/12232212

二、STM32

这款单片机大家可能都比较了解,我就不详细说了。需要注意的一点是STM32貌似没有通过车规级认证,但因为它性价比高,资源丰富,在车辆内饰等器件上仍然被用着。

我是刚刚开始接触STM32,说几个近期学习中遇到的问题点。

1.STM32是可以用Proteus仿真的

最新的Proteus版本支持了STM32F1XX和STM32F4XX系列的多款单片机。但是Proteus目前貌似还不支持STM32与Keil联调,反正我调试了很久一直是联调失败。。但proteus是支持51单片机和Keil联调的,部分ARM单片机理论上也支持,但没有调试过。一会介绍联调方法,先说在Proteus中仿真STM32的方法:
(1)Keil工程中设置生成elf文件:
杂七杂八的整理——STM32、Proteus使用、UART、IIC、SPI、LIN_第1张图片
(2)将Proteus工程放在Keil输出文件夹下,然后在单片机中加载生成的elf文件,就可以进行仿真了,暂停时可以看到汇编代码。加载elf文件相对于hex文件的好处就是可以看到变量值。
注意:Proteus软件如果不用管理员权限打开的话可能无法加载元器件库,可在快捷方式处设置默认为管理员权限打开。

  • Proteus与C51联调方法如下:

(1)先在proteus官网下载一个联调驱动文件:
http://downloads.labcenter.co.uk/vdmagi.exe
(2)安装驱动程序,如果要联调ARM,版本这里要选V3: 杂七杂八的整理——STM32、Proteus使用、UART、IIC、SPI、LIN_第2张图片
目标文件夹选择Keil的安装文件夹:
杂七杂八的整理——STM32、Proteus使用、UART、IIC、SPI、LIN_第3张图片
安装好之后在Keil安装目录下C51和ARM的BIN文件夹下可以分别看到两个名为VDM51.dll和VDMARM.dll的DLL,这两个其实就是驱动,此外还修改了Keil的TOOLS.INI文件,例如C51的添加了下面这个,以上就是这个驱动小软件做的工作。有驱动DLL的话,手动更改通常也能成功。另外需要注意的是安装完这个驱动后有可能导致Keil不能正常打开,我遇到了一次,最后是重装Keil解决的。。。所以能手动就尽量手动吧,先把DLL驱动放到相应地文件夹,然后参照下图修改TOOLS.INI文件,TDRV后面的序号找一个前面没用过的就行,要注意如果这个序号太大,例如十几,Keil软件中可能显示不全,找不到这个调试器(如下一张图),所以最好插入到前面某个序号。C51和ARM的驱动DLL大家可以从下面的链接下载:
//download.csdn.net/download/weixin_42967006/12236045
杂七杂八的整理——STM32、Proteus使用、UART、IIC、SPI、LIN_第4张图片
(3)安装完成后打开Keil工程的debug设置,就可以看到调试器中有一个Proteus VSM Simulator选项:
杂七杂八的整理——STM32、Proteus使用、UART、IIC、SPI、LIN_第5张图片
选中这个选项,再点击“setting”,设置成下面这样,通常默认就是这样:
杂七杂八的整理——STM32、Proteus使用、UART、IIC、SPI、LIN_第6张图片
(4)然后在Proteus中勾选:Debug-Enable Remote Debug Monitor,再在Keil软件中点击开始Debug,就会看到Proteus工程被调用起来了,接下来的调试和用硬件开发板相同。
注意:联调是调用的本地服务器,如果出现调用失败或端口无法访问的情况,可尝试如下办法:
在控制面板中打开程序和功能,找到Internet Information Services,设置成下面这样,然后点完成:
杂七杂八的整理——STM32、Proteus使用、UART、IIC、SPI、LIN_第7张图片
(5)尝试联调STM32的时候,点击开始调试总是出现如下的连接失败,一直没有解决。
杂七杂八的整理——STM32、Proteus使用、UART、IIC、SPI、LIN_第8张图片

2.STM32开发方法

STM32有专用的IDE STM32CubeMX,上文提到过,新建一个工程时要先获取相应单片机型号的基础软件包,如下图。应用层软件的开发都可以基于STM给提供的HAL库,比较清晰。
杂七杂八的整理——STM32、Proteus使用、UART、IIC、SPI、LIN_第9张图片

3.STM32的硬件IIC

STM32的硬件IIC貌似是有Bug。。我调了好久都没有调试成功,寄存器的值总是不对。网上大家也说有Bug,通常都用I/O口模拟IIC,所以大家权衡一下,可以适当避开这个坑。调SPI的时候相对来说就很顺利。


  • 几种通信协议及其应用场景举例——UART、IIC、SPI

一、UART

UART是异步串行全双工通信协议,两个通信实体之间只有收发两根线,没有时钟信号线,这意味着双方必须先商量好波特率才能进行通信,常用波特率有9600,19200,115200等。数据帧格式如下:
杂七杂八的整理——STM32、Proteus使用、UART、IIC、SPI、LIN_第10张图片
空闲状态:1,高电平
起始位:0
数据位:可配置为7位或8位,通常用8位
数据场发送顺序:LSB->MSB,即小端序,低位在前
奇偶校验位:可选,规则如下:

  • 奇数校验:例如A(0100 0001)字符的8个bit位中有两个1,那么奇偶校验位为1才能满足1的个数为奇数。
  • 偶数校验:A字符的8个bit位中有两个1,那么奇偶校验位为0才能满足1的个数为偶数。

停止位:一个字符数据的结束标志。长度可配置,可以是1位、1.5位(不常用)、2位的高电平。

UART开发比较简单,STM32自带的UART也可以直接用,不做过多介绍。转一篇大神的帖子,介绍的比较详细:
https://blog.csdn.net/zjy900507/article/details/79789671

二、IIC

IIC是同步串行半双工总线,一条串行数据线SDA,一条时钟线SCL。

1.协议

(1)数据有效性

在SCL高电平时,要求SDA的数据稳定,SDA仅可以在SCL为低电平时改变。
杂七杂八的整理——STM32、Proteus使用、UART、IIC、SPI、LIN_第11张图片

(2)起始和结束条件

起始条件:当SCL为高电平的时候,SDA线上由高到低的跳变被定义为起始条件;
结束条件:当SCL为高电平的时候,SDA线上由低到高的跳变被定义为停止条件。
总线在起始条件之后被视为忙碌状态,在停止条件之后被视为空闲状态。
杂七杂八的整理——STM32、Proteus使用、UART、IIC、SPI、LIN_第12张图片

(3)数据传输

高位在前(MSB),传输的每个字节必须为8位,其后跟着一个响应位。传输总字节数不受限制。从机可以在通讯过程中通过拉低SCL线迫使主机进入等待状态,当从机准备好之后再释放SCL线继续数据传输。当从设备发生异常情况,无法应答时,从设备也会主动将SCL拉低,阻止后续数据的继续发送。

(4)应答

每当主机向从机发送完一个字节的数据,主机总是需要等待从机给出一个应答信号,以确认从机是否成功接收到了数据。从机应答主机所需要的时钟仍是主机提供的,应答出现在每一次主机完成8个数据位传输后紧跟着的时钟周期,低电平0表示应答,1表示非应答。
杂七杂八的整理——STM32、Proteus使用、UART、IIC、SPI、LIN_第13张图片

(5)数据帧格式

在起始信号后,主机需先发送一个从机地址(7bit),第8位是数据传输方向:
0:主机发送数据(T);
1:主机接收数据(R)。
每次数据传送总是由主机产生的终止信号结束。但如果主机希望继续占用总线发送新的数据,不管是不是用一个从机,都可以不产生终止信号,直接产生新的起始信号并开始寻址和数据传输流程。
在总线的一次数据传输过程中可以有以下几种组合方式(蓝色表示主机控制SDA,白色表示从机):

(a)主机向从机发送数据,数据传送方向在整个传送过程中不变:
在这里插入图片描述
(b)主机从从机读取数据:
在这里插入图片描述
©在传送过程中,当需要改变传送方向时,起始信号和从机地址都被重复产生一次,但两次读/写方向位正好反相:
在这里插入图片描述

2.IIC的应用——M24C64 EEPROM芯片

这是一款基于IIC总线的存储芯片,64K,寻址位有3个,即可以为总线内的8块相同的芯片分配单独的地址。引脚和封装如下图:
杂七杂八的整理——STM32、Proteus使用、UART、IIC、SPI、LIN_第14张图片
这款芯片的读写规则大概如下:
有两种读写方式:按随机地址读取和按特定页读取,通过IIC的寻址字节的高四位来区分(低4位是3位芯片地址和一个IIC的读写控制位)。在IIC的寻址字节后紧跟着两个字节的片内地址,具体的使用方法可参考芯片手册,难度不大,不做详细介绍。手册下载:
https://download.csdn.net/download/weixin_42967006/12240815

三、SPI

SPI是同步串行全双工总线,速率通常比IIC要高,能达到几Mbit/s。
缺点:没有流控制,没有应答机制确认是否成功收到,这是跟IIC相比数据可靠性方面略差的一点。

1.协议

(1)物理层

以主从方式工作,这种模式通常有一个主设备和一个或多个从设备,双向通信需要至少4根线,单向通信至少3根线:
SDO/MOSI – 主设备数据输出,从设备数据输入;
SDI/MISO – 主设备数据输入,从设备数据输出;
SCLK – 时钟信号,由主设备产生,支持的最高通讯速率为fpclk/2,即所挂载引脚的速率的一半。如对STM32来说,SPI2挂载在APB1总线上,则其最高速率为36MHz / 2 = 18MHz;
CS/SS/NSS – 从设备使能信号,由主设备控制。高使能还是低使能根据具体从机的特性决定。下文默认为低电平使能。
常见拓扑:
杂七杂八的整理——STM32、Proteus使用、UART、IIC、SPI、LIN_第15张图片

(2)数据起始、停止信号、数据转换和采样

①处为起始信号,即片选信号线由高变低。从机检测到自己的NSS线电平被置低,则开始与主机通讯。
⑥处为停止信号,即片选信号线由低变高。;从机检测到自己的NSS线电平被置高,则停止通讯。
②④处为触发数据信号转换的时刻,③⑤处为数据采样时刻。这两个时间点可配置,见下文。
杂七杂八的整理——STM32、Proteus使用、UART、IIC、SPI、LIN_第16张图片

(3)通讯规则

MOSI和MISO线在SCK的每个时钟周期传输一位数据,开发者可以自行设置MSB或LSB先行,不过需要保证两个通讯设备都使用同样的协定。从上图看到,在SCK的上升沿和下降沿时进行触发和采样,但实际SPI有四种通讯模式,四种模式的主要区别便是总线空闲时SCK的状态及数据采样时刻。这涉及到“时钟极性CPOL”和“时钟相位CPHA”,由CPOL和CPHA的组合而产生了四种的通讯模式。主从机需要工作在相同的模式下才能正常通讯。
CPOL:即在没有数据传输时,时钟的空闲状态的电平。
CPHA:即数据的采样时刻。
规则:
CPOL=0,则SCK在空闲状态保持低电平,反之被置1则保持高电平;CPHA=0,则在SCK每个时钟周期的第1个边沿(奇数边沿)进行数据位采样,反之被置1则在SCK每个时钟周期的第2个边沿(偶数边沿)采样。
杂七杂八的整理——STM32、Proteus使用、UART、IIC、SPI、LIN_第17张图片
时序图如下图所示:
杂七杂八的整理——STM32、Proteus使用、UART、IIC、SPI、LIN_第18张图片
STM32中,可配置SPI的数据长度是8位或16位、MSB还是LSB、波特率(最高4M),还能计算CRC。

2.SPI的应用

一些EEPROM芯片或Flash存储芯片是用的SPI总线,例如Atmel公司的AT25010/020/040系列 EEPROM 芯片,能提供128/256/512字节的空间。具体使用方法就不做介绍了,用到的话可以查芯片手册,依据其中定义的指令和通讯时序发就好,使用方法都大同小异。芯片手册下载地址:
//download.csdn.net/download/weixin_42967006/12241313

下面着重介绍一下LCD屏ILI9341的使用。其实ILI9341是驱动芯片,为了方便就叫ILI9341屏了。9341支持SPI等多种通讯方式,先放两个资料,想更详细了解的朋友可以下载:

1.ILI9341官方使用手册,英文原版:
//download.csdn.net/download/weixin_42967006/12241373
2.ILI9341中文翻译手册,在网上找到的,翻译了对于开发较为有用的大部分内容,包括指令、通讯时序等,可供参考:
//download.csdn.net/download/weixin_42967006/12241382

(1)通讯模式选择

9341在使用SPI总线的时候有两种模式可选择,3线模式和4线模式,其实仔细分的话是下表中红框的4种,被IM0-3四个引脚控制。杂七杂八的整理——STM32、Proteus使用、UART、IIC、SPI、LIN_第19张图片
3线和4线比起来少了一个命令/数据控制线D/CX,所以3线制的数据场要为9bit,第一个bit即为D/CX的值。如下图所示。上面的一代SPI和下面的二代SPI的区别是一代用一条SDA线来传输数据,是半双工模式,二代输入输出分别用两根线SDI和SDO。
杂七杂八的整理——STM32、Proteus使用、UART、IIC、SPI、LIN_第20张图片
杂七杂八的整理——STM32、Proteus使用、UART、IIC、SPI、LIN_第21张图片

(2)通讯时序

以一代SPI通讯方式为例:
杂七杂八的整理——STM32、Proteus使用、UART、IIC、SPI、LIN_第22张图片
杂七杂八的整理——STM32、Proteus使用、UART、IIC、SPI、LIN_第23张图片

(3)命令

ILI9341使用手册的第8章列出了所有命令的格式和参数,以及D/CX的值。详情可参照数据手册。这里转载一篇文章,总结了几个常用的命令,可供参考:
https://blog.csdn.net/weixin_42341666/article/details/102078445

(4)驱动程序

在网上找了一些ILI9341相关的资料,有一套我觉得写得比较清晰明了的驱动程序,还有一些杂七杂八的资料,包括电路图、图片转换成可以显示的数据的软件、字符转数据的小软件等等。有需要的自己下载吧:
//download.csdn.net/download/weixin_42967006/12241575

你可能感兴趣的:(嵌入式,stm32,uart,spi,单片机)