blew_zc 0 3 мая, 2011 Опубликовано 3 мая, 2011 · Жалоба Столкнулся с проблемой, пытаясь запустить 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
slava2148 0 6 июня, 2011 Опубликовано 6 июня, 2011 (изменено) · Жалоба SPI в этом процессоре сделан просто замечательно! В нём всё есть! Если 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; } } надеюсь кое-что станет понятным Изменено 6 июня, 2011 пользователем IgorKossak [codebox]!!! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться