我正在和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
{
}
}我怎么才能修复它?

发布于 2020-09-03 07:16:07
如果不能访问您的硬件设置,就很难知道出了什么问题。看起来你是在正确的轨道上,只要坚持下去,检查所有可能的错误来源,并将问题缩小到简单和可测试的范围内。首先找出是否可能是硬件问题,然后尝试修复软件。
一些提示,这可能会有所帮助:
SPI数据线(本例中为DO/MISO)上的
用于芯片选择(PA15)的
/* configure /CS pin to be an output pin */
GPIO_InitTypeDef init = {0};
init.Pin = SPI_SEL2_Pin;
init.Speed = GPIO_SPEED_FREQ_LOW;
init.Mode = GPIO_MODE_OUTPUT_PP;
init.Pull = GPIO_NOPULL;
if (HAL_GPIO_Init(SPI_SEL2_GPIO_Port, &init) != HAL_OK) {
Error_Handler();
}
ChipDeselect();
HAL_Delay(100);0xAB的0x90替代命令,称为“释放掉电/设备ID”(参见数据手册中的第9.3.7节)。-请注意,此指令只会唤醒芯片,当以其“简短形式”使用时,引用数据表:如图38a所示,若要将器件从掉电状态释放出来,可通过将/CS引脚驱动为低电平、将指令代码“ABh”移位并将/CS驱动为高电平来发出指令。

中测试的小函数
对于一次性发送和接收数据,
https://stackoverflow.com/questions/63705022
复制相似问题