控制/MCU
SPI接口是非常常用的一种数字外设,SWM32S单片机有2个SPI接口,其特点如下:
基本功能都有,中规中矩,8字节的收发FIFO算是一个亮点。
端口配置
配置SPI之前,首先要配置一下端口,这里使用P22作为CS引脚, P23为SCLK引脚,P18为MOSI引脚,P19为MISO。程序如下,
GPIO_Init(GPIOP, PIN22, 1, 0, 0);//SPI_CS
PORT_Init(PORTP, PIN23, FUNMUX1_SPI0_SCLK, 0);
PORT_Init(PORTP, PIN18, FUNMUX0_SPI0_MOSI, 0);
PORT_Init(PORTP, PIN19, FUNMUX1_SPI0_MISO, 1);
该单片机的端口映射相对比较灵活,具体介绍可参考GPIO和端口映射部分的教程:
SPI配置
端口配置完后需要配置SPI的一些参数,与大部分单片机的方式差不多,程序如下:
SPI_InitStructure SPI_initStruct;
SPI_initStruct.clkDiv = SPI_CLKDIV_8;
SPI_initStruct.FrameFormat = SPI_FORMAT_SPI;
SPI_initStruct.SampleEdge = SPI_FIRST_EDGE;
SPI_initStruct.IdleLevel = SPI_LOW_LEVEL;
SPI_initStruct.WordSize = 8;
SPI_initStruct.Master = 1;
SPI_initStruct.RXHFullIEn = 0;
SPI_initStruct.TXEmptyIEn = 0;
SPI_initStruct.TXCompleteIEn = 0;
SPI_Init(SPI0, &SPI_initStruct);
SPI_Open(SPI0);
SPI结构体的定义如下:
typedef struct {
uint8_t FrameFormat; //帧格式:SPI_FORMAT_SPI、SPI_FORMAT_TI_SSI
uint8_t SampleEdge; //在SPI帧格式下,选择数据采样边沿:SPI_FIRST_EDGE、SPI_SECOND_EDGE
uint8_t IdleLevel; //在SPI帧格式下,选择空闲时(无数据传输时)时钟线的电平:SPI_LOW_LEVEL、SPI_HIGH_LEVEL
uint8_t WordSize; //字长度, 有效值4-16
uint8_t Master; //1 主机模式 0 从机模式
uint8_t clkDiv; //SPI_CLK = SYS_CLK / clkDiv,有效值:SPI_CLKDIV_4、SPI_CLKDIV_8、... ... 、SPI_CLKDIV_512
uint8_t RXHFullIEn; //接收FIFO半满中断使能
uint8_t TXEmptyIEn; //发送FIFO 空中断使能
uint8_t TXCompleteIEn; //发送FIFO 空且发送移位寄存器空中断使能
} SPI_InitStructure;
可以看到,这里有三个中断源:
uint32_t SPI_ReadWrite(SPI_TypeDef * SPIx, uint32_t data)
{
SPIx->DATA = data;
while(!(SPIx->STAT & SPI_STAT_RFNE_Msk));
return SPIx->DATA;
}
下面这个例程是SPI读写W25Qxx的程序,仅供参考。
链接:https://pan.baidu.com/s/1b-6IK8_Zx8qqrWcylMc0RQ?pwd=bscu
提取码:bscu
全部0条评论
快来发表一下你的评论吧 !