Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Нужна помощь по SPI


Автор: msreds 13.5.2014, 07:54
Здравствуйте! Нужна помощь по SPI, не могу реализовать передачу хотя бы одного бита хоть ты тресни:( Работаю в AtmelStudio 6.1, МК Atmega328p 2шт....

Автор: Romikgy 13.5.2014, 08:34
без исходных кодов никто не поможет ... и немного не в той теме пост

Автор: Toyamatokanava 13.5.2014, 09:39
Если расскажите по подробней, томожно будет помочь.

Автор: msreds 13.5.2014, 09:56
Toyamatokanava,

#include <pololu/3pi.h>
#define SPI_PORTX PORTB
#define SPI_DDRX DDRB

#define SPI_MISO 4
#define SPI_MOSI 3
#define SPI_SCK 5
#define SPI_SS 2

void SPI_MasterInit(void)
{
/* Установка MOSI и SCK на вывод, все остальные на ввод */
DDRB = (1«DDB3)|(1«DDB5);
/* Разрешение SPI в режиме мастера, установка скорости связи fck/16
*/SPCR = (1«SPE)|(1«MSTR)|(1«SPR0);
}
void atata()
{

}
void SPI_MasterTransmit(char cData)
{
/* Запуск передачи данных */
SPDR = cData;
/* Ожидание завершения передачи данных */
while(!(SPSR & (1«SPIF)));
}


/*инициализация SPI модуля в режиме master*/

int main()
{
atata();
//SPI_MasterInit();
}

из этого надо сделать рабочую передачу байта/бита/чего угодно

Автор: bsa 13.5.2014, 10:58
Я использую следующий код:
Код
void spiInit(void)
{
    SPCR = _BV(MSTR) | _BV(SPE); //enable SPI and select master mode
    PORTB = 0xF7;
    DDRB  = 0xB8;
}

void spiOpen(void)
{
    PORTB &= ~_BV(4);
}

uint8_t spiSend(uint8_t data)
{
    SPDR = data;
    while (!(SPSR & _BV(SPIF)));
    return SPDR;
}

uint8_t spiRecv(void)
{
    return spiSend(0);
}

void spiClose(void)
{
    PORTB |= _BV(4);
}

Сессия выглядит следующим образом: spiOpen(); spiSend(); spiRecv(); ... ; spiClose();

Автор: borisbn 13.5.2014, 13:28
Господа, а разве для SPI я не должен сам "махать" clock'ом, защёлкой и данными ?
Как-то доводилось работать с SPI через плату на PCI, которая тупо транслировала мои данные в SPI.
Там мне нужно было делать как-то так:
Код
    DIN_on = (BYTE)(1<<DIN_BIT);
    CLK_on = (BYTE)(1<<CLK_BIT);
    PROG_on = (BYTE)(1<<PROG_BIT);
//----- формирование бита данных -----
    data = bits[ i ] | DIN_on | PROG_on;
    SPI_PORT = data;
    SPI_PORT = data | CLK_on;
    SPI_PORT = data;

Если этот ваш SPDR такой умный, что сам всё это делает, то тогда простите, что влез ))

Автор: LeonidPr 13.5.2014, 13:33
не, сейчас не нужно махать. кидаете данные в регистр передачи, а дальше модуль SPI сам все разрулит. если прерывания настроены еще и обрабочик дернет, давай мол че там дальше? smile

Автор: bsa 13.5.2014, 14:02
Цитата(borisbn @  13.5.2014,  14:28 Найти цитируемый пост)
Если этот ваш SPDR такой умный,
Он не умный. Это всего лишь SPi Data Register.  smile 

Автор: msreds 14.5.2014, 09:31
bsa, что такое "&= ~" в 10 строке? 
моя программа совсем не катит?
мне в итоге надо нажать кнопку на одном устройстве, а работу должно начать другое))

Автор: Toyamatokanava 14.5.2014, 09:54
Код
 
PORTB &= ~_BV(4);// Это значит, что portb 4 устанавливаем в 0

Автор: msreds 14.5.2014, 10:03
передача ведь идёт через B3, почему его нет вообще?)

Автор: msreds 15.5.2014, 05:44
Цитата(bsa @  13.5.2014,  10:58 Найти цитируемый пост)
Я использую следующий код

Не мог бы ты поделиться ещё приёмом?))

Автор: bsa 15.5.2014, 10:24
Цитата(msreds @  15.5.2014,  06:44 Найти цитируемый пост)
Не мог бы ты поделиться ещё приёмом?))
каким?

Автор: bsa 19.5.2014, 09:56
msreds, ты уверен, что у тебя проблема именно в spi, а не в устройствах к нему подключенных. Осциллографом проверь.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)