spi.c
该文件在SPI的GPIO设置初始化中运用了HAL库,其他设置用寄存器,特别是函数编写部分。-
- #include "spi.h"
-
-
- /**
- * [url=home.php?mod=space&uid=247401]@brief[/url] SPI接口初始化
- * @param 无
- * @retval 无
- */
- void SPI2_Init(void)
- {
-
- GPIO_InitTypeDef SPI2_Init_Struct;
-
- /* 使能时钟 */
- SPI_CLK_ENABLE();
- SPI_SCK_GPIO_CLK_ENABLE();
- SPI_SDA_GPIO_CLK_ENABLE();
-
- /* 初始化SCK引脚 */
- SPI2_Init_Struct.Pin = SPI_SCK_GPIO_PIN;
- SPI2_Init_Struct.Mode = GPIO_MODE_AF_PP;
- SPI2_Init_Struct.Pull = GPIO_PULLUP;
- SPI2_Init_Struct.Speed = GPIO_SPEED_FREQ_HIGH;
- HAL_GPIO_Init(SPI_SCK_GPIO_PORT, &SPI2_Init_Struct);
-
- /* 初始化SDA引脚 */
- SPI2_Init_Struct.Pin = SPI_SDA_GPIO_PIN;
- SPI2_Init_Struct.Mode = GPIO_MODE_AF_PP;
- SPI2_Init_Struct.Pull = GPIO_PULLUP;
- SPI2_Init_Struct.Speed = GPIO_SPEED_FREQ_HIGH;
- HAL_GPIO_Init(SPI_SDA_GPIO_PORT, &SPI2_Init_Struct);
-
-
- RCC->APB1RSTR|=1<<14; //复位SPI2
- RCC->APB1RSTR&=~(1<<14);//停止复位SPI2
-
- SPI2->CR1|=0<<10;//全双工模式
- SPI2->CR1|=1<<9; //软件nss管理
- SPI2->CR1|=1<<8;
-
- SPI2->CR1|=1<<2; //SPI主机
- SPI2->CR1|=0<<11;//8bit数据格式
- SPI2->CR1|=1<<1; //空闲模式下SCK为1 CPOL=1
- SPI2->CR1|=1<<0; //数据采样从第二个时间边沿开始,CPHA=1
- SPI2->CR1|=7<<3; //Fsck=Fcpu/256
- SPI2->CR1|=0<<7; //MSBfirst
- SPI2->CR1|=1<<6; //SPI设备使能
- SPI2->I2SCFGR&=~(1<<11);//选择SPI模式
- SPI2_ReadWriteByte(0xff);//启动传输(主要作用:维持MOSI为高)
-
- }
-
- void SPI2_SetSpeed(u8 SpeedSet)
- {
- SpeedSet&=0X07; //限制范围
- SPI2->CR1&=0XFFC7;
- SPI2->CR1|=SpeedSet<<3; //设置SPI2速度
- SPI2->CR1|=1<<6; //SPI设备使能
- }
-
-
-
- u8 SPI2_WriteData(u8 *TxData, u16 size)
- {
-
- u16 i=0;
-
- for(i=0;i<size;i++)
- {
- SPI2->DR=TxData[i];
- while((SPI2->SR&1<<1)==0); //等待发送区空
- }
-
- return 1;
- }
|