SWM32系列教程8--SPI及其應(yīng)用
SPI接口是非常常用的一種數(shù)字外設(shè),SWM32S單片機有2個SPI接口,其特點如下:
- 全雙工串行同步收發(fā)
- 可編程時鐘極性和相位
- 支持 MASTER 模式和 SLAVE 模式
- MASTER 模式下最高傳輸速度支持主時鐘 4 分頻
- 數(shù)據(jù)寬度支持 4BIT 至 16BIT
- 具備深度為 8 的接收和發(fā)送 FIFO
基本功能都有,中規(guī)中矩,8字節(jié)的收發(fā)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和端口映射部分的教程:
SWM32系列教程3-時鐘配置和GPIO
SWM32系列教程4-端口映射及串口應(yīng)用
SPI配置
端口配置完后需要配置SPI的一些參數(shù),與大部分單片機的方式差不多,程序如下:
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結(jié)構(gòu)體的定義如下:
typedef struct { uint8_t FrameFormat; //幀格式:SPI_FORMAT_SPI、SPI_FORMAT_TI_SSI uint8_t SampleEdge; //在SPI幀格式下,選擇數(shù)據(jù)采樣邊沿:SPI_FIRST_EDGE、SPI_SECOND_EDGE uint8_t IdleLevel; //在SPI幀格式下,選擇空閑時(無數(shù)據(jù)傳輸時)時鐘線的電平: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; //發(fā)送FIFO 空中斷使能 uint8_t TXCompleteIEn; //發(fā)送FIFO 空且發(fā)送移位寄存器空中斷使能} SPI_InitStructure;
- 接收FIFO半滿中斷使能
- 發(fā)送FIFO空中斷
- 發(fā)送完成(即FIFO空且發(fā)送移位寄存器空)中斷
SPI一般在傳輸大量數(shù)據(jù)時才會使用中斷。由于SPI其本身接口速率就比較高,在傳輸少量數(shù)據(jù)時,頻繁中斷不會提高多少效率。
SPI讀寫數(shù)據(jù)時,直接調(diào)用下面這個庫函數(shù)即可:
uint32_t SPI_ReadWrite(SPI_TypeDef * SPIx, uint32_t data){ SPIx->DATA = data; while(!(SPIx->STAT & SPI_STAT_RFNE_Msk)); return SPIx->DATA;}