es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Transmitir y leer valores de 16 bits desde el codificador magnético en STM32 con SPI.

Estoy intentando leer valores de un codificador magnético AMS AS5050A a través de SPI en un STM32 NUCLEO F446RE, pero no puedo hacer que funcione. Cuando uso la biblioteca HAL, la salida siempre es 0. Mi configuración para el periférico es la siguiente:

hspi3.Instance = SPI3;
hspi3.Init.Mode = SPI_MODE_MASTER;
hspi3.Init.Direction = SPI_DIRECTION_2LINES;
hspi3.Init.DataSize = SPI_DATASIZE_16BIT;
hspi3.Init.CLKPolarity = SPI_POLARITY_LOW;
hspi3.Init.CLKPhase = SPI_PHASE_2EDGE;
hspi3.Init.NSS = SPI_NSS_SOFT;
hspi3.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2;
hspi3.Init.FirstBit = SPI_FIRSTBIT_MSB;
hspi3.Init.TIMode = SPI_TIMODE_DISABLE;
hspi3.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
hspi3.Init.CRCPolynomial = 10;
if (HAL_SPI_Init(&hspi3) != HAL_OK)
{
    Error_Handler();
}

Este es mi código hasta ahora:

    HAL_StatusTypeDef ret = 0;
    short address = AMS_AS5050A_create_command(AMS_AS5050A_SPI_READ, 0x3FFF);

    // pull slave select pin low
    HAL_GPIO_WritePin(GPIOC, GPIO_PIN_6, GPIO_PIN_RESET);
    //transmit data
    ret = HAL_SPI_Transmit(&hspi3, (uint8_t *) &address, 2, HAL_MAX_DELAY);
    // pull slave select pin high
    HAL_GPIO_WritePin(GPIOC, GPIO_PIN_6, GPIO_PIN_SET);

    sprintf(buf, "[MAIN] test transmit returned code: %d\r\n", ret);
    UART_send(buf);

    HAL_Delay(50);

    uint16_t temp_data = 0;

    HAL_GPIO_WritePin(GPIOC, GPIO_PIN_6, GPIO_PIN_RESET);
    ret = HAL_SPI_Receive(&hspi3, (uint8_t*) &temp_data, 2,
    HAL_MAX_DELAY);
    HAL_GPIO_WritePin(GPIOC, GPIO_PIN_6, GPIO_PIN_SET);

    sprintf(buf, "[MAIN] test receive returned code: %d\r\n", ret);
    UART_send(buf);

    sprintf(buf, "[MAIN] test transmit and receive angle is: %d\r\n",
            temp_data);
    UART_send(buf);
    HAL_Delay(50);

La función AMS_AS5050A_create_command agrega un bit de lectura / escritura al corto y agrega un bit de paridad. Cuando se usa con el comando 0x3FFF, da 0xFFFF, que es correcto. Se ve así:

short AMS_AS5050A_create_command(uint8_t read_write, short address)
{

    short data = read_write << 15;
    data |= (address << 1);
    short res = data | calculate_parity(data);

    return res;
}

Cuando miro la salida en PuTTy, la salida siempre es 0. Las funciones no dan ningún código de error, pero la salida del comando de lectura SPI siempre es 0, incluso cuando sostengo un imán delante de él:

[MAIN] test transmit returned code: 0
[MAIN] test receive returned code: 0
[MAIN] test transmit and receive angle is: 0
[MAIN] test transmit returned code: 0
[MAIN] test receive returned code: 0
[MAIN] test transmit and receive angle is: 0
[MAIN] test transmit returned code: 0
[MAIN] test receive returned code: 0
[MAIN] test transmit and receive angle is: 0
[MAIN] test transmit returned code: 0
[MAIN] test receive returned code: 0
[MAIN] test transmit and receive angle is: 0

¿Alguien tiene alguna idea de lo que estoy haciendo mal?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Una posibilidad es que los ajustes de comunicación SPI entre la MCU y el codificador magnético no estén coincidiendo. Verifique de nuevo la hoja de datos del codificador y asegúrese de que el modo SPI, la polaridad del reloj y el fase del reloj estén configurados correctamente en el código. Otra posibilidad es que pueda haber un problema de hardware, como una conexión floja o un cableado incorrecto. Asegúrese de que todas las conexiones estén seguras y de que el cableado coincida con la hoja de datos. También puede ser útil utilizar un osciloscopio para comprobar las señales entre la MCU y el codificador en busca de cualquier anomalía. Por último, asegúrese de que el imán esté correctamente alineado con el codificador y de que tenga la suficiente fuerza para generar un campo magnético detectable.

Comments are closed.