"spi.c"
/* Includes ------------------------------------------------------------------*/
#include "drv_spi.h"
/* Private variables ---------------------------------------------------------*/
extern TIM_HandleTypeDef htim7;
/* Private user code ---------------------------------------------------------*/
/*
* 函数名称:SPI初始化
* 函数功能:将片选线和时钟线拉高
* 函数说明:无
* 输入参数:无
* 返回值 :无
*/
void SPI_Init(void)
{
M_CS_H;
SPI_SCK_H;
}
/*
* 函数名称:SPI发送及接收函数
* 函数功能:通过spi发送一个字节并接收一个字节
* 函数说明:由于spi是全双工,所以可以边发送边接收
* 输入参数:需要发送的一个字节数据
* 返回值 :接收到的一个字节数据
*/
uint8_t spi_send_byte(uint8_t data){
uint16_t i = 0;
uint8_t temp=0x00;
for(i=8;i>0;i--){
if(data&0x80){
SPI_MOSI_H;//MOSI_H;//写1
}else{
SPI_MOSI_L;//MOSI_L;//写0
}
data<<=1;//高位在前
SPI_SCK_H;//SCLK_H;//sck高
delay_1us();
temp<<=1;
if(SPI_READ_MISO ==1){
temp++;//读到1
}
SPI_SCK_L;//SCLK_L;//sck低
delay_1us();
}
return temp;
}
/*
* 函数名称:延时一毫秒函数
* 函数功能:延时一毫秒
* 函数说明:通过计时器7延时
* 输入参数:无
* 返回值 :无
*/
void delay_1us(void)
{
uint16_t differ;
differ=0xffff-1-5;
HAL_TIM_Base_Start(&htim7);
__HAL_TIM_SetCounter(&htim7,differ);
while(differ < 0xffff-5)
{
differ = __HAL_TIM_GetCounter(&htim7);
}
HAL_TIM_Base_Stop(&htim7);
}
"spi.h"
#ifndef __DRV_SPI_H
#define __DRV_SPI_H
/* Includes ------------------------------------------------------------------*/
#include "stm32f4xx_hal.h"
#include "main.h"
/* Private define ------------------------------------------------------------*/
/* 引脚操作 */
#define SPI_SCK_H HAL_GPIO_WritePin(CLK_GPIO_Port,CLK_Pin,GPIO_PIN_SET) /* SCK = 1 */
#define SPI_SCK_L HAL_GPIO_WritePin(CLK_GPIO_Port,CLK_Pin,GPIO_PIN_RESET) /* SCK = 0 */
#define M_CS_H HAL_GPIO_WritePin(NSS_GPIO_Port,NSS_Pin,GPIO_PIN_SET) /* NSS = 1 */
#define M_CS_L HAL_GPIO_WritePin(NSS_GPIO_Port,NSS_Pin,GPIO_PIN_RESET) /* NSS = 0 */
#define SPI_MOSI_H HAL_GPIO_WritePin(MOSI_GPIO_Port,MOSI_Pin,GPIO_PIN_SET) /* MOSI = 1 */
#define SPI_MOSI_L HAL_GPIO_WritePin(MOSI_GPIO_Port,MOSI_Pin,GPIO_PIN_RESET) /* MOSI = 0 */
#define SPI_READ_MISO HAL_GPIO_ReadPin(MISO_GPIO_Port,MISO_Pin) /* 读MISO口线状态 */
/* Private function prototypes -----------------------------------------------*/
void SPI_Init(void);
void delay_1us(void);
#endif
|