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
}