Вот пример программной "имитации" ("облегчённый" кусок моего кода для программатора из соотв. темы):
Код
unsigned char spiTransfer(unsigned char out_data)
{
// softwared SPI
unsigned char temp=0x80,in_data=0;
while(temp)
{
// set MOSI
BIT_SET(ISP_PORT,ISP_MOSI,(out_data & temp));
// delay 1/2 of period
delay_us(duration);
// read MISO
if(BIT_TEST(ISP_PIN,ISP_MISO))
in_data|=temp;
// SCK high
BIT_ON(ISP_PORT,ISP_SCK);
// delay 1/2 of period
delay_us(duration);
// prepare for next bit
temp>>=1;
// SCK low
BIT_OFF(ISP_PORT,ISP_SCK);
}
return in_data;
}
Надеюсь смысл кода понятен: к моменту положительного фронта данные уже должны "стоять" (и мастер и слейв должны выставить), а сразу после отрицательного фронта данные должны быть обновлены (тоже обоими).