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

 
 
 
Reply to this topicStart new topic
> LPC2919 Hardware SPI Slave, с прерыванием
Blew_zc
сообщение May 3 2011, 15:12
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 23
Регистрация: 9-11-10
Пользователь №: 60 771



Столкнулся с проблемой, пытаясь запустить 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
Go to the top of the page
 
+Quote Post
slava2148
сообщение Jun 6 2011, 11:14
Сообщение #2





Группа: Новичок
Сообщений: 7
Регистрация: 11-12-07
Пользователь №: 33 185



SPI в этом процессоре сделан просто замечательно! В нём всё есть! biggrin.gif
Если 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]!!!
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 20th June 2025 - 18:17
Рейтинг@Mail.ru


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