реклама на сайте
подробности

 
 
> SPI Driver, что не так?
pechkin21rus
сообщение Apr 17 2008, 20:10
Сообщение #1





Группа: Новичок
Сообщений: 12
Регистрация: 9-03-08
Из: Чебоксары
Пользователь №: 35 748



Что-то не так, никак не могу понять, что. Может кто знает? help.gif

[/code] #include "project.h"
#include "spi_driver_setting.h"

//*----------------------------------------------------------------------------
//* Object : Software waiting loop
//* Input Parameters : Speed
//*----------------------------------------------------------------------------
void Wait (unsigned long Speed)
{
unsigned long waiting_time;

for(waiting_time = 0; waiting_time < Speed; waiting_time++);
}

//*----------------------------------------------------------------------------
//* Object : SPI Software reset and check reg after reset
//*----------------------------------------------------------------------------
void AT91F_SPI_SWReset (const AT91PS_SPI pSpi)
{
pSpi -> SPI_CR = AT91C_SPI_SWRST; // SW reset
}

//*----------------------------------------------------------------------------
//* Object : SPI Enable Disable
//* Input Parameters : Enable.
//* Output Parameters : error.
//*----------------------------------------------------------------------------
void AT91F_SPI_Enable_Disable (const AT91PS_SPI pSpi, unsigned char Enable)
{
switch (Enable)
{
case ENABLE_SPI:
pSpi -> SPI_CR = AT91C_SPI_SPIEN; // SPI is enable
Wait (0xFF);
break;

case DISABLE_SPI:
pSpi -> SPI_CR = AT91C_SPI_SPIDIS; // SPI is Disable
Wait (0xFF);
break;

case ENABLE_DISABLE_SPI:
// Enable and disable are set @ the same time => SPI shoulb be disable
pSpi -> SPI_CR = (AT91C_SPI_SPIDIS | AT91C_SPI_SPIEN);
Wait (0xFF);
break;
}
}


//*----------------------------------------------------------------------------
//* Object : Open the SPI number ID SPI
//* Output Parameters : error.
//*----------------------------------------------------------------------------

void AT91F_SPI_Open (void)
{
// SPI Variable Init
spi_Rdrf_Flag = 0;
spi_Tdre_Flag = 0;
spi_Modf_Flag = 0;
spi_Ovred_Flag = 0;
spi_Nssr_Flag = 0;
spi_Txempty_Flag = 0;
spi_Spiens_Flag = 0;
spi_Endrx_Flag = 0;
spi_Endtx_Flag = 0;
spi_Rxbuff_Flag = 0;
spi_Txbuff_Flag = 0;
spi_Status = 0;

AT91PS_SPI pSPI = BASE_SPI;

// Configure PMC by enabling SPI clock
AT91F_PMC_EnablePeriphClock(
AT91C_BASE_PMC, // PIO controller base address
((unsigned int) 1 << ID_SPI)); // SPI channel

// Configure SPI input - output
// AT91F_PIO_CfgPeriph (AT91C_BASE_PIOA, SPI0_npcs0|SPI0_miso|SPI0_mosi|SPI0_spck, SPI1_npcs0|SPI1_spck|SPI1_mosi|SPI1_miso);
AT91F_SPI_CfgPIO();

// Configure SPI interrupt
AT91F_AIC_ConfigureIt (AT91C_BASE_AIC, ID_SPI, AT91C_AIC_PRIOR_LOWEST, AT91C_AIC_SRCTYPE_INT_POSITIVE_EDGE, AT91F_SPI_Interrupt_handler);
AT91F_AIC_EnableIt (AT91C_BASE_AIC, ID_SPI);

pSPI -> SPI_IER = (AT91C_SPI_RDRF + AT91C_SPI_TDRE + AT91C_SPI_MODF + AT91C_SPI_OVRES + AT91C_SPI_NSSR + AT91C_SPI_TXEMPTY + AT91C_SPI_SPIENS);

AT91F_SPI_Enable (BASE_SPI);

// SPI is in master mode + CS not variable + CS directly connected + no Fault mode + min DLYBCS
pSPI -> SPI_MR = (AT91C_SPI_MSTR + AT91C_SPI_MODFDIS);

SPI_CSR_bits.BITS = SPI_BITS_16;
SPI_CSR_bits.SCBR = AT91B_MCK/SPCK_baudrate;
SPI_CSR_bits.CPOL = SPCK_inactive_zero;
SPI_CSR_bits.NCPHA = SPCK_phase_zero;
SPI_CSR_bits.CSAAT = Chip_Select_pause_inactive;

AT91F_Set_SPI_CSR (BASE_SPI, SPI_CSR_Setting, CSR0);

spi_Txempty_Flag = 0;
}

//*----------------------------------------------------------------------------
//* Object : Allows programming SPI_CSR registers
//* Input Parameters : Csr_Value.
//* Input Parameters : Csr_Number.
//*----------------------------------------------------------------------------
void AT91F_Set_SPI_CSR (const AT91PS_SPI pSpi, unsigned long Csr_Value, unsigned int Csr_Number)
{
switch (Csr_Number)
{
case CSR0:
pSpi -> SPI_CSR[CSR0] = Csr_Value; // CSR0 <- Csr_Value
break;

case CSR1:
pSpi -> SPI_CSR[CSR1] = Csr_Value; // CSR1 <- Csr_Value
break;

case CSR2:
pSpi -> SPI_CSR[CSR2] = Csr_Value; // CSR2 <- Csr_Value
break;

case CSR3:
pSpi -> SPI_CSR[CSR3] = Csr_Value; // CSR3 <- Csr_Value
break;

default:
break;
}
}

//*----------------------------------------------------------------------------
//* Object : Read SPI_RDR
//* Output Parameters : Data_Recieved.
//*----------------------------------------------------------------------------
unsigned long AT91F_SPI_Read_Data (const AT91PS_SPI pSpi)
{
unsigned long Data_Recieved;

spi_Rdrf_Flag = 0;
pSpi -> SPI_IER = AT91C_SPI_RDRF; // Disabled in the interrupt handler

while (spi_Rdrf_Flag == 0);
// Read RDR and mask non used bits
Data_Recieved = (pSpi -> SPI_RDR & 0x000FFFFF);
// RDF re enabled (see handler)
pSpi -> SPI_IER = AT91C_SPI_RDRF;
return Data_Recieved; // Return RDR (Read Data + PCS)
}

//*----------------------------------------------------------------------------
//* Object : Send a data
//* Input Parameters : Data_To_Send.
//*----------------------------------------------------------------------------
void AT91F_SPI_Send_Data (unsigned long Data_To_Send)
{
AT91PS_SPI pSPI = BASE_SPI;
if (spi_Tdre_Flag)
{
spi_Tdre_Flag = 0;
Data_To_Send &= 0x010FFFFF; // mask non used bits

pSPI -> SPI_TDR = Data_To_Send;
pSPI -> SPI_IER = AT91C_SPI_TDRE;
}
// else // error
}


//*----------------------------------------------------------------------------
//* Object : SPI interrupt handler
//*----------------------------------------------------------------------------
__ramfunc void AT91F_SPI_Interrupt_handler (void)
{
AT91PS_SPI pSPI = BASE_SPI;
spi_Status = pSPI -> SPI_SR;

// AT91F_SPI_Send_Data (0x00000A0A);

// A data has been recieved and transmitted to the RBR.
if (spi_Status & AT91C_SPI_RDRF)
{
spi_Rdrf_Flag = 1;
// Interrupt is disabled to avoid inopportune interrupt
pSPI -> SPI_IDR = AT91C_SPI_RDRF;
}

// The last data written in the TDR has been transmitted to the serializer
if (spi_Status & AT91C_SPI_TDRE)
{
spi_Tdre_Flag = 1;
// Interrupt is disabled to avoid inopportune interrupt
pSPI -> SPI_IDR = AT91C_SPI_TDRE;

}

// A mode fault has occured (NCS0 was tied low).
if (spi_Status & AT91C_SPI_MODF)
{
spi_Modf_Flag = 1;
// Interrupt is disabled to avoid inopportune interrupt
pSPI -> SPI_IDR = AT91C_SPI_MODF;
}

// An overrun error has occured.
if (spi_Status & AT91C_SPI_OVRES)
{
spi_Ovred_Flag = 1;
// Interrupt is disabled to avoid inopportune interrupt
pSPI -> SPI_IDR = AT91C_SPI_OVRES;
}

// The Receive Counter Register has reached 0 since the last write in SPI_RCR or SPI_RNCR.
if (spi_Status & AT91C_SPI_ENDRX)
{
spi_Endrx_Flag = 1;
// Interrupt is disabled to avoid inopportune interrupt
pSPI -> SPI_IDR = AT91C_SPI_ENDRX;
}

// The Transmit Counter Register has reached 0 since the last write in SPI_TCR or SPI_TNCR.
if (spi_Status & AT91C_SPI_ENDTX)
{
spi_Endtx_Flag = 1;
// Interrupt is disabled to avoid inopportune interrupt
pSPI -> SPI_IDR = AT91C_SPI_ENDTX;
}

// Both SPI_RCR and SPI_RNCR have a value of 0.
if (spi_Status & AT91C_SPI_RXBUFF)
{
spi_Rxbuff_Flag = 1;
// Interrupt is disabled to avoid inopportune interrupt
pSPI -> SPI_IDR = AT91C_SPI_RXBUFF;
}

// Both SPI_TCR and SPI_TNCR have a value of 0.
if (spi_Status & AT91C_SPI_TXBUFE)
{
spi_Txbuff_Flag = 1;
// Interrupt is disabled to avoid inopportune interrupt
pSPI -> SPI_IDR = AT91C_SPI_TXBUFE;
}

// NSS has risen
if (spi_Status & AT91C_SPI_NSSR)
{
spi_Nssr_Flag = 1;
// Interrupt is disabled to avoid inopportune interrupt
pSPI -> SPI_IDR = AT91C_SPI_NSSR;
}

// TDR and shift registers are empty
if (spi_Status & AT91C_SPI_TXEMPTY)
{
spi_Txempty_Flag = 1;
// Interrupt is disabled to avoid inopportune interrupt
pSPI -> SPI_IDR = AT91C_SPI_TXEMPTY;
}
}[code]

Ничего не передается. Грешу на AT91F_SPI_Send_Data, но что не так, не пойму


--------------------
Бери ношу по себе, чтоб не падать при ходьбе...
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
aaarrr
сообщение Apr 17 2008, 20:15
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



spi_Tdre_Flag у Вас ставится только в прерывании, до которого дело не доходит.

P.S. Теги поправьте
Go to the top of the page
 
+Quote Post
pechkin21rus
сообщение Apr 19 2008, 17:57
Сообщение #3





Группа: Новичок
Сообщений: 12
Регистрация: 9-03-08
Из: Чебоксары
Пользователь №: 35 748



Почему только в прерывании? Вот же функция:

Код
void AT91F_SPI_Send_Data (unsigned long Data_To_Send)
{
AT91PS_SPI pSPI = BASE_SPI;
if (spi_Tdre_Flag)
{
spi_Tdre_Flag = 0;
Data_To_Send &= 0x010FFFFF; // mask non used bits

pSPI -> SPI_TDR = Data_To_Send;
pSPI -> SPI_IER = AT91C_SPI_TDRE;
}


--------------------
Бери ношу по себе, чтоб не падать при ходьбе...
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 23:39
Рейтинг@Mail.ru


Страница сгенерированна за 0.01348 секунд с 7
ELECTRONIX ©2004-2016