stm32 华邦W25X32芯片spi总线配置

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);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值