【发布时间】:2020-12-21 14:13:40
【问题描述】:
我正在开发带有 W25Q16 的 STM32L432KC。每次我收到0xFF。根据数据表,要获得芯片制造商代码,我需要发送0x90 和 3 个虚拟字节。芯片应返回0xEF、0x17。但是,出于某种原因,我收到了 2 个字节的 0xFF。
SPI_HandleTypeDef hspi1;
static void MX_SPI1_Init(void)
{
hspi1.Instance = SPI1;
hspi1.Init.Mode = SPI_MODE_MASTER;
hspi1.Init.Direction = SPI_DIRECTION_2LINES;
hspi1.Init.DataSize = SPI_DATASIZE_8BIT;
hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;
hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;
hspi1.Init.NSS = SPI_NSS_SOFT;
hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_32;
hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
hspi1.Init.TIMode = SPI_TIMODE_DISABLE;
hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
hspi1.Init.CRCPolynomial = 10;
hspi1.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE;
hspi1.Init.NSSPMode = SPI_NSS_PULSE_ENABLE;
if (HAL_SPI_Init(&hspi1) != HAL_OK)
{
_Error_Handler(__FILE__, __LINE__);
}
}
#define SPI_SEL2_Pin GPIO_PIN_15
#define SPI_SEL2_GPIO_Port GPIOA
#define ChipSelect() HAL_GPIO_WritePin(SPI_SEL2_GPIO_Port, SPI_SEL2_Pin, GPIO_PIN_RESET)
#define ChipDeselect() HAL_GPIO_WritePin(SPI_SEL2_GPIO_Port, SPI_SEL2_Pin, GPIO_PIN_SET)
#define COMMAND_IDENTIFICATION 0x90
uint8_t buffer_tx[4];
uint8_t buffer_rx[2];
uint16_t GetIdentification()
{
buffer_tx[0] = COMMAND_IDENTIFICATION;
buffer_tx[1] = 0x0;
buffer_tx[2] = 0x0;
buffer_tx[3] = 0x0;
ChipSelect();
HAL_SPI_Transmit(&hspi1, buffer_tx, 4, 1000); // send 0x90, 0x0, 0x0, 0x0
HAL_SPI_Receive(&hspi1, buffer_rx, 2, 1000); // receive 0xFF, 0xFF
ChipDeselect();
return ((uint8_t)buffer_rx[0] << 8) | (uint8_t)buffer_rx[1];
}
int main(void)
{
MX_SPI1_Init();
HAL_Delay(1000);
uint16_t id = GetIdentification();
printf("Manufacturer ID: 0x%.4X\r\n", id);
while
{
}
}
我该如何解决?
【问题讨论】:
-
您的初始化调用是否在其他地方定义?你在哪里打电话
HAL_Init()?或MX_GPIO_Init()? -
是的,我已经做到了。
标签: stm32 spi flash-memory stm32cubemx