不含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/Src/bsp_spi_soft.c

193 lines
4.8 KiB

#include "bsp_spi_soft.h"
#include "elog.h"
// #include "delay.h"
void SPI_Init(const SPI_SOFT_TypeDef *pSoftSPI)
{
GPIO_InitTypeDef GPIO_Initure;
__HAL_RCC_GPIOB_CLK_ENABLE(); // 使能GPIOB时钟
// //PB6 SCL PB7初始化设置
// GPIO_Initure.Pin = pSoftIIC->scl_pin ;
// GPIO_Initure.Mode = GPIO_MODE_OUTPUT_PP; // 推挽输出
// GPIO_Initure.Pull = GPIO_PULLUP; // 上拉
// GPIO_Initure.Speed = GPIO_SPEED_FAST; // 快速
// HAL_GPIO_Init( pSoftIIC->scl_port, &GPIO_Initure );
// // SDA PB7 初始化设置
// GPIO_Initure.Pin = pSoftIIC->sda_pin;
// HAL_GPIO_Init( pSoftIIC->sda_port, &GPIO_Initure );
// GPIO_WRITE_PIN(pSoftIIC->sda_port, pSoftIIC->sda_pin, 1);
// GPIO_WRITE_PIN(pSoftIIC->scl_port, pSoftIIC->scl_pin, 1);
// RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
// GPIO_InitTypeDef GPIO_InitStructure;
// GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //457引脚配置为推挽输出
// GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5| GPIO_Pin_7;//457引脚配置为推挽输出
// GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
// GPIO_Init(GPIOA, &GPIO_InitStructure);
// GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//pin6是MISO,对于STM32来说是输入,配置为上拉输入
// GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;//pin6是MISO,对于STM32来说是输入,配置为上拉输入
// GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
// GPIO_Init(GPIOA, &GPIO_InitStructure);
// //CS引脚初始化
// GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
// GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ; //推挽输出
// GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
// GPIO_Init(GPIOC, &GPIO_InitStructure);
// //SCK和MOSI引脚初始化
// GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5|GPIO_Pin_7;
// GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ; //推挽输出
// GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
// GPIO_Init(GPIOA, &GPIO_InitStructure);
// //MISO引脚初始化
// GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
// GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU ; //浮空输入
// GPIO_Init(GPIOA, &GPIO_InitStructure);
}
/**
* @brief Set SDIO as the input mode
*/
void SDO_IN(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIO_InitStruct.Pin = GPIO_PIN_1;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
}
/**
* @brief Set SDIO as the output mode
*/
void SDO_OUT(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.Pin = GPIO_PIN_1;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
}
/**
* @brief Send one byte by SPI bus
*
* @param u8_writedata
*/
void SPI_Write_OneByte(uint8_t u8_writedata)
{
uint8_t i;
for (i = 0; i < 8; i++)
{
if (u8_writedata & 0x80)
SDI_H;
else
SDI_L;
SCLK_H;
u8_writedata <<= 1;
SCLK_L;
}
}
/**
* @brief Read one byte by SPI bus
*
* @return temp
*/
uint8_t SPI_Read_OneByte(void)
{
uint8_t i;
uint8_t temp = 0;
for (i = 0; i < 8; i++)
{
temp <<= 1;
SCLK_H;
if (SDO_R)
temp |= 0x01;
else
temp &= ~0x01;
SCLK_L;
}
return temp;
}
/**
* @brief Write a register
*
* @param d: {D2, D1, D0}
* @return SUCCESS
*/
uint8_t WriteReg(uint32_t d)
{
uint8_t tx[3] = {(d >> 16) & 0xff, (d >> 8) & 0xff, d & 0xff};
SDO_OUT();
CS_L;
SPI_Write_OneByte(tx[0]);
SPI_Write_OneByte(tx[1]);
SPI_Write_OneByte(tx[2]);
CS_H;
SDI_L;
return SUCCESS;
}
/**
* @brief Read a register
* @param d: {D2, D1, D0}
* @return data: The data be read in a register
*/
uint8_t ReadReg(uint32_t d)
{
uint8_t tx[3] = {(d >> 16) & 0xff, (d >> 8) & 0xff, d & 0xff};
uint8_t data;
// tx[0] = tx[0] | RF_DATA_READ_BIT;
// SDO_OUT();
// CS_L;
// SPI_Write_OneByte(tx[0]);
// SPI_Write_OneByte(tx[1]);
// SDO_IN();
// data = SPI_Read_OneByte();
// CS_H;
// SDO_OUT();
// SDI_L;
return data;
}
/* ,同步传输数据,比如在时钟的上升沿是写数据,那么在时钟的下降沿就是读数据
static uint8_t W25QXX_SPI_ReadWriteByte(uint8_t TxData)
{
int i = 0;
uint8_t RxData = 0;
W25QXX_SCK_L(); // 时钟拉低
for(i = 7; i >= 0; i--)
{
W25QXX_SCK_L(); // 时钟拉低 ,发送1bit
if(TxData & (1 << i))
{
W25QXX_MOSI_H();
}
else
{
W25QXX_MOSI_L();
}
delay_us(1); // 延时1微秒
W25QXX_SCK_H(); // 拉高时钟读 1bit
RxData <<= 1;
RxData |= W25QXX_MISO_GET();
delay_us(1);
}
W25QXX_SCK_L();
return RxData;
}
*/