Jump to content

    

dW2005

Участник
  • Content Count

    5
  • Joined

  • Last visited

Community Reputation

0 Обычный
  1. @ivn ->Чип менять пробовал (есть 2 идентичные платы) @k155la3 -> 1) буферизация есть, во всяком случае если верить даташиту: Другой вопрос что если верить тому же даташиту, можно пихать данные в SPDR даже перед чтением очередного пришедшего байта, на практике этого как-то не видно. (2) До прихода 2 недели назад некоего студиозуса для прохождения практики ассортимент всякой измерительно-аналитической техники был побольше. К сожалению сей талантливый индивид за неделю каким-то образом ухайдохал осциллограф цифровой обычный - одна штука, старенький осциллограф-примочка к РС Disco - одна штука и мультиметр - одна штука. Судя по выгоревшему в последнем предохранителю, не обошлось без ~220v.
  2. В меге SPI interrupt у слейва возникает после приема очередного байта от мастера. Коллизии возникают вида "запись в регистр во время активной передачи данных". Частота SPI у ADUC'a самая медленная, Fclk/16. Жаль что до понедельника напрочь отсутствует осциллограф, а вместе с ним и возможность взглянуть поподробнее на творящееся безобразие :(
  3. Полагаю, вас могли ввести в заблуждение аргументы функции set_spi_ss(), но с ними, увы, все хорошо. Это индекс слейвселекта для вывода на МС дешифратора; сейчас их используется 3 штуки. void set_spi_ss(unsigned char ss) { SPI_SS1 = ss & 0x01; SPI_SS2 = (ss & 0x02) >> 1; }
  4. В передаче-приеме каждого байта есть ожидание конца передачи вида "SPIDAT = ХХХ; while(ISPI == 0);"
  5. Доброго времени суток, возникла необходимость допилить уже существующий девайс на восьмой меге, добавив туда измерение времени с выдачей результата мастеру на ADUC836. Проблема в том, что постоянно возникают коллизии при записи ответа в SPDR, пробовал добавлять на мастере задержки между отправляемыми байтами - безрезультатно. Кусок кода мастера (с51) выглядит так: set_spi_ss(1); delay_ms(1); // signature cs = 'F'; EA = 0; SPIDAT = cs; while(ISPI == 0); ISPI = 0; b = SPIDAT; EA=1; spi_test[0] = b; //mode cs += 5; EA=0; SPIDAT = 5; while(ISPI == 0); ISPI = 0; b = SPIDAT; EA = 1; spi_test[0] = b; ... (тут остальные байты пакета данных) set_spi_ss(0); delay_ms(1); Код мастера отлажен и работает с данным девайсом (только на передачу), ЦАПом, флешкой. Полярность/фаза у обоих естественно те же самые. Код slave'a (avrgcc) покамест вообще обрезал до безобразия, убрав запись в буфер/проверку SPCR на коллизии, оставив только "голый" ответ: void SPI_SlaveInit(void) { DDRB=(1<<PINB4) | (BIT(0)) | (BIT(1)); //MISO as OUTPUT SPCR=(1<<SPE)|(1<<SPIE); //Enable SPI && interrupt enable bit SPDR=0x88; } ISR (SPI_STC_vect) { UCHAR c = SPDR; SPDR = 0x55; // that's what i'm trying to send back } В свое время делал подобный обмен по SPI на 8051-совместимых и STM32, подобных проблем не вылезало :(. Буду премного благодарен за любой пинок в нужном направлении.