STM32F103 SPI MISO no funciona como se esperaba

0

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 aquí .

    
pregunta folibis

1 respuesta

2

No funciona porque el pin # HOLD está conectado a tierra, por lo que el W25Q128 está en modo HOLD. El pin #HOLD debe estar conectado a 3.3V para que funcione como se espera.

    
respondido por el Justme

Lea otras preguntas en las etiquetas