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

 
 
> Программный SPI (для карты памяти MMC), нужна помощь
sergeus
сообщение Nov 26 2009, 19:34
Сообщение #1


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

Группа: Участник
Сообщений: 157
Регистрация: 11-12-07
Из: Москва
Пользователь №: 33 174



Здравствуйте!
Уже больше часа бьюсь с программной реализацией SPI. При аппаратной реализации карточка памяти инициализировалась и даже читалась, все было нормально. Встала задача реализовать сей интерфейс программно. Вот кусок кода:
Код
unsigned char spi_transmit(unsigned char data){
  unsigned char value,i;
  for (i=0;i<8;i++){
    asm("nop");
    SCK_0;
    asm("nop");
    if ((data & 0b10000000) != 0) SPI_PORT |= (1<<MOSI);
    asm("nop");
    data = data << 1;
    asm("nop");
    value = value << 1;
    SCK_1;
    asm("nop");
    if ((SPI_PIN & (1<<MISO)) != 0){
      value |=0b00000001;
    }
  }
  return value;
}

Может кто свежим взглядом заметит баг.
Тактовая контроллера 8 МГц, контроллер - ATmega48.

Забыл добавить, вот дефайны:
Код
#define MOSI    5
#define MISO    4
#define SCK        3
#define SS        2
#define SPI_DDR    DDRC
#define SPI_PORT PORTC
#define SPI_PIN PINC

#define cbi(reg, bit) (reg&=~(1<<bit))
#define sbi(reg, bit) (reg|= (1<<bit))

#define MMC_CS_1         sbi(SPI_PORT, SS)
#define MMC_CS_0         cbi(SPI_PORT, SS)

#define SCK_1         sbi(SPI_PORT, SCK)
#define SCK_0         cbi(SPI_PORT, SCK)


заметил баг в первом else, ща попробую скомпилить

Сообщение отредактировал sergeus - Nov 26 2009, 19:31
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 2)
aaarrr
сообщение Nov 26 2009, 20:25
Сообщение #2


Гуру
******

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



Тут не хватает установки "0":
Код
if ((data & 0b10000000) != 0) SPI_PORT |= (1<<MOSI);


Переменную value можно спокойно заменить на data. И подумайте, нужны ли вам на самом деле nop'ы.
Go to the top of the page
 
+Quote Post
sergeus
сообщение Nov 26 2009, 21:14
Сообщение #3


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

Группа: Участник
Сообщений: 157
Регистрация: 11-12-07
Из: Москва
Пользователь №: 33 174



Да, спасибо Вам rolleyes.gif.
Я уже это исправил, тоже заметил.
вот как у меня получилось:
Код
unsigned char spi_transmit(unsigned char data){
  unsigned char value,i;
  for (i=0;i<8;i++){
    asm("nop");
    SCK_0;
    asm("nop");
    if ((data & 0b10000000) != 0) SPI_PORT |= (1<<MOSI);
    else SPI_PORT &=~(1<<MOSI);
    asm("nop");
    data = data << 1;
    asm("nop");
    value = value << 1;
    SCK_1;
    asm("nop");
    if ((SPI_PIN & (1<<MISO)) != 0){
      value |=0b00000001;
    }
  }
  return value;
}


Да, наверное, nop`ы излишне, с переменной value Вы тоже правы. Но главное, что заработало!!!
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 10:46
Рейтинг@Mail.ru


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