SPI в этом процессоре сделан просто замечательно! В нём всё есть!

Если SPI работает в slave-режиме, то частота не выставляется - она приходит от мастера, главное чтобы она не превышала допустимую (1/4 от тактируемой). Это ведь SPI, а не UART. Далее. Чтобы что-то отправить по SPI, надо
вначале туда что-то положить. SPIx_SLV0_SETTINGSx существует для настроек в режиме мастера его слэйвов. Судя по всему читать документацию и разбираться что какой бит вам неохота. Могу привести правильный код инициализации, но для мастер-режима.
CODE
// Reset SPI0
SPI0_CONFIG |= SPI_SOFTWARE_RESET;
while(SPI0_CONFIG & SPI_SOFTWARE_RESET); // Self clear when reset is done.
SPI0_TX_FIFO_FLUSH = 1; // Flush TX FIFO
// Default value, set to master mode, no loop back, normal mode, slave can drive its transmit-data output
regVal = SPI0_CONFIG;
regVal &= ~(SPI_MS_MODE|SPI_LOOPBACK_MODE|SPI_SLAVE_DISABLE|SPI_TRANSMIT_MODE);
//regVal |= SPI_LOOPBACK_MODE;
//regVal |= SPI_TRANSMIT_MODE;//+SPI_TIMER_TRIGGER;
SPI0_CONFIG = regVal;
/* Set slave of the SPI module */
SPI0_SLV0_SETTINGS1 = (0<<16) + ((gFreqCtrl.GetSPIClk()/36000000) << 8);
// SPI_CLK is 72 MHz, serial clock is 36 Mhz, 0 in 16-24bits means 1(one!) word
SPI0_SLV0_SETTINGS2 = (0x1<<8)|0x0F; // Motorola 16 bits, the rest is default
// Slave 0 is enabled
SPI0_SLV_ENABLE = (0x01<<0);
// Slave 1 is enabled
//SPI0_SLV_ENABLE |= (0x01<<2);
// Set SPI Update Enable bit
SPI0_CONFIG |= SPI_UPDATE_ENABLE;
#if INTERRUPT_MODE_SPI0
// Disable interrupts, clear interrupt status
SPI0_INT_CLR_STATUS = (SPI_SMS|SPI_TX|SPI_RX|SPI_TO|SPI_OV);
SPI0_INT_CLR_ENABLE = (SPI_SMS|SPI_TX|SPI_RX|SPI_TO|SPI_OV);
// Threshold for both TX and RX is 1
SPI0_INT_THRESHOLD = (0x0<<0)|(0x0<<8);
SPI0_INT_SET_ENABLE = SPI_TX|SPI_RX|SPI_TO|SPI_OV;
install_irq( SPI0_INT, (void *)SPI0_Handler, HIGHEST_PRIORITY -2);
EnableIntReq_IRQ( SPI0_INT, ACTIVE_HIGH, HIGHEST_PRIORITY -2);
SPI0_CONFIG |= SPI_ENABLE; // Enable SPI
SPI0_CONFIG &= ~SPI_ENABLE; // Enable SPI
#else
SPI0_CONFIG |= SPI_ENABLE; // Disable SPI
#endif
// P2.10 is SPI0 SCS0, P2.11 is SPI0 SCLK, P2.12 is SPI0 SDI, P2.13 is SPI0 SDO
//SFSP1_14 = (1<<2)|(2<<0); // Digital no PU and PD, func. 2 - SCS3
//SFSP1_15 = (1<<2)|(2<<0); // Digital no PU and PD, func. 2 - SCS0
//SFSP1_16 = (1<<2)|(2<<0); // Digital no PU and PD, func. 2 - SCK
//SFSP1_17 = (5<<2)|(2<<0); // Digital no PU and is PD, func. 2 - SDI
//SFSP1_18 = (1<<2)|(2<<0); // Digital no PU and PD, func. 2 - SDO
//SFSP1_19 = (1<<2)|(2<<0); // Digital no PU and PD, func. 2 - SCS2
//SFSP1_20 = (1<<2)|(2<<0); // Digital no PU and PD, func. 2 - SCS1
SFSP2_10 = (1<<2)|3; // Digital no PU and PD, func. 3 - SCS0
SFSP2_11 = (1<<2)|3; // Digital no PU and PD, func. 3 - SCK
SFSP2_12 = (5<<2)|3; // Digital no PU and is PD, func. 3 - SDI
SFSP2_13 = (1<<2)|3; // Digital no PU and PD, func. 3 - SDO
и обработчик прерываний
CODE
void SPI0_Handler()
{
DWORD regValue;
//regValue = SPI0_INT_STATUS;
//if ( regValue & SPI_TX )
{
regValue=SPI0_FIFO_DATA;
if(++gSPI0C.m_TxCnt<gSPI0C.m_TxQ)
{
SPI0_FIFO_DATA = gSPI0C.m_TDData[gSPI0C.m_TxCnt];
}else
SPI0_CONFIG &= ~SPI_ENABLE;
//SPI0_INT_CLR_STATUS = SPI_TX;
}//else
{
SPI0_INT_CLR_STATUS = 0xF;
}
}
надеюсь кое-что станет понятным
Сообщение отредактировал IgorKossak - Jun 6 2011, 12:00
Причина редактирования: [codebox]!!!