一、概述
基于 N32G455 和 JW3376 的 BMS 方案采用国民技术的 N32G455REL7 作为主控,本文主要介绍了关于 SPI 的配置及使用。
首先介绍一下 N32G455REL7 这颗芯片,该芯片采用了 32bit ARM Cortex-M4F 内核,支持浮点运算和 DSP 指令,最高主频可达 144MHz,集成了 512KB Flash 和 144KB SRAM,具有 4 路 12bit 5Msps ADC、3 个 SPI、7 个 U(S)ART、4 个I2C、1 个 USB2.0、2 个 CAN 2.0 等外设,N32G455 的框图如图 1 所示。
图 1 N32G455 框图
二、 SPI 简介
SPI 是串行外设接口(Serial Peripheral Interface)的缩写,是一种高速、全双工、同步通信的通讯总线。
1、 SPI 引脚描述:
① MOSI:当配置为主机时,该引脚用于发送数据给从机;当配置为从机时,该引脚从主机接收数据。
② MISO:当配置为主机时,该引脚用于从从机中接收数据;当配置为从机时,该引脚用于发送数据给主机。
③ SCLK:串行时钟引脚,由主机产生。
④ NSS:从机片选信号,由主机控制。
2、 SPI 起始和停止信号:
SPI 通讯的起始和停止信号是通过 NSS 信号线进行控制的,当 NSS 拉低时作为起始信号,当 NSS 拉高时作为停止信号。
3、 SPI 通讯模式:
SPI 共有 4 种通讯模式,它们的区别主要是总线空闲时时钟线的状态以及数据的采样时刻。通过配置 CPOL 和 CPHA 即可完成模式设置。
CPOL 为时钟极性,用于决定总线在空闲时是高电平还是低电平。当 CPOL=0 时,SCLK 信号线在空闲时为低电平;当 CPOL=1 时,SCLK 信号线在空闲时为高电平。
CPHA 为时钟相位,用于决定何时进行信号采样。当 CPHA=0 时,在 SCLK 信号线的奇数跳变沿进行采样;当 CPHA=1 时,在 SCLK 信号线的偶数跳变沿进行采样。
① SPI 模式 0:CPOL=0,CPHA=0,总线空闲时,SCLK 引脚将保持低电平,数据将在奇数跳变沿被采样,即上升沿,如图 2 所示。
图 2
图 3
图 4
图 5
1、 使能 SPI 和 IO 口对应的时钟:RCC_AHBxPeriphClockCmd()/RCC_APBxPeriphClockCmd();
2、 初始化 IO 口;3、 初始化 SPI 结构体:
typedef struct
{
uint16_t DataDirection;
uint16_t SpiMode;
uint16_t DataLen;
uint16_t CLKPOL;
uint16_t CLKPHA;
uint16_t NSS;
uint16_t BaudRatePres;
uint16_t FirstBit;
uint16_t CRCPoly;
} SPI_InitType;
① DataDirection:用于设置 SPI 的单双向模式。② SpiMode:用于设置 SPI 的主/从机模式。
③ DataLen:用于设置 SPI 的数据帧长度,可选 8/16 位。
④ CLKPOL:用于设置时钟极性 CPOL,可选高/低电平。
⑤ CLKPHA:用于设置时钟相位 CPHA,可选奇/偶数边沿采样。
⑥ NSS:用于设置 NSS 引脚是通过 SPI 硬件控制还是软件控制。
⑦ BaudRatePres:设置时钟分频因子,fpclk/分频数=fsck。
⑧ FirstBit:设置 MSB/LSB 先行。
⑨ CRCPoly:设置 CRC 校验的表达式。
4、初始化SPI:SPI_Init();
5、使能SPI:SPI_Enable();
四、数据的发送与接收:
SPI 通讯过程中,为保证数据能够被正常发送和接收,在进行数据的发送或接收之前需确保上一次的数据是否已经发送或读取完成,因此需通过 SPI_I2S_GetStatus 函数对相关标志位进行检测。
SPI_I2S_GetStatus:用于获取 SPI_STS 寄存器的发送缓存空标志位 TE、接收缓存非空标志位 RNE、忙标志位 BUSY 等的状态。当 TE=1 时,表示新数据可以写进 SPI_DAT 寄存器;当发送缓存为空时,TE=0。当 RNE=1 时,表示有效数据已接收到缓存中;当读取 SPI_DAT 寄存器,RNE 标志位清零。当传输开始时,BUSY 位置 1;当传输结束后,BUSY 标志位硬件清零。
① 数据发送:发送数据前需通过 SPI_I2S_GetStatus 函数检测 TE 标志位是否为 1 ,即需等待 SPI_DAT 寄存器为空时,再将所要发送的数据通过 SPI_I2S_TransmitData 函数写入 SPI_DAT 寄存器中,进行数据的发送。
② 数据接收:在读取一个字节的数据前需先发送一个字节的数据,由于从机无法产生时钟信号,故读取前先发送一个字节的目的是为了产生时钟信号,以便于数据的正常接收。先发送完一个字节后,需通过 SPI_I2S_GetStatus 函数检测 RNE 标志位是否为 1,即当 SPI_DAT 寄存器为非空时,再通过 SPI_I2S_ReceiveData 函数读取所接收到的数据。
五、总结本文主要介绍了 N32G455 SPI 及其配置和使用方法,要想主从机能够正常进行 SPI 通讯,确保其时序的正确性是非常重要的,主机需配置成与从机相同的通讯模式,并根据从机的时序要求来进行通讯。
六、参考文档- 《UM_N32G45x 系列用户手册 V3.0》
- Nationstech.N32G45x_Library.2.1.0
评论