Problema del controlador SPI del PIC24F MPLAB X MCC Microchip Code Configurator

1

Actualmente estoy haciendo un proyecto usando un PIC24F que se comunica con un sensor de presión HSC Honeywell ( Documento del protocolo SPI de los sensores de presión Honeywell )

Debido a restricciones de tiempo y esta es la primera vez que estoy usando un dispositivo PIC, decidí usar el generador de código MPLAB X MCC y la herramienta del controlador. Ya tenía una serie de problemas con otras cosas además de no poder encontrar la documentación adecuada para las API.

pero ahora mismo estoy luchando con la API de búfer de intercambio SPI.

Aunque puedo comunicarme con éxito con el sensor usando un intercambio único de 16 bits para obtener 2 bytes de lectura de presión, me gustaría acceder a otra información; hasta 4 bytes

Sin embargo, utilizando la API SPI1_Exchange16bitBuffer (); usando el código de ejemplo que encontré en un archivo de encabezado generado a continuación:

@Example
<code>
uint16_t   myWriteBuffer[MY_BUFFER_SIZE];
uint16_t   myReadBuffer[MY_BUFFER_SIZE];
uint16_t writeData;
uint16_t readData;
SPI1_STATUS status;
unsigned int    total;
SPI1_Initialize;
total = 0;
do
{
    total  = SPI1_Exchange16bitBuffer( &myWriteBuffer[total], MY_BUFFER_SIZE - total, &myWriteBuffer[total]);

    // Do something else...

} while( total < MY_BUFFER_SIZE );

readData = SPI1_Exchange16bit( writeData);

status = SPI1_StatusGet();

</code>

No importa el tamaño del búfer, el código que utilizo nunca sale del bucle do-while, algunos de los bytes de la matriz se rellenan con ceros pero no con datos.

Investigaciones adicionales encontraron que el controlador a menudo se atasca en el bucle "while (count)" que se muestra a continuación:

    while (dataSentCount < byteCount)
{
    if ((count < SPI1_FIFO_FILL_LIMIT))
    {
        if (spiModeStatus == SPI1_DRIVER_TRANSFER_MODE_16BIT)
            SPI1BUF = *((uint16_t*)pSend);
        else
            SPI1BUF = *pSend;
        pSend += sendAddressIncrement;
        dataSentCount++;
        count++;
    }

    if (SPI1STATbits.SRXMPT == false) 
    {
        if (spiModeStatus == SPI1_DRIVER_TRANSFER_MODE_16BIT)
            *((uint16_t*)pReceived) = SPI1BUF;
        else
            *pReceived = SPI1BUF;
        pReceived += receiveAddressIncrement;
        count--;
    }

}
while (count)
{
    if (SPI1STATbits.SRXMPT == false) 
    {
        if (spiModeStatus == SPI1_DRIVER_TRANSFER_MODE_16BIT)
            *((uint16_t*)pReceived) = SPI1BUF;
        else
            *pReceived = SPI1BUF;
        pReceived += receiveAddressIncrement;
        count--;
    }
}

return dataSentCount;

}

Parece que SPI1STATbits.SRXMPT a veces no se hace realidad, mirando la hoja de datos se puede ver que esto significa que el FIFO permanece vacío

bit FIFO de la hoja de datos

No estoy seguro de lo que estoy haciendo mal, tal vez el controlador se haya escrito incorrectamente, el código de ejemplo no esté claro y no tengo ninguna documentación que explique cómo usar estas API y no tengo tiempo para analizar completamente el módulo SPI del PIC ahora mismo

Diagrama de bloques SPI

¿Puede alguien que entienda este módulo arrojar algo de luz?

    
pregunta Jono Moran

1 respuesta

0
  

¿Puede alguien que entienda este módulo arrojar algo de luz?

Probablemente sea mucho mejor para usted si todo el proyecto está empaquetado para que otros puedan revisar su código más fácilmente.

para la depuración en general, si tiene un depurador de hardware, es muy útil. Si no lo hace, intente averiguar dónde se cuelga la ejecución y redúzcala progresivamente.

por ejemplo, si el problema es con el bucle while (contar), intente ver por qué se omite la instrucción if - > para que el recuento no disminuya y nunca saldrás del bucle while.

  

Aunque puedo comunicarme con éxito con el sensor usando un solo intercambio de 16 bits para obtener 2 bytes de lectura de seguridad, me gustaría acceder a otra información; hasta 4 bytes

me parece que una solución mucho más simple es llamar a la rutina de 16 bits dos veces para enviar 4 bytes.

    
respondido por el dannyf

Lea otras preguntas en las etiquetas