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;
}
|