在我的一个小项目中,我使用STMF103C8T6作为Winbond的MCU和SPI存储器W25Q128来存储数据。存储器芯片连接到SPI1。这是该计划的一部分:
代码主要由CubeMX生成。我只添加了一些与内存芯片通信的代码:初始化: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;
if (HAL_SPI_Init(&hspi1) != HAL_OK)
{
_Error_Handler(__FILE__, __LINE__);
}
}
W25Q128代码:
#define CS_Pin GPIO_PIN_3
#define CS_GPIO_Port GPIOA
#define ChipSelect() HAL_GPIO_WritePin(CS_GPIO_Port, CS_Pin, GPIO_PIN_RESET)
#define ChipDeselect() HAL_GPIO_WritePin(CS_GPIO_Port, CS_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
", id);
while
{
}
}
根据数据表获取芯片制造商代码,我需要发送0x90和3个虚拟字节。芯片应该返回0xEF,0x17。但由于某种原因,我收到2个字节的0xFF。好吧,我已经在PCB上更换了两次但没有结果的芯片。我仍然收到0xFF,0xFF。我已将逻辑分析仪连接到PCB上的芯片,令我惊讶的是,我得到以下图片:
根据图表,一切都很好。芯片按预期发送0xEF,0x17。但由于某些原因,我的STM32没有看到。我已经重新检查了PCB,我重新安装了几个芯片,我尝试过W25Q128和W25Q64 - 都失败了,我只收到0xFF,0xFF而不是实际数据。它可能是什么,我该如何解决?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>