an_ga 0 13 марта, 2009 Опубликовано 13 марта, 2009 · Жалоба Всем доброго времени суток! Столкнулся со следующей проблемкой. Контроллер общается с АЦП по SPI. Сначала это был софтовый SPI. Потом взял AT89S8252. Запустить внем SPI не удалось. Даташит выучил наизусть- всеравно нет. Пришлось оставить софтовый. Потихоньку перешел на AT89S8253. Попробовал - заработало. Зашиваю в 8252 - фигвамы рисует. Может кто-то сталкивался с проблемой? Буду благодарен за намек. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Pretorianec 0 17 марта, 2009 Опубликовано 17 марта, 2009 · Жалоба А в каком режиме вы запускали SPI на 8253? Enhanced mode или обычный? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
an_ga 0 21 марта, 2009 Опубликовано 21 марта, 2009 · Жалоба Обычный. Просто изначально все делалось для 8252 и не заработало. Потом ткнул в 8253-пошло. Странно, что я не так делаю? void init_SPI(void); //Инициализация SPI void init_ADS(void); //Инициализация АЦП void spi_out(unsigned char); //Отправка байта по SPI unsigned char spi_in(void); //Прием байта по SPI char code init_ADS_word[5]={0x64,0x42,0x20,0x98,0x6A};//Инструкция+4байта параметров АЦП void init_SPI() { SPCR=0x50; //01010000 /* SPR0=0 Частота SCK SPR1=0 CPHA=0 SCK___/``` CPOL=0 SCK___ MSTR=1 Master DORD=0 Старшим битом вперед SPE=1 SPI разрешен SPIE=0 Прерывание от SPI запрещено*/ } //------------------------------------------------------------------------- void init_ADS() { char j; IE1=0; while(!IE1);//Ждем DRDY от АЦП for(j=0;j<5;j++) { spi_out(init_ADS_word[j]); } } //------------------------------------------------------------------------- void spi_out(unsigned char byte) { unsigned char k; SPDR=byte; do { //Ожидаем отправки k=SPSR; k&=SPIF_; } while(!k); } //------------------------------------------------------------------------- unsigned char spi_in() { unsigned char k; SPDR=0xFF; //Фиктивная отправка do { //Ожидаем приема k=SPSR; k&=SPIF_; } while(!k); return SPDR; } //------------------------------------------------------------------------- Спасибо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
BaHo85 0 23 апреля, 2009 Опубликовано 23 апреля, 2009 · Жалоба Для начала хотелось бы знать, вы уверены что ваш 8252 рабочий? Потому как очень часто первопричина неисправности - вышедший из строя контроллер? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
an_ga 0 23 апреля, 2009 Опубликовано 23 апреля, 2009 (изменено) · Жалоба Для начала хотелось бы знать, вы уверены что ваш 8252 рабочий? Потому как очень часто первопричина неисправности - вышедший из строя контроллер? Спасибо за интерес к вопросу. Думаю, что рабочий, т.к. делал попытки в разное время с разными микросхемами. А то что он программируется по SPI, это показатель? Скорее всего я где-то лохонулся, но не знаю где. Изменено 23 апреля, 2009 пользователем an_ga Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mrcashe 0 30 апреля, 2009 Опубликовано 30 апреля, 2009 · Жалоба Спасибо за интерес к вопросу. Думаю, что рабочий, т.к. делал попытки в разное время с разными микросхемами. А то что он программируется по SPI, это показатель? Скорее всего я где-то лохонулся, но не знаю где. Да вроде всё в нормале с кодом. У меня подобный бегает на 8252. А то, что программируется через SPI, так это ещё не показатель. Разве что SPR1:SPR0 == 0 дают частоту Fosc/4, что не каждый дивайс может проглотить. Но если 8253 способен общаться с данным АЦП, то не в этом дело. Тем более, расширенный режим здесь не используется, как я понимаю. Вдогонку. Красивее ввод/вывод делать при помощи одной функции (код для sdcc): unsigned char spi_io(unsigned char value) { SPSR &= ~SPSR_SPIF; SPDR = value; while (0 == (SPSR & SPSR_SPIF)) {} return SPDR; } Тогда читаем данные при помощи: unsigned char value = spi_io(0xff); Выход SS (Slave Select) не используется, я так мыслю? Тогда должно бы работать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mikekk 0 14 июля, 2009 Опубликовано 14 июля, 2009 · Жалоба Смотря какого года у тебя 8252. До определенного релиза SPI у него не работал. Не помню точно, но кажись заработал как минимум после F или H. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Rimid 0 26 июля, 2009 Опубликовано 26 июля, 2009 · Жалоба Недавно работал с AT89S8252. SPI работал без пролем. Но сначала я его настраиваю, а потом уже устанавливаю бит SPE (так предлагалось в даташите на АЦП AD7705) SPCR = 0x3d; //CPHA=1, CPOL=1, MSTR=1, DORD=1, SPR1=0, SPR0=1 SPCR = 0x7d; //разрешаем SPI (SPE=1) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
public32 0 8 января, 2010 Опубликовано 8 января, 2010 · Жалоба Извиняюсь, может не к месту уже... у меня SPI на аналогичном чипе заработал стабильно только после добавления сопротивлений в линии SCLK, MISO и MOSI. добавил порядка 200 Ом. Тоже поначалу думал, что проблема в коде. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mikryukovsl 0 28 августа, 2010 Опубликовано 28 августа, 2010 · Жалоба Извиняюсь, может не к месту уже... у меня SPI на аналогичном чипе заработал стабильно только после добавления сопротивлений в линии SCLK, MISO и MOSI. добавил порядка 200 Ом. Тоже поначалу думал, что проблема в коде. Это точно. В этих сериях микросхем единички очень слабые, большой ток только короткое время, для этого Push-pull надо включать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться