#include "spi.h" //************************* // SPI1 Initation // //************************* void SPI1_Init() //SPI1初始化 { GPIO_InitTypeDef GPIO_InitStructure; SPI_InitTypeDef SPI_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_SPI1|RCC_APB2Periph_AFIO, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7; //PA5 PA6 PA7 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_SetBits(GPIOA,GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7); //拉高 SPI_InitStructure.SPI_Direction=SPI_Direction_2Lines_FullDuplex; // SPI 设置为双线双向全双工 SPI_InitStructure.SPI_Mode=SPI_Mode_Master; //设置SPI为主模式 SPI_InitStructure.SPI_DataSize=SPI_DataSize_8b; //设置SPI数据大小为8位 SPI_InitStructure.SPI_CPOL=SPI_CPOL_Low; //设置SPI默认时钟悬空为高电平 SPI_InitStructure.SPI_CPHA=SPI_CPHA_1Edge; //设置SPI数据捕获在第二个时钟沿 SPI_InitStructure.SPI_NSS=SPI_NSS_Soft; //设置SPI NSS管脚由软件管理 SPI_InitStructure.SPI_BaudRatePrescaler=SPI_BaudRatePrescaler_16; //设置SPI 波特率预分频值为 256 SPI_InitStructure.SPI_FirstBit=SPI_FirstBit_MSB; //设置SPI 数据从高位传输 SPI_InitStructure.SPI_CRCPolynomial=7; //设置SPI CRC值计算的多项式 SPI_Init(SPI1,&SPI_InitStructure); SPI_Cmd(SPI1,ENABLE); //使能SPI1 } //************************* // SPI2 // //************************* void SPI2_Init() //SPI2初始化 { GPIO_InitTypeDef GPIO_InitStructure; SPI_InitTypeDef SPI_InitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);//打开SPI2时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15; //PB13 PB14 PB15 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz GPIO_Init(GPIOB, &GPIO_InitStructure); GPIO_SetBits(GPIOB,GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15); //拉高 SPI_InitStructure.SPI_Direction=SPI_Direction_2Lines_FullDuplex; // SPI 设置为双线双向全双工 SPI_InitStructure.SPI_Mode=SPI_Mode_Master; //设置SPI为主模式 SPI_InitStructure.SPI_DataSize=SPI_DataSize_8b; //设置SPI数据大小为8位 SPI_InitStructure.SPI_CPOL=SPI_CPOL_Low; //设置SPI默认时钟悬空为高电平 SPI_InitStructure.SPI_CPHA=SPI_CPHA_1Edge; //设置SPI数据捕获在第二个时钟沿 SPI_InitStructure.SPI_NSS=SPI_NSS_Soft; //设置SPI NSS管脚由软件管理 SPI_InitStructure.SPI_BaudRatePrescaler=SPI_BaudRatePrescaler_16; //设置SPI 波特率预分频值为 256 SPI_InitStructure.SPI_FirstBit=SPI_FirstBit_MSB; //设置SPI 数据从高位传输 SPI_InitStructure.SPI_CRCPolynomial=7; //设置SPI CRC值计算的多项式 SPI_Init(SPI2,&SPI_InitStructure); SPI_Cmd(SPI2,ENABLE); //使能SPI2 } //---------------------------------------------------------------- // SPI读写一个字节 // u8 SPI_ReadWriteByte(SPIType spiNum,u8 dat) //SPI2读写一个字节 { u8 t; u8 temp8; if(spiNum == SPI_PORT1){ while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_TXE)==RESET) //等待发送缓存器空 { t++; if(t>=200)return 0; //超时返回错误标志 } SPI_I2S_SendData(SPI1,dat); //发送数据 t=0; while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_RXNE)==RESET) //等待接收 { t++; if(t>=200)return 0; //超时返回错误标志 } temp8 = SPI_I2S_ReceiveData(SPI1); //返回最近SPI1接收的数据 }else{ while(SPI_I2S_GetFlagStatus(SPI2,SPI_I2S_FLAG_TXE)==RESET) //等待发送缓存器空 { t++; if(t>=200)return 0; //超时返回错误标志 } SPI_I2S_SendData(SPI2,dat); //发送数据 t=0; while(SPI_I2S_GetFlagStatus(SPI2,SPI_I2S_FLAG_RXNE)==RESET) //等待接收 { t++; if(t>=200)return 0; //超时返回错误标志 } temp8 = SPI_I2S_ReceiveData(SPI2); //返回最近SPI2接收的数据 } return temp8; } void SPI_SetSpeed(SPIType spiNum,u8 SPI_BaudRatePrescaler) //设置SPI2的速度 { assert_param(IS_SPI_BAUDRATE_PRESCALER(SPI_BaudRatePrescaler)); if(spiNum == SPI_PORT1){ SPI1->CR1&=0XFFC7; //修改BR[2:0]值 SPI1->CR1|=SPI_BaudRatePrescaler; //设置SPI1速度 SPI_Cmd(SPI2,ENABLE); }else{ SPI2->CR1&=0XFFC7; //修改BR[2:0]值 SPI2->CR1|=SPI_BaudRatePrescaler; //设置SPI2速度 SPI_Cmd(SPI2,ENABLE); } }