Добрый день!
Возникла такая проблема - подключили микросхему К1636РР4У к микроконтроллер 1986ВЕ92 через SPI:
Вывод SI микросхемы к MOSI микроконтроллера
Вывод SO микросхемы к MISO микроконтроллера
Вывод SCK микросхемы к SCK микроконтроллера
Вывод SEL_SPI микросхемы на GPIO (PB10)
Выводы 1 и 22 - +3,3В
Остальные выводы - к земле
Пытаюсь прочитать регистр статуса:
Код:
MDR_PORTB->RXTX &=~(1<<10); //SPI is active
MDR_SSP2->DR=0x05;
while (MDR_SSP2->SR &BSY);
for (t=0; t<3; t++)
{
MDR_SSP2->DR=0xFF;
//while (MDR_SSP2->SR &BSY);
while (!(MDR_SSP2->SR &RNE));
cmd[t]=MDR_SSP2->DR;
}
MDR_PORTB->RXTX |=1<<10; //SPI is inactive
Возвращаются только 0xFF.
Настройка SPI:
Код:
void SPI_init (void)
{
/* Initialize and enable the SSP Interface module. */
//I/O ports init
MDR_RST_CLK->PER_CLOCK |=1<<24; //Enable clocking PORTD
MDR_PORTD->OE |=0x60; //PD5, PD6 is output, PD2 is input
MDR_PORTD->FUNC |=0x00002820; //PD6 is MOSI, PD5 is SCK, PD2 is MISO
MDR_PORTD->ANALOG |=0x64; //PD2, PD5, PD6 is digital
MDR_PORTD->PWR |=0x00003C30; //All SPI pins has fastest front
MDR_RST_CLK->PER_CLOCK |=1<<22; //Enable clocking PORT B
MDR_PORTB->OE |=1<<10; //PB10 is output
MDR_PORTB->ANALOG |=1<<10; //PB10 is digital
MDR_PORTB->PWR |=0x00300000; //fastest front for PB10
MDR_PORTB->RXTX |=1<<10; //SPI inactive
//SPI controller init
MDR_RST_CLK->PER_CLOCK |=1<<20; //Enable clocking SSP2
MDR_RST_CLK->SSP_CLOCK |=1<<25; //Enable clocking SSP2 at 48MHz
MDR_SSP2->CPSR =120; //Prescaller for 400 kBit (48 MHz/120)
MDR_SSP2->CR0 =0x0007; //SPI Motorolla 8-bit CPOL=0 CPHA=0
MDR_SSP2->CR1 =0x0002; //Start SPI in master mode
}
В чем может быть проблема? В подключении или же как-то не так обращаюсь к микросхеме?
Немного поправил программу - оказалось, что висящая параллельно микросхема имела постоянный нуль на выводе CS. Отключил ее установкой CS в единицу, нужная микросхема стала выдавать 0x0C в ответ на команду чтения регистра статуса. Но тут возникла новая беда - я не могу поменять ничего в регистре - отправляю команду установки разрешения записи:
Код:
MDR_PORTB->RXTX &=~(1<<10); //SPI is active
MDR_SSP2->DR=0x06;
while (MDR_SSP2->SR &BSY);
MDR_PORTB->RXTX |=1<<10; //SPI is inactive*/
но в регистре статуса ничего от этого не меняется. Или же сам факт запроса регистра статуса сбрасывает бит WEL?
При попытке подтянуть вывод MRST микросхемы к питанию через резистор 9,1 кОм, микросхема снова начала возвращать 0xFF в ответ на запрос регистра статуса.
Заранее благодарен за помощь