¿La comunicación SPI no funciona durante el tiempo de ejecución?

1

Para mi proyecto necesito comunicarme entre el Microcontrolador C8051f350 Hoja de datos (Microcontrolador Silab) y TI DAC116s997 DataSheet IC a través de SPI.

El problema al que me enfrento un problema en la comunicación SPI. La comunicación SPI funciona bien cuando se realiza el debbugging (paso único). Pero cuando ejecuto un programa sin puntos de interrupción, la comunicación SPI falla.

Aquí está el código para la comunicación, Inicialización SPI

//! @brief Initialise the SPI
// SPI mode - 0, CPOL=0 CPHA=0
// SPI0CN = 1, ENABLE SPI
// fSCK =SYSCLK/2*(SPI0CKR+1)
// SYSCLK = 24.5Mhz SPI0CKR = 9, SPI FRQ(fSCK) = 1.2Mhz
#define Init_SPI()  {                                               \
    SPI0CFG   = 0x40;                                                   \
    SPI0CN    = 0x01;                                                   \
    SPI0CKR   = 9;                                                  \
}

Proceso de inicialización para DAC

MT_SPI_Write(8, 0xC33C);        // RESET the DAC
MT_SPI_Write(2, 0);             // Followed by NOP command after reset

Escriba continuamente el valor DAC en el temporizador ISR de 1 ms

/**
 * @brief   1ms Timer ISR for timer 3
 * @author  Sushant
 * @param   None
 * @return  None.
 */
void ISR_Timer3()   interrupt 14
{
    Word lwRes;
    CLEAR_TIMER3_FLAG();
                //  DACCODE ADDRESS, DAC VALUE
    lwRes = MT_SPI_Write(4,          32767);
    MT_SPI_Write(0x89, 0);      // read status register

}

Funciones SPI:

/**
 * @brief   This function writes 24 bits on DAC through SPI
 * @param   lbAdd - Address of DAC register
 * @param   lwData - Data to be written at address specified
 * @return  16 bit data received from DAC in return
 */
Word MT_SPI_Write(Byte lbAdd, Word lwData)
{
    UN_Word lunResult;
    UN_Word lunData;
    lunData.W = lwData;
    DAC_CS = 0;                                 // CS = 0
    Send_SPI(lbAdd);                            // Address of register
    lunResult.B[0] = Send_SPI(lunData.B[0]);    // Higher byte of register
    lunResult.B[1] = Send_SPI(lunData.B[1]);    // Lower byte of register
    DAC_CS = 1;                                 // CS = 1

    return lunResult.W;
}
Byte Send_SPI(Byte lbData)
{

    while(!TXBMT);          // Wait if transmit buffer is not empty

    SPI0DAT = lbData;       // Write the data in SPI Tx buffer

    while(!SPIF);           // Wait till transfer is complete

    SPIF=0;                 // Clear the transfer complete flag

    lbData = SPI0DAT;       // read the data from SPI Rx buffer

    return (lbData);        // Returns the data
 }
    
pregunta Sushant

2 respuestas

0

Bueno, el problema se resolvió, se trató de un error de sincronización, como se mencionó anteriormente por Some Hardware Guy. A pesar de que la frecuencia de trabajo DAC116s997 está en Mhz. DAC no respondía hasta que reduje la frecuencia a 400 kHz.

A 400Khz o SPI de baja frecuencia se establece la comunicación y DAC funciona correctamente.

    
respondido por el Sushant
0

Suena como un problema de tiempo de eventos. Cuando haces eso de espaldas para volver a escribir el comando, ¿estás esperando a que se complete el primero? Si no es así, cuando tenga un solo paso, es probable que el hardware tenga tiempo para escribir los datos en el bus serie antes de volver a escribir el registro spi.

Podrías probar un bucle de retardo entre los dos, pero sería mejor revisar los bits de estado de spi para ver cuándo el hardware está listo para la próxima escritura.

    
respondido por el Some Hardware Guy

Lea otras preguntas en las etiquetas