串行外设接口通信的实现
2021-07-02张小景
□ 张小景
上海电气风电集团股份有限公司 上海 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通信的算法设计、接口设计、参数设置等进行了介绍,可以为其它类似工程提供技术参考。