APP下载

串行外设接口通信的实现

2021-07-02张小景

装备机械 2021年2期
关键词:发送数据参数设置空闲

□ 张小景

上海电气风电集团股份有限公司 上海 200233

1 研究背景

电能质量影响着整个电力系统的稳定运行。文献[1-4]详细介绍了电能质量测试方法,指出电能质量测试设备需要能够分析非常高频的数据,并且快速地传递出去,通信速率也需要非常快。一般设计采用数字信号处理(DSP)+32位进阶精简指令集机器(ARM)+现场可编程门阵列(FPGA)的设计思想,DSP负责数据计算处理,FPGA负责信息采样,ARM负责通信。分析10 kHz采样的三相电压和三相电流,通信速率需要高达960 kbit/s,如果再加上其它需要通信的数据,通信速率要更高,控制器局域网(CAN)、串行通信接口(SCI)等都不能满足稳定运行要求。当前,嵌入式处理器都配置了串行外设接口(SPI)。对于高速通信,采用SPI更合适,而且SPI的接线简单,只有四根。笔者通过设计,实现了SPI的通信。

2 SPI特点

(1) 接线简单。SPI只有四根通信线,包括从输出/主输入(SOMI)、从输入/主输出(SIMO)、片选、时钟。

(2) 两种工作模式。SPI支持主从通信,可通过参数将设备配置为主设备或从设备。

(3) 多速率配置。无论是DSP还是ARM,都支持多种速率设置。ARM的最高速率为主频率的1/2,DSP的最高速率为主频率的1/4。理论上,DSP芯片STM32F103速率可达36 Mbit/s,ARM芯片TMS320F28335速率可达37.5 Mbit/s。

(4) 可变数据帧长度。支持8位和16位两种数据长度配置。

(5) 四种时钟模式。四种时钟模式分别由时钟极性和时钟相位两个参数控制,两个参数共有四种组合。

(6) 同步通信。SPI作为同步串口通信,发出与接收同时进行,可以作为全双工模式运行。另外,DSP可配置为只接收模式,ARM可配置为只发送或只接收模式。

3 SPI工作模式

SPI作为同步串行通信,使用一个移位寄存器实现数据同步发送与接收。当主机MOSI移出一个位时,同步的从机MISO移入一个位。SPI通信原理如图1所示。

图1 SPI通信原理

设置数据长度为8位或16位,一个字节或两个字节就可以完成一次数据交换。DSP与ARM都可以通过修改参数,将设备设置为主模式运行或从模式运行。

(1) 主模式运行。如果配置为主模式,时钟信号和片选信号由主设备控制,从设备对这两个信号进行只读。当数据存入数据寄存器或输出缓冲寄存器时,启动MOSI线上的数据传送,同时通过MISO线接收一个位的数据。当8位或16位数据传送完成后,数据寄存器的值被放到接收缓冲寄存器中。

片选信号控制DSP的原理与ARM有所不同。对于DSP,在主设备发送数据时信号为0,直到8位或16位数据传送完成后,信号被置1。对于ARM,信号控制比较复杂,有硬件和软件两种模式,并且信号不能自动跳变,主模式运行时可以选择软件模式,信号作为普通输入/输出设置,数据发送过程中置0,数据发送完成后置1。

(2) 从模式运行。如果配置为从模式,时钟信号由主设备控制,从设备设置时钟信号无效。此时,DSP和ARM都由主设备控制,只有片选信号为0时,从设备才处于正常工作状态。ARM有软件和硬件两种模式,与DSP通信时,需选择硬件模式。

(3) 时序控制。SPI通信的时序控制通过两个参数得到四种组合,极性参数与相位参数代表的意义对于DSP、ARM而言有所不同。

DSP极性参数设置为1,代表下降沿输出,上升沿锁存,空闲状态为高电平。DSP极性参数设置为0,代表上升沿输出,下降沿锁存,空闲状态为低电平。ARM极性参数设置为1,代表下降沿输出,上升沿锁存,空闲状态为高电平。ARM极性参数设置为0,代表上升沿输出,下降沿锁存,空闲状态为低电平。

DSP相位参数设置为1,数据在跳变沿前半个周期发送或接收,时钟沿延迟半个周期。DSP相位参数设置为0,代表时钟沿不延迟。ARM相位参数设置为0,数据在跳变沿前半个周期发送或接收,时钟沿延迟半个周期。ARM相位参数设置为1,代表时钟沿不延迟。

在进行DSP与ARM的SPI通信时,一定要注意不同的微控制器参数设置意义不同。

4 SPI接口设计

SPI接口设计如图2所示。

图2 SPI接口设计

SPI作为板间通信,需要注意共地问题,只有板共地后才能保持电平一致,因此需要一根共地线。

SPI作为板间通信,尽量不要将片选信号直接接地,而是选择由主设备控制片选信号。ARM作为从机运行时,选择硬件模式。ARM作为主机运行时,片选信号设置为普通输入/输出、软件模式。

时钟信号由主设备控制,从设备设置时钟信号无效,直接对接时钟线。

数据线MISO、MOSI各自直接对接即可。

5 SPI算法设计

DSP主程序如下:

int main(void)

{

InitSystemCtrl();

InitSpiGpio();

DINT;

spi_fifo_init();

spi_init();

for(;;){

SpiaRegs.SPITXBUF=0xF00F;∥数据赋值给输出寄存器,开始数据传输

while(SpiaRegs.SPIFFRX.bit.RXFFST!=1){}

rdata=SpiaRegs.SPIRXBUF;}∥读接收寄存器

}

SPI参数设置程序如下:

void spi_init()

{

SpiaRegs.SPICCR.all=0x004F;∥16位数据

SpiaRegs.SPICTL.all=0x0006;∥主模式,时钟信号不延迟

SpiaRegs.SPIBRR=0x0002;∥传输速率设置

SpiaRegs.SPICCR.call=0x008F;∥上升沿输出,下降沿锁存,空闲为低电压

SpiaRegs.SPIPRI.bit.FREE=1;

}

ARM主程序如下:

int main(void)

{

RCC_Configuration();∥配置时钟

GPIO_Configuration();∥配置输入/输出

SPI_Configuration();∥SPI 参数设置

while(1)

{b= SPI_ReceiveData();∥接收数据

SPI_SendData(b);∥发送数据

}

}

SPI 参数设置程序如下:

void SPI_Configuration(void)

{

SPI_InitTypeDef SPI_InitStructure;

∥配置SPI

SPI_InitStructure.SPI_Direction=SPI_Direction_2Lines_FullDuplex;∥全双工模式

SPI_InitStructure.SPI_DataSize=SPI_DataSize_16b;∥16位数据

SPI_InitStructure.SPI_CPOL=SPI_CPOL_Low;∥上升沿发送数据

SPI_InitStructure.SPI_CPHA=SPI_CPHA_1Edge;∥时钟不延迟

SPI_InitStructure.SPI_NSS=SPI_NSS_Hard;∥片选信号为硬件模式

SPI_InitStructure.SPI_BaudRatePrescaler=SPI_BaudRatePrescaler_256;∥通信速率设置,从设备无效

SPI_InitStructure.SPI_FirstBit=SPI_FirstBit_MSB;∥高位先发送

SPI_InitStructure.SPI_CRCPolynomial=7;

SPI_InitStructure.SPI_Mode=SPI_Mode_Slave;∥从模式

SPI_Init(SPI1,&SPI_InitStructure);

SPI_Cmd(SPI1,ENABLE);

SPI_I2S_ClearITPendingBit(SPI1,SPI_I2S_IT_RXNE);

}

SPI作为从机发送数据程序如下:

void SPI_SendData(u16 byte)

{

while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_TXE)==RESET);

SPI_I2S_SendData(SPI1,byte);}

SPI作为从机接收数据程序如下:

u16 SPI_ReceiveData(void)

{ u16 data;

while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_RXNE)==RESET);

data=SPI_I2S_ReceiveData(SPI1);

return data;}

6 过程调试

DSP不同极性与相位时序控制如图3~图6所示。

由图3~图6分析可知,DSP极性参数为1,空闲时为高电平,下降沿开始发送数据;DSP极性参数为0,空闲时为低电平,上升沿开始发送数据;DSP相位参数为0,空闲时为低电平,数据信号与时钟信号没有时间差;DSP相位参数为1,空闲时为高电平,数据信号超前时钟信号半个周期。

图3 DSP极性参数为0、相位参数为0时序控制

图4 DSP极性参数为0、相位参数为1时序控制

图5 DSP极性参数为1、相位参数为0时序控制

图6 DSP极性参数为1、相位参数为1时序控制

ARM不同极性与相位时序控制如图7~图10所示。

由图7~图10分析可知,ARM极性参数为1,空闲时为高电平,下降沿开始发送数据;ARM极性参数为0,空闲时为低电平,上升沿开始发送数据;ARM相位参数为1,空闲时为低电平,数据信号与时钟信号没有时间差;ARM相位参数为0,空闲时为高电平,数据信号超前时钟信号半个周期。

图7 ARM极性参数为0、相位参数为0时序控制

图8 ARM极性参数为0、相位参数为1时序控制

图9 ARM极性参数为1、相位参数为0时序控制

图10 ARM极性参数为1、相位参数为1时序控制

ARM与DSP没有共地情况下的时序控制如图11所示。

图11 DSP与ARM无共地时序控制

ARM与DSP极性不一致,相位参数均为0情况下的时序控制如图12所示。

ARM与DSP相位不一致,极性参数均为0情况下的时序控制如图13所示。

图13 DSP相位参数为0、ARM相位参数为1时序控制

ARM与DSP极性、相位参数均为0情况下的时序控制如图14所示。

图14 ARM与DSP极性参数为0、相位参数为0时序控制

7 调试小结

ARM相位参数为1,DSP相位参数为0的时序控制与ARM、DSP相位参数均为0的时序控制是一致的,作为两种芯片通信时,只要极性一致,相位一致与否接收数据都没有问题。另一方面,ARM与DSP相位不一致,没有出现空闲时电压跳变的情况,由此笔者选择此种模式。当然,板间通信必须共地,否则信号电压不稳定。

8 结束语

SPI作为常用的串口通信接口,接线简单、通信速率高,非常适用于大量数据的传输。笔者对电能质量测试设备开发项目中SPI通信的算法设计、接口设计、参数设置等进行了介绍,可以为其它类似工程提供技术参考。

猜你喜欢

发送数据参数设置空闲
“鸟”字谜
西湾村采风
一种车载自组织网络的媒体接入控制协议
基于马尔科夫链的LoRaWAN网络节点性能分析
带标记方式的CRDSA++协议性能分析*
彪悍的“宠”生,不需要解释
逃生疏散模拟软件应用
使用IPSec安全传输数据
蚁群算法求解TSP中的参数设置
WLAN和LTE交通规则