Попробовал использовать USI (Tiny45) в режиме SPI (Slave). Все нормально запустилось. Отправляю от Тини число, на Меге это число принимаю и вывожу на ЖКИ. Но теперь необходимо поменять устройства ролями: Тини должен быть мастером, а Мега - подчиненным. Соответственно на Тини USCK настроил на выход, а у Меги, соответственно SCK, на вход. Кроме этого на Меге вывод SS настроен на вход и притянут перемычкой на землю.
Функция передачи байта от Тини:
Код
unsigned char send_byte(unsigned char val)
{
USIDR = val;
USISR = (1<<USIOIF);
do
{
USICR = (1<<USIWM0) | (1<<USICS1) | (1<<USICLK) | (1<<USITC);
}
while ((USISR & (1<<USIOIF)) == 0);
return USIDR;
}
void main()
{
SETBIT(DDRB, USCK);
SETBIT(PORTB, USCK);
SETBIT(DDRB, DO);
CLRBIT(PORTB, DO);
CLRBIT(DDRB, DI);
SETBIT(PORTB, DI);
for(;;)
{
SendByte(0x11);
delay_ms(100);
}
}
На Меге функция инициализации аппаратного SPI:
Код
// select clock phase negative-going in middle of data
SPCR |= (1 << CPOL0);
// data is sampled on the trailing (last) edge of SCK. SPI Mode - 3
SPCR |= (1 << CPHA0);
// Data order MSB first
SPCR &= ~(1 << DORD0);
// enable SPI
SPCR |= (1 << SPE0);
// clear status
SPSR = SPSR;
SpiTransferComplete = true;
// enable SPI interrupt
#ifdef SPI_USEINT
SPCR |= (1 << SPIE0);
#endif
}
В результате получаю число 255!!!
Пробовал для Тини использовать программный SPI:
Код
void SendByte(unsigned char Data)
{
unsigned char BitCount = 8;
do
{
// Send bit to Slave, MSB first
if(Data & 0x80)
{
SETBIT(PORTB, DO);
}
else
{
CLRBIT(PORTB, DO);
}
// Toggle SCK pin to send current bit
CLRBIT(PORTB, USCK);
SETBIT(PORTB, USCK);
// Get next bit to send
Data <<= 1;
}
while(--BitCount);
}
Результат - тот же. В чем может быть проблема? Уже все перепробовал