|

楼主 |
发表于 2021-8-30 17:15:05
|
显示全部楼层
- /*
- *********************************************************************************************************
- *
- * 模块名称 : SPI驱动模块
- * 文件名称 : SPI_STM32F103.c
- * 版 本 : V1.0
- * 说 明 : 本驱动是基于bsp_spi_bus.c文件实现。
- * (1)使用FlashFS的SPI FLASH文件系统前务必先调用初始化函数bsp_InitSPIBus(在函数bsp.c中初始化)。
- * (2)本文件使用的是官方模板,用户只需添加函数功能即可,故不对变量定义和函数名做重新规范。
- *
- * 修改记录 :
- * 版本号 日期 作者 说明
- * V1.0 2015-09-09 Eric2013 正式发布
- *
- * Copyright (C), 2015-2020, 安富莱电子 www.armfly.com
- *
- *********************************************************************************************************
- */
- #include <File_Config.h>
- #include "bsp.h"
- /*
- **********************************************************************************************************
- 宏定义
- **********************************************************************************************************
- */
- /*
- SPI 驱动定义
- spi0_drv: 第一个SPI设备驱动
- spi1_drv: 第二个SPI设备驱动
- */
- #define __DRV_ID spi0_drv
- #define __FPCLK 72000000
- /* SPI_SR位定义 */
- #define RXNE 0x01
- #define TXE 0x02
- #define BSY 0x80
- #define FPCLK (__FPCLK/1000)
- /* 串行Flsh的片选GPIO端口 */
- #define SPI_SelectHard SPI1
- #define SF_RCC_CS RCC_APB2Periph_GPIOF
- #define SF_PORT_CS GPIOF
- #define SF_PIN_CS GPIO_Pin_11
- #define SF_CS_0() SF_PORT_CS->BRR = SF_PIN_CS
- #define SF_CS_1() SF_PORT_CS->BSRR = SF_PIN_CS
- /*
- **********************************************************************************************************
- 宏定义
- **********************************************************************************************************
- */
- /* SPI驱动接口函数 */
- static BOOL Init (void);
- static BOOL UnInit (void);
- static U8 Send (U8 outb);
- static BOOL SendBuf (U8 *buf, U32 sz);
- static BOOL RecBuf (U8 *buf, U32 sz);
- static BOOL BusSpeed (U32 kbaud);
- static BOOL SetSS (U32 ss);
- /* SPI 设备驱动控制块 */
- SPI_DRV __DRV_ID = {
- Init,
- UnInit,
- Send,
- SendBuf,
- RecBuf,
- BusSpeed,
- SetSS,
- NULL
- };
- /*
- *********************************************************************************************************
- * 函 数 名: Init
- * 功能说明: 初始化SPI设备,这里仅初始化了SPI Flash的片选,SPI初始化调用函数bsp_InitSPIBus()实现
- * 形 参: 无
- * 返 回 值: __TRUE
- *********************************************************************************************************
- */
- static BOOL Init (void)
- {
- /*
- 安富莱STM32-V4 开发板口线分配: 串行Flash型号为 W25Q128 (104MHz)
- 片选 PF8/SF_CS
- */
- GPIO_InitTypeDef GPIO_InitStructure;
- /* 使能GPIO 时钟 */
- RCC_APB2PeriphClockCmd(SF_RCC_CS, ENABLE);
- /* 配置片选口线为推挽输出模式 */
- SF_CS_1(); /* 片选置高,不选中 */
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_InitStructure.GPIO_Pin = SF_PIN_CS;
- GPIO_Init(SF_PORT_CS, &GPIO_InitStructure);
- return (__TRUE);
- }
- /*
- *********************************************************************************************************
- * 函 数 名: UnInit
- * 功能说明: 卸载SPI设备,正常情况下此函数实现卸载需要将SPI接口设置为初始化状态,即未开启状态。
- * 由于多个设备使用SPI接口,这里仅是将片选至高。
- * 形 参: 无
- * 返 回 值: __TRUE
- *********************************************************************************************************
- */
- static BOOL UnInit (void)
- {
- SF_CS_1();
- return (__TRUE);
- }
- /*
- *********************************************************************************************************
- * 函 数 名: Send
- * 功能说明: 发送一个字节数据
- * 形 参: 无
- * 返 回 值: SPI接口返回值
- *********************************************************************************************************
- */
- static U8 Send (U8 outb)
- {
- /* 通过SPI接口读写一个字节 */
- SPI_SelectHard->DR = outb;
- /* 等待数据接收完毕 */
- while (!(SPI_SelectHard->SR & RXNE));
- return (SPI_SelectHard->DR);
- }
- /*
- *********************************************************************************************************
- * 函 数 名: SendBuf
- * 功能说明: 通过SPI接口发送多个字节
- * 形 参: buf 数据地址
- * sz 发送数据大小
- * 返 回 值: __TRUE
- *********************************************************************************************************
- */
- static BOOL SendBuf (U8 *buf, U32 sz)
- {
- U32 i;
- for (i = 0; i < sz; i++)
- {
- SPI_SelectHard->DR = buf[i];
- /* 等待发送完成 */
- while (!(SPI_SelectHard->SR & TXE));
- SPI_SelectHard->DR;
- }
-
- /* 等待接收完成 */
- while (SPI_SelectHard->SR & (BSY | RXNE))
- {
- SPI_SelectHard->DR;
- }
- return (__TRUE);
- }
- /*
- *********************************************************************************************************
- * 函 数 名: RecBuf
- * 功能说明: 通过SPI接口接收多个字节
- * 形 参: buf 数据地址
- * sz 接收数据大小
- * 返 回 值: __TRUE
- *********************************************************************************************************
- */
- static BOOL RecBuf (U8 *buf, U32 sz)
- {
- U32 i;
- for (i = 0; i < sz; i++)
- {
- SPI_SelectHard->DR = 0xFF;
- /* 等待接收完成 */
- while (!(SPI_SelectHard->SR & RXNE));
- buf[i] = SPI_SelectHard->DR;
- }
- return (__TRUE);
- }
- /*
- *********************************************************************************************************
- * 函 数 名: BusSpeed
- * 功能说明: 设置SPI速度,驱动SPI Flash使用的是18MHz
- * 形 参: buf 数据地址
- * sz 接收数据大小
- * 返 回 值: __TRUE
- *********************************************************************************************************
- */
- static BOOL BusSpeed (U32 kbaud)
- {
- U8 br;
- if (kbaud >= FPCLK / 2) br = 0; /* FPCLK/2 */
- else if (kbaud >= FPCLK / 4) br = 1; /* FPCLK/4 */
- else if (kbaud >= FPCLK / 8) br = 2; /* FPCLK/8 */
- else if (kbaud >= FPCLK / 16) br = 3; /* FPCLK/16 */
- else if (kbaud >= FPCLK / 32) br = 4; /* FPCLK/32 */
- else if (kbaud >= FPCLK / 64) br = 5; /* FPCLK/64 */
- else if (kbaud >= FPCLK / 128) br = 6; /* FPCLK/128 */
- else br = 7; /* FPCLK/256 */
- SPI_SelectHard->CR1 = (SPI_SelectHard->CR1 & ~(7 << 3)) | (br << 3);
- return (__TRUE);
- }
- /*
- *********************************************************************************************************
- * 函 数 名: BusSpeed
- * 功能说明: 设置SPI速度,驱动SPI Flash使用的是18MHz
- * 形 参: ss
- * 0 表示选中设备
- * 1 表示取消选中
- * 返 回 值: __TRUE
- *********************************************************************************************************
- */
- static BOOL SetSS (U32 ss) {
- if(ss == 0)
- {
- bsp_SpiBusEnter(); /* 占用SPI总线, 用于总线共享 */
-
- bsp_SPI_Init(SPI_Direction_2Lines_FullDuplex | SPI_Mode_Master | SPI_DataSize_8b
- | SPI_CPOL_High | SPI_CPHA_2Edge | SPI_NSS_Soft | SPI_BaudRatePrescaler_4 | SPI_FirstBit_MSB);
- SF_CS_0();
-
- }
- else
- {
- SF_CS_1();
- bsp_SpiBusExit(); /* 释放SPI总线, 用于总线共享 */
- }
-
- return (__TRUE);
- }
- /***************************** 安富莱电子 www.armfly.com (END OF FILE) *********************************/
复制代码
|
|