Panych
Feb 11 2008, 10:30
Почему может не включаться SPI?
Дошел до совсем простого, вот код из IAR:
void main( void )
{
#define SETBIT(ADDRESS,BIT) (ADDRESS |= (1<<BIT))
#define CLEARBIT(ADDRESS,BIT) (ADDRESS &= ~(1<<BIT))
#define CHECKBIT(ADDRESS,BIT) (ADDRESS & (1<<BIT))
SETBIT( DDRB, 2 );
SETBIT( DDRB, 1 );
SPCR = 0x53;
SPSR = 0x00;
SPDR = 0x55;
}
Ведь должен выдаться байт наружу? Но SCK и MOSI даже не определены как выходы, причем по первым двум командам - они переводятся на выход, а вот инициализация SPI переводит их обратно.
Чего-то не понимаю?
Плату прозвонил, микруха свежеустановленная...
Liseev
Feb 11 2008, 10:48
А что у вас творится с ножкой SS?
Если вы используете режим MASTER и SS определен как вход, то низкий уровень на нем будет воспринят контроллером как попытка другим мастером на шине начать цикл передачи, соответственно контроллер автоматически перейдет в режим SLAVE и будет ждать, когда на входе SCK появятся тактовые импульсы...
Смотрите даташит на 128 мегу, стр 166
vesago
Feb 11 2008, 10:50
Пример:
Код
//::::::::::::::::::::::::::::::::::::::::::::::::::::::
//
//::::::::::::::::::::::::::::::::::::::::::::::::::::::
void SPI_Init(void)
{
SPI_PORT |= (1<<SCK)|(1<<MOSI)|(1<<MISO);
// PORT_SPI &= ~(1<<SCK);
SPI_DDR |= (1<<SCK)|(1<<MOSI);
SPI_DDR &= ~(1<<MISO);
SPSR = (1<<SPI2X);
SPCR = (1<<SPE)|(1<<MSTR); //Mode 0
}
//::::::::::::::::::::::::::::::::::::::::::::::::::::::
// Записываем байт
//::::::::::::::::::::::::::::::::::::::::::::::::::::::
void SPI_Write_Byte(u8_t b)
{
SPDR = b;
while ((SPSR & (1<<SPIF)) == 0);
}
//::::::::::::::::::::::::::::::::::::::::::::::::::::::
// Читаем байт
//::::::::::::::::::::::::::::::::::::::::::::::::::::::
u8_t SPI_Read_Byte(void)
{
SPDR = 0x00;
while ((SPSR & (1<<SPIF)) == 0);
return SPDR;
}
Panych
Feb 11 2008, 11:29
Цитата(Liseev @ Feb 11 2008, 13:48)

А что у вас творится с ножкой SS?
Смотрите даташит на 128 мегу, стр 166
Liseev, спасибо, именно в ней дело, не сообразил, хотя даташит конечно читал, но этот момент не прочувствовал.
vesago, спасибо за пример!