Добрый день!
Не могу никак подружить эту связку.
С шины постоянно читается 0xFF. Документацию уже проштудировал, примеры от кейла тоже. SSel эмулирую портом (не средствами контроллера spi, а средствами gpio).
Вот куски кода:
инициализация:
Код:
|
// spi0 init
LPC_IOCON-›SWCLK_PIO0_10 = 0xC2;
LPC_IOCON-›PIO0_9 = 0xD1;
LPC_IOCON-›PIO0_8 = 0xD1;
LPC_SYSCON-›PRESETCTRL |= 0x01;
LPC_SYSCON-›SYSAHBCLKCTRL |= (1‹‹11);
LPC_SYSCON-›SSP0CLKDIV = 0x02;
LPC_SSP0-›CR0 = 0x0707;
LPC_SSP0-›CR1 = 0x02;
LPC_SSP0-›CPSR = 0x02;
// init additional gpio for spi0
LPC_GPIO0-›DIR |= (1‹‹1)|(1‹‹2)|(1‹‹3)|(1‹‹6)|(1‹‹7); |
отправка байта:
Код:
|
void SPISend(char bt)
{
while ((LPC_SSP0-›SR & 0x12) != 0x02);
LPC_SSP0-›DR = bt;
while ((LPC_SSP0-›SR & 0x10) == 0x10);
} |
прием байта:
Код:
|
uint8_t SPIReceive()
{
uint8_t RetVal;
while ((LPC_SSP0-›SR & 0x10) == 0x10);
LPC_SSP0-›DR = 0xFF;
while ((LPC_SSP0-›SR & 0x1C) != 0x0C){
};
Transmit_UART_Lenght = Convert_To_UART(0x0E);
UARTSend(Transmit_UART_Buffer, Transmit_UART_Lenght);
RetVal = LPC_SSP0-›DR;
return RetVal;
} |
запись в память: NumIC - это номер микросхемки на шине, у меня их 3, Addr - адрес в микросхемке, Data - что надо записать.
Код:
|
void WriteToSPI(uint8_t NumIC, uint32_t Addr, uint8_t Data)
{
char bt;
LPC_GPIO0-›MASKED_ACCESS[0x04] =0x00; // устанавливаем в 1 CS микросхемы памяти. У меня по дороге к ней стоит инвертор, потому пишем 0.
switch (NumIC) // здесь выбираем конкретную микросхему
{
case 0x01:
LPC_GPIO0-›MASKED_ACCESS[0xCA] = (1‹‹1);
break;
case 0x02:
LPC_GPIO0-›MASKED_ACCESS[0xCA] = (1‹‹3);
break;
case 0x03:
LPC_GPIO0-›MASKED_ACCESS[0xCA] = (1‹‹6);
break;
case 0x04:
LPC_GPIO0-›MASKED_ACCESS[0xCA] = (1‹‹7);
break;
}
LPC_GPIO0-›MASKED_ACCESS[0x04] =0x04; //устанавливаем в 0 CS микросхемы памяти
SPISend(0x06); //WREN
LPC_GPIO0-›MASKED_ACCESS[0x04] =0x00;
delay_ns(250);
while (1) // test if IC ready to write
{
LPC_GPIO0-›MASKED_ACCESS[0x04] =0x04;
SPISend(0x05); //RDSR
bt = SPIReceive();
LPC_GPIO0-›MASKED_ACCESS[0x04] =0x00;
if ((bt&0x03)==0x02)
{
break;
}
}
// start write cycle
LPC_GPIO0-›MASKED_ACCESS[0x04] =0x04;
SPISend(0x02);
SPISend((uint8_t)((Addr››16)&0xFF));
SPISend((uint8_t)((Addr››08)&0xFF));
SPISend((uint8_t)(Addr&0xFF));
SPISend(Data);
LPC_GPIO0-›MASKED_ACCESS[0x04] =0x00;
delay_ns(65000);
while (1) // test if IC had been written
{
LPC_GPIO0-›MASKED_ACCESS[0x04] =0x04;
SPISend(0x05); //RDSR
bt = SPIReceive();
LPC_GPIO0-›MASKED_ACCESS[0x04] =0x00;
if ((bt&0x01)!=0x01)
{
break;
}
}
return;
} |