不含stm32 底层的代码
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.
MyStm32Code/bsp/Inc/bsp_spi_soft.h

145 lines
4.4 KiB

2 years ago
#ifndef __BSP_SPI_SOFT_H
#define __BSP_SPI_SOFT_H
#include "stm32f4xx_hal.h"
#include "main.h"
// #include "sys.h"
2 years ago
#define CS_GPIO_PORT GPIOF
#define CS_PIN GPIO_PIN_6
#define SCK_GPIO_PORT GPIOF
#define SCK_PIN GPIO_PIN_7
#define MISO_GPIO_PORT GPIOF
#define MISO_PIN GPIO_PIN_8
#define MOSI_GPIO_PORT GPIOF
#define MOSI_PIN GPIO_PIN_9
// FPF6 ------> SPI5_CS
// PF7 ------> SPI5_SCK
// PF8 ------> SPI5_MISO
// PF9 ------> SPI5_MOSI
2 years ago
typedef enum {
SPI_OK = 0x00, //IIC工作正常
SPI_WAIT_ACK_ERR = 0x01, //slave设备返回ACK错误
SPI_WRITE_ERR = 0x02, //向slave设备写入错误
SPI_READ_ERR = 0x04 //从slave设备读取错误
} SPI_STATUS;
typedef struct
{
2 years ago
GPIO_TypeDef *cs_port;
uint16_t cs_pin;
GPIO_TypeDef *sclk_port;
uint16_t sclk_pin;
GPIO_TypeDef *miso_port;
uint16_t miso_pin;
GPIO_TypeDef *mosi_port;
uint16_t mosi_pin;
uint8_t sda_pin_num; //定义延时,以适应不同器件对速率的不同要求,具体值要在调试中确定
uint8_t addr; //器件地址
uint32_t delaytick; //定义延时,以适应不同器件对速率的不同要求,具体值要在调试中确定
uint8_t CPOL; //时钟极性,为0:空闲状态时,SCK保持低电平; 1: 表示在空闲状态时,SCK保持高电平。
uint8_t CPHA; // 时钟相位, 0:从第一个时钟边沿开始; 1:第二个时钟边沿开始。
uint16_t period ; //确定速度为大于0K小于等于400K的整数,默认为100K,>period=500/speed speed时钟频率
2 years ago
}SPI_SOFT_TypeDef;
#define CS_H HAL_GPIO_WritePin(GPIOC, GPIO_PIN_5, GPIO_PIN_SET)
#define CS_L HAL_GPIO_WritePin(GPIOC, GPIO_PIN_5, GPIO_PIN_RESET)
#define SCLK_H HAL_GPIO_WritePin(GPIOC, GPIO_PIN_4, GPIO_PIN_SET)
#define SCLK_L HAL_GPIO_WritePin(GPIOC, GPIO_PIN_4, GPIO_PIN_RESET)
#define SDI_H HAL_GPIO_WritePin(GPIOC, GPIO_PIN_1, GPIO_PIN_SET)
#define SDI_L HAL_GPIO_WritePin(GPIOC, GPIO_PIN_1, GPIO_PIN_RESET)
#define SDO_R HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_1)
#define SUCCESS 0
#define FAILURE 1
void SPI_Init(const SPI_SOFT_TypeDef *pSoftSPI);
2 years ago
uint8_t WriteReg(const SPI_SOFT_TypeDef *pSoftSPI, uint32_t d);
uint8_t ReadReg(const SPI_SOFT_TypeDef *pSoftSPI, uint32_t d);
void SPI_Write_OneByte(const SPI_SOFT_TypeDef *pSoftSPI, uint8_t u8_writedata);
uint8_t SPI_Read_OneByte(const SPI_SOFT_TypeDef *pSoftSPI);
uint8_t SPI_ReadWriteByte(const SPI_SOFT_TypeDef *pSoftSPI, uint8_t TxData);
uint32_t SPI_FLASH_ReadDeviceID( const SPI_SOFT_TypeDef *pSoftSPI);
2 years ago
#endif
/*
2 years ago
CPOL CPHA
0 0 00 沿
0 1 01 沿
1 0 10 沿
1 1 11 沿
2 years ago
2 years ago
00 SCL拉低 SDA SCLK
2 years ago
2 years ago
00
// T____
// ______/ \______
2 years ago
2 years ago
01
// ____T
// ______/ \______
2 years ago
2 years ago
10
// * ____T _____
// \_______/
2 years ago
2 years ago
11
// * ____ T_____
// \_______/
2 years ago
2 years ago
00
SS为高SCK输出低电平
SS变低SCK输出低电平
SS变高SCK输出低电平
SCK由低变高之后MISO引脚信号
SCK输出低电平MOSI引脚输出相应的电平SCK输出高电平
2 years ago
2 years ago
MISOMaster input slave output
MOSIMaster output slave input
MISO也可以是SIMODOUTDOSDO或SO;
MOSI也可以是SOMIDINDISDI或SI;
SPI_SOFT_TypeDef sSPI ={
GPIOF, GPIO_PIN_6,GPIOF, GPIO_PIN_7,GPIOF, GPIO_PIN_8,GPIOF, GPIO_PIN_9,
6,0,1,
} ;
SPI_Init(&sSPI);
uint8_t txData[4] = {0x9F, 0x00, 0x00, 0x00};
uint32_t hhhh =2667577344;
uint8_t rxData[4] = {0}; //
uint8_t rrr;
2 years ago
2 years ago
// rrr = SPI_ReadWriteByte(&sSPI, txData[0]);
// log_i("rrrr: 0x%02X\n", rrr); // 19
// delay_us(1);
// rrr = SPI_ReadWriteByte(&sSPI, 0xFF);
// log_i("rrrr: 0x%02X\n", rrr); // 19
// delay_us(1);
// rrr = SPI_ReadWriteByte(&sSPI, 0xFF);
// log_i("rrrr: 0x%02X\n", rrr); // 19
// delay_us(1);
// rrr = SPI_ReadWriteByte(&sSPI, 0xFF);
// log_i("rrrr: 0x%02X\n", rrr); // 19
// delay_us(1);
hhhh = SPI_FLASH_ReadDeviceID(&sSPI);
2 years ago
2 years ago
*/
2 years ago