LINUX.ORG.RU

SPI slave atmega8 и линуксовый SPI

 , ,


0

1

Смеркалось.

Подруживаю одноплатник с линуксом с мегой по SPI. Линуксовая часть получилась отменной, а в от самое простое, мега, два дня уже ниче не отвечает.

Мега работает в слейве, на прием все идеально, а в ответ не шлет ни бита. Микруху менял на новую – то же самое. Мега-код:

#define LED_PORT PORTC
#define LED_DDR  DDRC
#define LED_PIN  PINC
#define LED_BIT  PC5

#define PORT_SPI PORTB
#define DDR_SPI  DDRB
#define PIN_SPI  PINB
#define SCK      PB5
#define MISO     PB4
#define MOSI     PB3
#define SS       PB2

#include <avr/io.h>
#include <util/delay.h>

void SPI_init_S (void){
  DDR_SPI  &= ~(1<<MOSI);
  PORT_SPI &= ~(1<<MOSI);

  DDR_SPI  |=  (1<<MISO);
  PORT_SPI &= ~(1<<MISO);

  DDR_SPI  &= ~(1<<SCK);
  PORT_SPI &= ~(1<<SCK);

  DDR_SPI  &=  (1<<SS);
  PORT_SPI |=  (1<<SS);
  SPCR =  (1<<SPE);
}

unsigned char SPI_WR (unsigned char data_w) {
  SPDR = data_w;
  while (!(SPSR & (1<<SPIF)));
  return (SPDR);
}

int main(void) {
  CONFUGURE_PIN_AS_OUTPUT( LED_DDR, LED_BIT );

  SET_PIN_LOW( LED_PORT, LED_BIT );

  unsigned char data_w = 'B', data_r; 

  SPI_init_S();

  while(1){
    data_r = SPI_WR(data_w);
    data_r = SPI_WR(data_w);
    data_r = SPI_WR(data_w);
    if (data_r == 0) SET_PIN_LOW( LED_PORT, LED_BIT );
    if (data_r == 255) SET_PIN_HIGH( LED_PORT, LED_BIT );
  }

  return 0;
}

джва раза перечитал датащит, не пойму что там может не работать. Если укого завалялся гарантированно-рабочий пример – буду признателен.

(проблемы точно не на принимающей стороне, смотрю лог анализатором, даже прямо к ножке припаивался)

★★★★★

на прием все идеально

Светодиод переключается?

Ты точно проверил, что не перепутал линию MISO на схеме?

Режим Master пробовал?

apt_install_lrzsz ★★★
()
Ответ на: комментарий от apt_install_lrzsz

Светодиод переключается?

Да, все четко

Ты точно проверил, что не перепутал линию MISO на схеме?

Да уже сто раз, говорю ж – прямо к ноге припаивался

Режим Master пробовал?

Хм.. нет. Но, даже если заработает, что с того? Мне нужен слейв.

pihter ★★★★★
() автор топика
Последнее исправление: pihter (всего исправлений: 1)
Ответ на: комментарий от apt_install_lrzsz

К тому же, программатором оно через SPI шьется, так что пины точно не перепутаны

pihter ★★★★★
() автор топика
Ответ на: комментарий от pihter

Ну и на лог-анализаторе MOSI работает четко, а MISO вчегда 1. Даже если от всего отключить и прямым проводком – в лог анализатор. Микрухи менял, стало быть – код.

(о! можно попытаться собрать на макетке, чтоб исключить случайное замыкание на VCC!)

pihter ★★★★★
() автор топика
Ответ на: комментарий от pihter

стало быть – код.

Код-то по даташиту совсем примитивный.

чтоб исключить случайное замыкание на VCC

А я правильно понимаю, что на avr линию MISO нельзя в режим GPIO переключить?

apt_install_lrzsz ★★★
()
Ответ на: комментарий от apt_install_lrzsz

Код-то по даташиту совсем примитивный.

и тем не менее – бутлоадер по этому же аппаратному эспиаю прошивку зашивает и читает – следовательно аппаратные проблемы исключаются

А я правильно понимаю, что на avr линию MISO нельзя в режим GPIO переключить?

можно, когда SPI не активирован, а когда активирован, то режим пина меняется по ситуаци, аппаратно, сам (если я все верно понимаю – когда активирован эспиай – по переключить уже не получится, пока не деактивируешь взад)

pihter ★★★★★
() автор топика

DDR_SPI &= (1<<SS);

Я не хочу лезть в даташит, потому что не могу сейчас. Ничего не помню по конфигурации. Процитированный кусок правильно? Не ~(1<<SS)? Инвертировать то есть.

Zubok ★★★★★
()
Ответ на: комментарий от Zubok

Кстати говоря. В примере из даташита настраивается только MISO.

@pihter, ты пробовал убрать эту инициализацию, чтобы оставить конфигурацию по умолчанию для линии?

apt_install_lrzsz ★★★
()
Ответ на: комментарий от Zubok

Инвертировать то есть.

ААААААААА!!!!!!!! Падла! Два вечера убил на это!

Конечно опечатался!

Ладно, позор мне, слава ЛОРу! Спасибо, мужики!

pihter ★★★★★
() автор топика
Ответ на: комментарий от apt_install_lrzsz

ты пробовал убрать эту инициализацию

да как-то не пошла мысль в эту сторону: прием-то работал, я все внимание на линию отдачи, там все десять раз пересмотрел, а оно тупо перетиралось!

Ладно, опыт – сын ошибок трудных. Искренне спасибо за то что откликнулся!

pihter ★★★★★
() автор топика
Ответ на: комментарий от u-235

Вера позволяет. Но я сам. И avr редко. STM8 удобнее.

bga_ ★★★★
()
Ответ на: комментарий от bga_

Я ж так и сделал, видно же по коду

pihter ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.