#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; } */