STM8L051x SPI作为Master 使用
在这里我使用STM8L051x SPI作为Master,ads1293作为slave,使两者进行通信。
1、查看STM8L051x 的datasheet 中SPI的master模块介绍如下:
时钟相位如下:
查看ads1293 的datasheet中SPI 介绍如下:
由STM8L051x 与ads1293 的SPI 的介绍,我们可以得出ads1293在时钟为低电平时的第一个上升沿传输与获取数据,所以时钟相位都分别设置为SPI_CPOL_Low、SPI_CPHA_1Edge。
2、对于STM8L051x 中的SPI 作为 master来说,我们只需要配置好输入引脚(SDI)、输出引脚(SDO)、时钟引脚(SCK)和 片选引脚(SE) 就可以了,其它的可以不用配置。SPI初始化过程如下:(以SPI1为例)
a、使能SPI外设时钟:
voidCLK_PeripheralClockConfig(CLK_Peripheral_TypeDef CLK_Peripheral,FunctionalState NewState)
b、初始化各个引脚
voidGPIO_Init(GPIO_TypeDef* GPIOx, uint8_t GPIO_Pin, GPIO_Mode_TypeDef GPIO_Mode)
输入引脚(MISO)配置为 input 模式
其它的引脚(MOSI、SCK、SE)配置为 output 模式
c、删除之前加载的SPI1
voidSPI_DeInit(SPI_TypeDef* SPIx)
d、初始化SPI
void SPI_Init(SPI_TypeDef* SPIx, SPI_FirstBit_TypeDef SPI_FirstBit,
SPI_BaudRatePrescaler_TypeDefSPI_BaudRatePrescaler,
SPI_Mode_TypeDef SPI_Mode,SPI_CPOL_TypeDef SPI_CPOL,
SPI_CPHA_TypeDef SPI_CPHA,SPI_DirectionMode_TypeDef SPI_Data_Direction,
SPI_NSS_TypeDefSPI_Slave_Management, uint8_t CRCPolynomial)
参数1:SPI 号
参数2:大小端模式
参数3:时钟分频系数(频率)
参数4:主从模式
参数5:CPOL 时钟
参数6:CPHA 相位
参数7:数据模式
参数8:片选(SE)软件控制模式使能
参数9:CRC
e、使能SPI命令
voidSPI_Cmd(SPI_TypeDef* SPIx, FunctionalState NewState)
f、使能中断
enableInterrupts()
我选择GPIOB组的pin脚4、5、6、7分别来作为SPI1的SE、SCK、SDI、SDO脚,初始化接口如下:
3、SPI的读写操作
a、由ADS1293 、STM8L51x的datasheet 中的SPI说明部分得知SE脚拉低时读写数据,拉高时空闲,而且每往TX写一个byte的同时RX接收到一个byte,所以往TX写一个数据后,等待读标志位,然后去读RX的数据,以清除标志位。
b、ADS1293 的SPI 在读写数据时是按照地址的最高位来判断是读还是写:最高位为1时,表示读寄存器,最高位为0时,表示写寄存器。
c、读寄存器时,先写地址,然后在写一个无效的值,然后在读出数据。
所以都写接口分别如下:
先定义两个读写宏:
读接口:
写接口:
到此,STM8L51x +ads1293 的SPI通信接口实现完毕,接下来就是测试,
最简单的测试方式就是在main函数里面写某个寄存器,然后再去读出该寄存器的出来,看看是否是写进去的值。
还有一种方式就是利用UART来实现动态修改测试。
以上接口经过测试,测试通信完全正确,而且我也实现了UART 动态测试接口。