реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Не включается SPI в Atmega128, прошу помощи
Panych
сообщение Feb 11 2008, 10:30
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 335
Регистрация: 17-06-04
Из: Москва
Пользователь №: 35



Почему может не включаться 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 переводит их обратно.
Чего-то не понимаю?
Плату прозвонил, микруха свежеустановленная...


--------------------
Всегда не хватает времени, чтобы выполнить работу как надо, но на то, чтобы ее переделать, время находится. (Закон Мескимена.)
Go to the top of the page
 
+Quote Post
Liseev
сообщение Feb 11 2008, 10:48
Сообщение #2


Частый гость
**

Группа: Свой
Сообщений: 99
Регистрация: 27-10-07
Из: СПб
Пользователь №: 31 797



А что у вас творится с ножкой SS?
Если вы используете режим MASTER и SS определен как вход, то низкий уровень на нем будет воспринят контроллером как попытка другим мастером на шине начать цикл передачи, соответственно контроллер автоматически перейдет в режим SLAVE и будет ждать, когда на входе SCK появятся тактовые импульсы...

Смотрите даташит на 128 мегу, стр 166

Сообщение отредактировал Liseev - Feb 11 2008, 10:49
Go to the top of the page
 
+Quote Post
vesago
сообщение Feb 11 2008, 10:50
Сообщение #3


Тутэйшы
****

Группа: Свой
Сообщений: 708
Регистрация: 30-11-04
Пользователь №: 1 263



Пример:
Код
//::::::::::::::::::::::::::::::::::::::::::::::::::::::
//
//::::::::::::::::::::::::::::::::::::::::::::::::::::::
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;
}
Go to the top of the page
 
+Quote Post
Panych
сообщение Feb 11 2008, 11:29
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 335
Регистрация: 17-06-04
Из: Москва
Пользователь №: 35



Цитата(Liseev @ Feb 11 2008, 13:48) *
А что у вас творится с ножкой SS?
Смотрите даташит на 128 мегу, стр 166

Liseev, спасибо, именно в ней дело, не сообразил, хотя даташит конечно читал, но этот момент не прочувствовал.
vesago, спасибо за пример!


--------------------
Всегда не хватает времени, чтобы выполнить работу как надо, но на то, чтобы ее переделать, время находится. (Закон Мескимена.)
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 08:03
Рейтинг@Mail.ru


Страница сгенерированна за 0.01355 секунд с 7
ELECTRONIX ©2004-2016