You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
incubator_embeded/HARDWARE/MYSPI.c

68 lines
3.2 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#include "MYSPI.h"
//SPI2初始化函数配置成主机模式访问W25Q128//
void SPI1_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure; //GPIO初始化结构体选择SPI2对应PB12PB13PB14PB15//
SPI_InitTypeDef SPI_InitStructure; //SPI初始化结构体//
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE ); //GPIOB时钟使能//
RCC_APB2PeriphClockCmd( RCC_APB2Periph_SPI1, ENABLE ); //SPI2时钟使能//
//初始化GPIOBPB13/14/15都设置复用推挽输出PB14对应MISO最好设为带上拉输入//
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_SetBits(GPIOA,GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7); //PB13/14/15置高电平//
//初始化SPI函数//
//设置SPI单向或者双向的数据模式:SPI设置为双线双向全双工//
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
//针对SPI_CR1寄存器的SSI位和MSTR为均设置1即SPI工作模式为主SPI//
SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
//针对SPI_CR1寄存器的DFF位设置数据帧大小为8位//
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
//针对SPI_CR1寄存器的CPOL位串行同步时钟的空闲状态为高电平//
SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;
//针对SPI_CR1寄存器的CPHA位串行同步时钟的第二个跳变沿上升沿数据被采样//
SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
//针对SPI_CR1寄存器的SSM位NSS信号由软件使用SSI位管理//
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
//针对SPI_CR1寄存器的BR位波特率预分频值为256//
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;
//针对SPI_CR1寄存器的LSBFIRST位数据传输从MSB位开始//
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
//针对SPI_CRCPR寄存器的CRCPOLY位设为0x0007为复位值//
SPI_InitStructure.SPI_CRCPolynomial = 7;
SPI_Init(SPI1, &SPI_InitStructure);
SPI_Cmd(SPI1, ENABLE); //使能SPI外设//
//启动传输目的是让MOSI维持高。因为一般空闲状态电平都是高这样不容易出问题//
SPI1_ReadWriteByte(0xff);
}
//SPI2速度设置函数//
void SPI1_SetSpeed(u16 SPI_BaudRatePrescaler)
{
assert_param(IS_SPI_BAUDRATE_PRESCALER(SPI_BaudRatePrescaler)); //有效性判断//
SPI2->CR1&=0XFFC7; //先将SPI_CR1寄存器的BR位置000//
SPI2->CR1|=SPI_BaudRatePrescaler; //再设置SPI2速度//
SPI_Cmd(SPI1,ENABLE);
}
//u8 SPI2_ReadWriteByte(u8 TxData)读写一个字节函数,TxData:要写入的字节,返回值:读取到的字节//
u8 SPI1_ReadWriteByte(u16 TxData)
{
u8 retry=0;
//检查SPI_SR寄存器的TXE位发送缓冲为空其值0时为非空1时为空//
while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET)
{
retry++; //发送缓冲为空时retry++//
if(retry>200)return 0;
}
SPI_I2S_SendData(SPI1, TxData); //通过外设SPI2发送一个数据//
retry=0;
//检查SPI_SR寄存器的RXNE位接收缓冲为空其值0时为空1时为非空//
while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET)
{
retry++; //当接收缓冲为非空时retry++//
if(retry>200)return 0;
}
return SPI_I2S_ReceiveData(SPI1); //返回通过SPIx最近接收的数据//
}