Panych 0 11 февраля, 2008 Опубликовано 11 февраля, 2008 · Жалоба Почему может не включаться 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 0 11 февраля, 2008 Опубликовано 11 февраля, 2008 (изменено) · Жалоба А что у вас творится с ножкой SS? Если вы используете режим MASTER и SS определен как вход, то низкий уровень на нем будет воспринят контроллером как попытка другим мастером на шине начать цикл передачи, соответственно контроллер автоматически перейдет в режим SLAVE и будет ждать, когда на входе SCK появятся тактовые импульсы... Смотрите даташит на 128 мегу, стр 166 Изменено 11 февраля, 2008 пользователем Liseev Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vesago 0 11 февраля, 2008 Опубликовано 11 февраля, 2008 · Жалоба Пример: //:::::::::::::::::::::::::::::::::::::::::::::::::::::: // //:::::::::::::::::::::::::::::::::::::::::::::::::::::: 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 0 11 февраля, 2008 Опубликовано 11 февраля, 2008 · Жалоба А что у вас творится с ножкой SS? Смотрите даташит на 128 мегу, стр 166 Liseev, спасибо, именно в ней дело, не сообразил, хотя даташит конечно читал, но этот момент не прочувствовал. vesago, спасибо за пример! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться