Перейти к содержанию
    

LPC2919 Hardware SPI Slave

Столкнулся с проблемой, пытаясь запустить SPI на чипе в режиме Slave.

Мастер работает на частоте 250 кГц, в LPC2919 клок SPI выставлен на 2.5 МГц.

LPC принимает корректный байт, а передает одни нули. Наверняка где-то накосячил - не могу найти где. Как-то сложно реализован SPI в LPC2919.

По User Manual'у вроде делал, но видимо руки не из того места... =)

Еще не понятно как правильно настроить обмен по 8 бит, а не по 16. Есть регистры SPI2_SLV0_SET2-SPI2_SLV3_SET2,

в которых устанавливается режим обмена, но это вроде только для подчиненных девайсов.. %) Короче тут не понятно...

Нигде не могу найти готового примера, хоть для Master Mode, но с прерыванием. Толи чип такой кривой, что его никто не юзает, толи что?

 

Подскажите, кто работал с этим или похожим чипом, где собака порылась?

Интересует именно SPI по прерыванию. Ниже код.

 

http://www.everfall.com/paste/id.php?80bjzuvt6n05

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Если SPI работает в slave-режиме, то частота не выставляется - она приходит от мастера, главное чтобы она не превышала допустимую (1/4 от тактируемой). Это ведь SPI, а не UART. Далее. Чтобы что-то отправить по SPI, надо вначале туда что-то положить. SPIx_SLV0_SETTINGSx существует для настроек в режиме мастера его слэйвов. Судя по всему читать документацию и разбираться что какой бит вам неохота. Могу привести правильный код инициализации, но для мастер-режима.

	// 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

 

и обработчик прерываний

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
[codebox]!!!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...