这个是用STM32模拟时许读出芯片的ID的例程
- #include "stm32f1xx_hal.h"
- #include "stdio.h"
- void SPI_Delay(void)
- {
- for(uint8_t i=0 ; i<250; i++);
- }
- void SPI_Init(void)
- {
- GPIO_InitTypeDef gpioinitstruct = {0};
- __HAL_RCC_GPIOC_CLK_ENABLE();
- /* Configure CS_PIN pin: SPI CS pin */
- gpioinitstruct.Pin = GPIO_PIN_4;
- gpioinitstruct.Mode = GPIO_MODE_OUTPUT_PP;
- gpioinitstruct.Pull = GPIO_PULLUP;
- gpioinitstruct.Speed = GPIO_SPEED_FREQ_HIGH;
- HAL_GPIO_Init(GPIOC, &gpioinitstruct);
- /* Enable GPIO clock */
- __HAL_RCC_GPIOA_CLK_ENABLE();
-
- /* configure SPI SCK(GPIO_PIN_5) */
- gpioinitstruct.Pin = GPIO_PIN_5;
- gpioinitstruct.Mode = GPIO_MODE_OUTPUT_PP;
- gpioinitstruct.Pull = GPIO_PULLUP;
- gpioinitstruct.Speed = GPIO_SPEED_FREQ_HIGH;
- HAL_GPIO_Init(GPIOA, &gpioinitstruct);
- /* configure SPI MISO(GPIO_PIN_6) and MOSI(GPIO_PIN_7) */
- gpioinitstruct.Pin = GPIO_PIN_6;
- gpioinitstruct.Mode = GPIO_MODE_INPUT;
- gpioinitstruct.Pull = GPIO_PULLUP;
- gpioinitstruct.Speed = GPIO_SPEED_FREQ_HIGH;
- HAL_GPIO_Init(GPIOA, &gpioinitstruct);
-
- gpioinitstruct.Pin = GPIO_PIN_7;
- gpioinitstruct.Mode = GPIO_MODE_OUTPUT_PP;
- gpioinitstruct.Pull = GPIO_PULLUP;
- gpioinitstruct.Speed = GPIO_SPEED_FREQ_HIGH;
- HAL_GPIO_Init(GPIOA, &gpioinitstruct);
- HAL_GPIO_WritePin(GPIOC, GPIO_PIN_4, GPIO_PIN_SET);
- HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET);
- HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6, GPIO_PIN_SET);
- HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7, GPIO_PIN_SET);
- }
- /*
- *W25X16ê±ÖóϽμÑØêä3öêy¾Y
- *MSBÎaê×λμÄ′«êä
- *
- */
- uint8_t SPI_WriteRead_Byte(uint8_t data)
- {
- uint8_t num = 0 , temp = 0 ,rxd_data = 0;
- //·¢Ëíò»¸ö×Ö½úêy¾Y
- for(num = 0 ; num < 8 ; num++)
- {
- if((data & 0x80) == 0x80)
- {
- HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7, GPIO_PIN_SET);
- }
- else
- {
- HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7, GPIO_PIN_RESET);
- }
-
- //flash éÏéyÑØËø′æêy¾Y
- SPI_Delay();
- HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET);
- SPI_Delay();
-
- //flash ϽμÑØêä3öêy¾Y
- if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_6) == GPIO_PIN_SET)
- {
- temp = 0x01;
- temp <<= (7 - num);
- }
- else
- {
- temp = 0;
- }
- rxd_data |= temp;
-
- HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET);
-
- data <<= 1;
- }
- return rxd_data;
- }
- void FLASH_SPI_WriteEnable(void)
- {
- /*!< Select the FLASH: Chip Select low */
- HAL_GPIO_WritePin(GPIOC, GPIO_PIN_4, GPIO_PIN_RESET);
-
- /*!< Send "Write Enable" instruction */
- SPI_WriteRead_Byte(0x06);
-
- /*!< Select the FLASH: Chip Select low */
- HAL_GPIO_WritePin(GPIOC, GPIO_PIN_4, GPIO_PIN_SET);
- }
- uint32_t FLASH_Read_ID(void)
- {
- uint32_t temp=0,temp0=0,temp1=0;
-
- HAL_GPIO_WritePin(GPIOC, GPIO_PIN_4, GPIO_PIN_SET);
- HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET);
-
- //FLASH_SPI_WriteEnable();
-
- HAL_GPIO_WritePin(GPIOC, GPIO_PIN_4, GPIO_PIN_RESET);
-
- SPI_WriteRead_Byte(0x90);
- SPI_WriteRead_Byte(0x00);
- SPI_WriteRead_Byte(0x00);
- SPI_WriteRead_Byte(0x00);
- temp0 = SPI_WriteRead_Byte(0x00);
- temp1 = SPI_WriteRead_Byte(0x00);
- temp = ((temp0 << 8) | temp1 );
- return temp;
- }
- uint32_t FLASH_Read_JEDEC_ID(void)
- {
- uint32_t temp=0,temp0=0,temp1=0,temp2=0;
-
- HAL_GPIO_WritePin(GPIOC, GPIO_PIN_4, GPIO_PIN_SET);
- HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET);
-
- HAL_GPIO_WritePin(GPIOC, GPIO_PIN_4, GPIO_PIN_RESET);
-
- SPI_WriteRead_Byte(0x9f);
- temp0 = SPI_WriteRead_Byte(0x00);
- temp1 = SPI_WriteRead_Byte(0x00);
- temp2 = SPI_WriteRead_Byte(0x00);
-
-
- HAL_GPIO_WritePin(GPIOC, GPIO_PIN_4, GPIO_PIN_SET);
-
- temp = ((temp0 << 16) | (temp1 << 8) | temp2 );
- return temp;
- }
复制代码 |