pi3总线使用时,注意改变指定管脚的映射 GPIO_Remap_SWJ_JTAGDisable ,JTAG-DP 禁用 + SW-DP 使能
#include "stm32f10x_gpio.h"
#include "stm32f10x_spi.h"
#define FLASH_CS (1<<6)
#define SPI_FLASH_CS(x) GPIOB->ODR=(GPIOB->ODR&~FLASH_CS)|(x ? FLASH_CS:0) //命令片选
// SPI总线速度设置
#define SPI_SPEED_2 0
#define SPI_SPEED_8 1
#define SPI_SPEED_16 2
#define SPI_SPEED_256 3
//SPI 速度设置函数
//SpeedSet:
//SPI_SPEED_2 2分频 (SPI 36M@sys 72M)
//SPI_SPEED_8 8分频 (SPI 9M@sys 72M)
//SPI_SPEED_16 16分频 (SPI 4.5M@sys 72M)
//SPI_SPEED_256 256分频 (SPI 281.25K@sys 72M)
void SPIx_SetSpeed(u8 SpeedSet)
{
SPI3->CR1 &= 0XFFC7;//Fsck=Fcpu/256
if(SpeedSet == SPI_SPEED_2) //二分频
{
SPI3->CR1 |= 0 << 3;//Fsck=Fpclk/2=36Mhz
}
else if(SpeedSet == SPI_SPEED_8) //八分频
{
SPI3->CR1 |= 2 << 3;//Fsck=Fpclk/8=9Mhz
}
else if(SpeedSet == SPI_SPEED_16) //十六分频
{
SPI3->CR1 |= 3 << 3;//Fsck=Fpclk/16=4.5Mhz
}
else //256分频
{
SPI3->CR1 |= 7 << 3; //Fsck=Fpclk/256=281.25Khz 低速模式
}
SPI3->CR1 |= 1 << 6; //SPI设备使能
}
//SPI口初始化
//这里针是对SPI3的初始化
void SPIx_Init(void)
{
SPI_InitTypeDef SPI_InitStructure;
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2;//SPI_BaudRatePrescaler_4;
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
SPI_InitStructure.SPI_CRCPolynomial = 7;
SPI_Init(SPI3, &SPI_InitStructure);
SPI_Cmd(SPI3, ENABLE);
SPI3->SR |= SPI_I2S_FLAG_TXE;
SPIx_SetSpeed(SPI_SPEED_2);
}
u8 SPIx_ReadWriteByte(u8 byte)
{
u8 data = 0;
/* 等待上一个数据发送完*/
while(SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_TXE) == RESET);
/* 发送数据 */
SPI_I2S_SendData(SPI3, byte);
/* 等待接收数据完成 */
while(SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_RXNE) == RESET);
/* 返回接收的数据*/
data = SPI_I2S_ReceiveData(SPI3);
return data;
}
void SPI_FlashPort_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);//改变指定管脚的映射 GPIO_Remap_SWJ_JTAGDisable ,JTAG - DP 禁用 + SW - DP 使能
RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI3, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5; //电源控制,USB控制
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //推挽输出
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
SPI_FLASH_CS(1); //取消片选
SPIx_Init(); //初始化SPI
}
#define W25X_DeviceID 0xAB
//读取芯片ID W25X32的ID:0X15
u8 SPI_Flash_ReadID1(void)
{
u8 Temp = 0;
SPI_FLASH_CS(0);
SPIx_ReadWriteByte(W25X_DeviceID);//发送读取ID命令
SPIx_ReadWriteByte(0x00);
SPIx_ReadWriteByte(0x00);
SPIx_ReadWriteByte(0x00);
Temp |= SPIx_ReadWriteByte(0xff);
SPI_FLASH_CS(1);
return Temp;
}
//初始化SPI FLASH
//在指定位置写初始化标志
void SpiFlashInit(void)
{
u8 para[8];
SPI_FlashPort_Init();
para[0] = SPI_Flash_ReadID1();
if((para[0] != 0x15) && (para[0] != 0x16))
{
//printf(" 初始化FLASH失败\n");
//Disp_Err(ERR_FLASH);
while(1);
}
}