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
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
¿Puede alguien que entienda este módulo arrojar algo de luz?