En uno de mis pequeños proyectos, uso STMF103C8T6 como memoria MCU y SPI W25Q128 de Winbond para almacenar datos. El chip de memoria conectado a SPI1. Aquí está una parte del esquema:
ElcódigoesgeneradoprincipalmenteporCubeMX.Soloheañadidoalgúncódigoparacomunicarmeconelchipdememoria:
Initialization:
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__);
}
}
Código 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\r\n", id);
while
{
}
}
Según la hoja de datos para obtener el código del fabricante del chip, necesito enviar 0x90 y 3 bytes ficticios. El chip debe devolver 0xEF, 0x17. Pero por alguna razón recibo 2 bytes de 0xFF . Ok, he cambiado el chip dos veces en la PCB pero sin resultados. Todavía recibo 0xFF, 0xFF. He conectado el analizador lógico al chip en la PCB y, para mi sorpresa, obtengo la siguiente imagen:
Deacuerdoconeldiagrama,todoestábien.Elchipenvía0xEF,0x17comoseesperaba.PeroporalgunarazónmiSTM32noveeso.
VolvíarevisarelPCB,reinstaléalgunoschips,probéW25Q128yW25Q64;todosfallaron,solorecibí0xFF,0xFFenlugardedatosreales.¿Quépodríaserycómopuedosolucionarlo?
Elproyectocompletoes