1 协议
通信协议一般分为两个类型:同步和异步
其中通过CLK时钟线进行通信的叫做同步通信,通过波特率进行定时采样的叫异步通信。
串口和CAN属于异步通信,SPI和 IIC属于同步通信。
1.1串口协议
串口协议通过两条线来实现,一条TX,一条RX,两条线分别用于收发,可同时进行传输。故属于全双工的通信。
在默认状态下数据线上处于高电平,当数据传输时先发送一个起始信号,起始信号为一个低电平,后面连续接着8位数据位(可配置,可选678三种位数发送)后接一个奇偶校验位,再加上一位的停止位构成。为了保证数据的准确性,选择在电平的1/2处读取数据,可以减小误差。
1.2IIC协议
IIC协议属于串行的同步传输协议,支持一主多从模式。故在进行通信时需要先对从机进行选择,通过定义地址的方法得到。IIC由两条线构成,分别为SDA和SCL,其中SDA用于传输数据,SCL用于传输同步时钟信号。故IIC是一个半双工的传输协议(可双向传输,不可同时传输)。
在进行数据传输时,SCL为高电平的同时,SDA拉低电平表示起始信号。在CLK的上升沿时间,对SDA进行采样。故需要在传输过程中拉高时钟线,再延时一段时间。在SCL为高期间SDA由低转高表示结束信号。由时序可知,在SCL为高时,SDA传输的数据不可改变。
在主机向从机发送数据时,主机会要求从机进行应答。时序如下。
总线冲突时,按“低电平优先”的仲裁原则(地一定是地,高不一定是高),把总线判给在数据线上先发送低电平的主器件;
在特殊情况下,若需禁止所有发生在I2C总线上的通信,可采用封锁或关闭总线,具体操作为在总线上的任一器件将SCL锁定在低电平即可;
SDA仲裁和SCL时钟同步处理过程没有先后关系,而是同时进行的。
1.3SPI协议
SPI协议由四条线组成线组成,SCK,NSS,miso和mosi四条线。其中MISO和MOSI用于数据传输,NSS用于片选。SPI支持多主多从的传输方式。
SPI有四种工作模式
CPOL:SPI空闲的时钟信号电平。(1:高电平,0:低电平)
CPHA:SPI在时钟的第几个边沿采样。(1:第二个边沿开始,0:第一个边沿开始)
2 模块代码
四条线 SCK时钟线,MOSI主机输出端,MISO从机输出端,NSS片选线(低电平有效)
通信顺序为主-》从然后进行从-》主,步骤不可省略,时钟极性可以选择
原理:主要是在sck的控制下,两个双向移位寄存器进行数据交换。上升沿发送、下降沿接收、高位先发送。
2.1串口模块
S32K144具有3个串口资源。
使用前,使能对应的口
编写变量名,选择和开发板对应的device
选择传输方式,这里采用了中断传输,(也可以选用DMA传输)配置波特率
串口的发送接收有几个不同的函数,在函数定义区有概述,观者可以自行查看。
我们本次采用阻塞的方式进行接收和查询。阻塞接收存在较大的问题,CPU使用率会大幅度降低。故在选择几种方式时应结合业务逻辑选择。
在程序中,需要先初始化时钟和引脚,延时函数。再进行串口初始化,接下来就可以正常使用串口了。
CLOCK_SYS_Init(g_clockManConfigsArr, CLOCK_MANAGER_CONFIG_CNT,
g_clockManCallbacksArr, CLOCK_MANAGER_CALLBACK_CNT);
CLOCK_SYS_UpdateConfiguration(0U, CLOCK_MANAGER_POLICY_AGREEMENT);
PINS_DRV_Init(NUM_OF_CONFIGURED_PINS, g_pin_mux_InitConfigArr);
s32_systick_init();
LPUART_DRV_Init(INST_LPUART1, &lpuart1_State, &lpuart1_InitConfig0);
请注意:如果采用中断的方式进行数据接收,需要注册和使能回调函数。
2.2IIC模块
S32K144具有一个IIC资源,和串口一样,使用前编辑变量名,选择使用IIC0
对IIC进行进行配置,设置模式选择配置master模式,我们这里使用IIC只作为主机使用。
和串口一样,只需要初始化它,便可以正常使用。值得注意的是,IIC在通信时,必须等待ACK,故不接从设备,IIC无法正常通信。
笔者就不在这赘述,需要读者好生练习,自己动手,才能更快的提升自己。
如需详细叙述,可以留言,笔者可以给出详细配置过程、代码。
2.3SPI模块
S32k144有三个SPI资源。和之前的两个模块配置方法如出一辙,笔者就不再赘述。
如需详细叙述,可以留言,私信笔者可以给出详细配置过程、代码。
3 协议总结和思考
3.1总结
本篇讲述了常见的通信协议,概述了同步异步通信的区别。
SPI、IIC和UART是三种常见的串行通信协议。
SPI(Serial Peripheral Interface)是一种高速、全双工、同步的串行通信协议,用于连接微控制器和外设,比如闪存、传感器、LCD显示器等。SPI协议使用至少4根线(时钟线、数据输入线、数据输出线、从设备选择线),能够实现高速数据传输和多设备通信。
IIC(Inter-Integrated Circuit)也称为TWI(Two-Wire Interface),是一种全双工、同步的串行通信协议,用于连接微控制器和多种外部设备,比如温度传感器、加速度计、电子罗盘等。IIC协议只使用两根线(数据线、时钟线),可以实现多个设备之间的简单通信。
UART(Universal Asynchronous Receiver/Transmitter)是一种异步串行通信协议,用于将数据传输到计算机或其他设备。UART协议使用至少2根线(数据线、时钟线),支持双向数据传输。
下面是SPI、IIC和UART的简单对比:
| | SPI | IIC | UART |
| --- | --- | --- | --- |
| 线数 | 4根或更多 | 2根或更多 | 2根或更多 |
| 传输速度 | 高 | 较高 | 低 |
| 多设备通信 | 支持 | 支持 | 不支持 |
| 数据传输方式 | 全双工 | 全双工 | 半双工或全双工 |
| 数据帧结构 | 无 | 地址+数据 | 起始位+数据+校验位+停止位 |
| 软件复杂度 | 中等 | 中等 | 低 |
需要根据具体应用场景选择合适的串行通信协议。例如,SPI适合需要高速数据传输和多设备通信的应用;IIC适合连接多种低速外设;UART适合需要简单的串行通信的应用。
3.2思考
笔者讲述了三个协议原理,以及浅显的仲裁机制。对于IIC的仲裁机制,希望读者深入了解一番。如若学习CAN,也会变得得心应手。对于串口协议,笔者希望读者深入思考一下,怎么才能确定数据传输的稳定、精准性。学习一下CAN消除误差的原理,设计一个更准确的串口协议。