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.
194 lines
4.8 KiB
194 lines
4.8 KiB
2 years ago
|
#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;
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
*/
|