Форум
 

Вернуться   Форум "Фрикер Клуб" - кодграббер своими руками > Основной раздел > Микроконтроллеры

Важная информация

Ответ
 
Опции темы Опции просмотра
Старый 13.04.2014, 18:35   #11
Бурый Меню Пользователя
Резидент клуба
 
Аватар для Бурый
 
Регистрация: 05.01.2014
Сообщений: 438
По умолчанию Re: attiny2313 программный SPI

Окай, есть Atmega328, но к сожалению я так и не понял как пользовать аппаратный SPI, если мог бы пояснить в детялях, буду очень благодарен, в просторах инета не смог найти.
Бурый вне форума   Ответить с цитированием
Старый 13.04.2014, 19:48   #12
Paul74s Меню Пользователя
Резидент клуба
 
Аватар для Paul74s
 
Регистрация: 16.11.2012
Сообщений: 587
По умолчанию Re: attiny2313 программный SPI

Я пишу CVAVR и проблем не возникало, больше проблем с железом. Разбирался с SPI при работе с SD-card, пробовал и программный и аппаратный.
Работать с аппаратным SPI вполне просто, делаеш настройку, а дальше одной процедурой a=SPI(); управляеш устройством в соответствии с его даташитом.
Настройка МК для работы (частота 8МГц), ноги МК стандартные SCK, MISO, MOSI, а вот нога SS (выбор устройства) - по твоему усмотрению:

Код:
#include <spi.h>
#define SS PORTB.6

// SPI initialization
// SPI Type: Master
// SPI Clock Rate: 2000,0 kHz - 50
// SPI Clock Rate:  500,0 kHz - 51
// SPI Clock Rate:  125,0 kHz - 52
// SPI Clock Rate:   62,5 kHz - 53
// SPI Clock Phase: Cycle Start
// SPI Clock Polarity: Low
// SPI Data Order: MSB First
SPCR=0x50;
SPSR=0x00;
Вот процедуры инициализации и работы с SD-card, тут много можно понять
Код:
// отправка команды карте по SPI
unsigned char sd_cmd (unsigned char a, unsigned char b, unsigned char c, 
                      unsigned char d, unsigned char e, unsigned char f) {
  unsigned int s;
  unsigned char o;
  spi(0xFF); spi(0xFF); // передаем пустые команды по ДШ
  spi(a); spi(b); spi(c); spi(d); spi(e); spi(f); // передаем команду
  // ждем ответа или превышение тайм-аута
  s=0; do { o=spi(0xFF); s++; } while ( s<0xFE && o==0xFF ); 
  if (s>=0xFE) return 0xFF; // возвращаем код "ошибка"
  return o; // возвращаем ответ от устройства SPI
}

// Инициализация карты
unsigned char sd_init(void) {
  unsigned char o, k;
  SS=1; for (o=0; o<20; o++) spi(0xFF); // по ДШ SD нужно предварительно дать меандр на SCK
  SS=0; // активируем выбор устройства
  o=sd_cmd(0x40, 0, 0, 0, 0, 0x95); // передаем команду CMD40 по ДШ и получаем ответ
  if (o==0x01) { // устройство ответило готовностью
    k=32; 
    do {
      o=sd_cmd(0x41, 0, 0, 0, 0, 0x95); // передаем команду CMD41 по ДШ и получаем ответ
      k--; delay_ms(20);
    } while (k && o); // ожидаем ответа от устройства, до 640 мс
    SS=1; // деактивируем устройство
    if (k==0) return 0xF1; // error CMD41
  } else { SS=1; return 0xF0; } // error CMD40 
  SS=1; // деактивируем устройство
  return 0; // ok  
}
На днях в протеусе разбирался с LCD Nokia 1202, там 9 битный SPI, поэтому на ATmega168 надо было делать программный SPI, могу сбросить проект протеуса и исходник, на железе пока не опробовал, руки не доходят выдернуть экран из телефона.
Paul74s вне форума   Ответить с цитированием
Старый 13.04.2014, 20:09   #13
Бурый Меню Пользователя
Резидент клуба
 
Аватар для Бурый
 
Регистрация: 05.01.2014
Сообщений: 438
По умолчанию Re: attiny2313 программный SPI

Цитата:
Сообщение от Paul74s
Я пишу CVAVR и проблем не возникало, больше проблем с железом. Разбирался с SPI при работе с SD-card, пробовал и программный и аппаратный.
Работать с аппаратным SPI вполне просто, делаеш настройку, а дальше одной процедурой a=SPI(); управляеш устройством в соответствии с его даташитом.
Настройка МК для работы (частота 8МГц), ноги МК стандартные SCK, MISO, MOSI, а вот нога SS (выбор устройства) - по твоему усмотрению:

Код:
#include <spi.h>
#define SS PORTB.6

// SPI initialization
// SPI Type: Master
// SPI Clock Rate: 2000,0 kHz - 50
// SPI Clock Rate:  500,0 kHz - 51
// SPI Clock Rate:  125,0 kHz - 52
// SPI Clock Rate:   62,5 kHz - 53
// SPI Clock Phase: Cycle Start
// SPI Clock Polarity: Low
// SPI Data Order: MSB First
SPCR=0x50;
SPSR=0x00;
Вот процедуры инициализации и работы с SD-card, тут много можно понять
Код:
// отправка команды карте по SPI
unsigned char sd_cmd (unsigned char a, unsigned char b, unsigned char c, 
                      unsigned char d, unsigned char e, unsigned char f) {
  unsigned int s;
  unsigned char o;
  spi(0xFF); spi(0xFF); // передаем пустые команды по ДШ
  spi(a); spi(b); spi(c); spi(d); spi(e); spi(f); // передаем команду
  // ждем ответа или превышение тайм-аута
  s=0; do { o=spi(0xFF); s++; } while ( s<0xFE && o==0xFF ); 
  if (s>=0xFE) return 0xFF; // возвращаем код "ошибка"
  return o; // возвращаем ответ от устройства SPI
}

// Инициализация карты
unsigned char sd_init(void) {
  unsigned char o, k;
  SS=1; for (o=0; o<20; o++) spi(0xFF); // по ДШ SD нужно предварительно дать меандр на SCK
  SS=0; // активируем выбор устройства
  o=sd_cmd(0x40, 0, 0, 0, 0, 0x95); // передаем команду CMD40 по ДШ и получаем ответ
  if (o==0x01) { // устройство ответило готовностью
    k=32; 
    do {
      o=sd_cmd(0x41, 0, 0, 0, 0, 0x95); // передаем команду CMD41 по ДШ и получаем ответ
      k--; delay_ms(20);
    } while (k && o); // ожидаем ответа от устройства, до 640 мс
    SS=1; // деактивируем устройство
    if (k==0) return 0xF1; // error CMD41
  } else { SS=1; return 0xF0; } // error CMD40 
  SS=1; // деактивируем устройство
  return 0; // ok  
}
На днях в протеусе разбирался с LCD Nokia 1202, там 9 битный SPI, поэтому на ATmega168 надо было делать программный SPI, могу сбросить проект протеуса и исходник, на железе пока не опробовал, руки не доходят выдернуть экран из телефона.

Спасибо, нашел вроде книгу там описываются регистры SPI (настойка), попробую сам, а так конечно обращусь - спасибо за помощь!
Бурый вне форума   Ответить с цитированием
Старый 13.04.2014, 20:44   #14
Paul74s Меню Пользователя
Резидент клуба
 
Аватар для Paul74s
 
Регистрация: 16.11.2012
Сообщений: 587
По умолчанию Re: attiny2313 программный SPI

Разбирайся, все можно осилить и заставить работать.
Paul74s вне форума   Ответить с цитированием
Старый 13.04.2014, 20:53   #15
Бурый Меню Пользователя
Резидент клуба
 
Аватар для Бурый
 
Регистрация: 05.01.2014
Сообщений: 438
По умолчанию Re: attiny2313 программный SPI

пытаюсь цикл объявить
Цитата:
for(int a=0;a<74;a++)
{
spi(config[a];

}

ругается
Error: C:\cvavr2\bin\prj\atmega328\1.c(266): undefined symbol 'int'
Error: C:\cvavr2\bin\prj\atmega328\1.c(266): undefined symbol 'a'
Error: C:\cvavr2\bin\prj\atmega328\1.c(266): undefined symbol 'a'
Error: C:\cvavr2\bin\prj\atmega328\1.c(269): declaration syntax error

Пробовал перед циклом объявить int a;
Error: C:\cvavr2\bin\prj\atmega328\1.c(265): must declare first in block

Что не так?!
Бурый вне форума   Ответить с цитированием
Старый 14.04.2014, 06:10   #16
Paul74s Меню Пользователя
Резидент клуба
 
Аватар для Paul74s
 
Регистрация: 16.11.2012
Сообщений: 587
По умолчанию Re: attiny2313 программный SPI

Цитата:
Сообщение от gafbich
пытаюсь цикл объявить

ругается

Что не так?!

int a; - объвляется в начале процедуры или главной программы, если глобальная переменная то перед процедурами
Код:
#include ...
int global_a; - глобальная переменная доступна во всех процедурах и программе
 
void pocedure1(void) {
  int proc_a; - переменная для процедуры, доступна только тут
...
}
 
void main(void){
int main_a; - переменная для программы main, доступна только тут
...
for(...
}
spi(config[a] ) ; - а где скобка
зачем для переменной размерностью до 255 (char) объявлять переменную int (65535).
Int занимает 2 байта памяти, да и операции с такими переменными дольше выполняются.
Paul74s вне форума   Ответить с цитированием
Старый 14.04.2014, 21:53   #17
Бурый Меню Пользователя
Резидент клуба
 
Аватар для Бурый
 
Регистрация: 05.01.2014
Сообщений: 438
По умолчанию Re: attiny2313 программный SPI

Если не сложно - я все-таки попрошу у тебя помощи в освоении SPI на AVR - ни как не получается, int a в моем случае счетчик
Бурый вне форума   Ответить с цитированием
Старый 15.04.2014, 02:47   #18
DIVER_SANT Меню Пользователя
Модератор
 
Аватар для DIVER_SANT
 
Регистрация: 27.03.2011
Сообщений: 2,256
По умолчанию Re: attiny2313 программный SPI

http://avr-start.ru/?p=647
Этот материальчик не поможет?
__________________
Правильно поставленный вопрос-на половину полученный ответ;)
++++++++++++++++++++++++++++++++++++++
[url]http://www.youtube.com/watch?v=ktnn-s3ebzw[/url]
DIVER_SANT вне форума   Ответить с цитированием
Старый 15.04.2014, 21:22   #19
Бурый Меню Пользователя
Резидент клуба
 
Аватар для Бурый
 
Регистрация: 05.01.2014
Сообщений: 438
По умолчанию Re: attiny2313 программный SPI

Спасибо Paul74s и DIVER_SANT, разобрался с SPI - посмотрел по логическому анализатору все ок, а вот модуль так и не запустился - а на ардуино работает - при этом МК один и тот же ниже приведу код, который у меня получился.

Код:
/*****************************************************
This program was produced by the
CodeWizardAVR V2.05.0 Evaluation
Automatic Program Generator
© Copyright 1998-2010 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com

Project : 
Version : 
Date    : 15.04.2014
Author  : Freeware, for evaluation and non-commercial use only
Company : 
Comments: 


Chip type               : ATmega328P
Program type            : Application
AVR Core Clock frequency: 16,000000 MHz
Memory model            : Small
External RAM size       : 0
Data Stack size         : 512
*****************************************************/

#include <mega328p.h>
#include <delay.h>
// SPI functions
#include <spi.h>
#define SS PORTB.1
#define GL PORTD.7



#define SRES 0x30
#define SCAL 0x33
#define SRX 0x34
#define STX 0x35
#define SIDLE 0x36
#define SPWD 0x39

#define IOCFG2 0x00
#define IOCFG1 0x01
#define IOCFG0 0x02
#define FIFOTHR 0x03
#define SYNC1 0x04
#define SYNC0 0x05
#define PKTLEN 0x06
#define PKTCTRL1 0x07
#define PKTCTRL0 0x08
#define ADDR 0x09
#define CHANNR 0x0A
#define FSCTRL1 0x0B
#define FSCTRL0 0x0C
#define FREQ2 0x0D
#define FREQ1 0x0E
#define FREQ0 0x0F
#define MDMCFG4 0x10
#define MDMCFG3 0x11
#define MDMCFG2 0x12
#define MDMCFG1 0x13
#define MDMCFG0 0x14
#define DEVIATN 0x15
#define MCSM2 0x16
#define MCSM1 0x17
#define MCSM0 0x18
#define FOCCFG 0x19
#define BSCFG 0x1A
#define AGCTRL2 0x1B
#define AGCTRL1 0x1C
#define AGCTRL0 0x1D
#define WOREVT1 0x1E
#define WOREVT0 0x1F
#define WORCTRL 0x20
#define FREND1 0x21
#define FREND0 0x22
#define FSCAL3 0x23
#define FSCAL2 0x24
#define FSCAL1 0x25
#define FSCAL0 0x26
#define RCCTRL1 0x27
#define RCCTRL0 0x28
#define FSTEST 0x29
#define PTEST 0x2A
#define AGCTEST 0x2B
#define TEST2 0x2C
#define TEST1 0x2D
#define TEST0 0x2E
#define PATABLE 0x3E

const char config_cc[] =
{
IOCFG0, 0b00000000,
IOCFG2, 0b00001101,
FIFOTHR, 0b01000111,
PKTCTRL0,0b00110010,
FSCTRL1, 0x06,
FSCTRL0, 0x00,
FREQ2, 0x10,
FREQ1, 0xB0,
FREQ0, 0x71,
MDMCFG4, 0xF5,
MDMCFG3, 0x83,
MDMCFG2, 0x33,
MDMCFG1, 0x23,
MDMCFG0, 0xFF,
MCSM2, 0x07,
MCSM1, 0x30,
MCSM0, 0x18,
AGCTRL2, 0x03,
AGCTRL1, 0x40,
AGCTRL0, 0x91,
FREND1, 0x56,
FREND0, 0x17,
FSCAL3, 0xEA,
FSCAL2, 0x2A,
FSCAL1, 0x00,
FSCAL0, 0x1F,
TEST2, 0x81,
TEST1, 0x35,
TEST0, 0x09,
PATABLE, 0x00,
PATABLE, 0x12,
PATABLE, 0x0E,
PATABLE, 0x34,
PATABLE, 0x60,
PATABLE, 0xc5,
PATABLE, 0xc1,
PATABLE, 0xc0
};




void cc1101_strobe(char s)
{
SS=0;
#asm("nop");
spi(s);
#asm("nop");
SS=1;
}

void rtx_tx()
{
cc1101_strobe(SIDLE);
cc1101_strobe(STX);
}

void cc1101_init()
{
int a;

cc1101_strobe(SRES);
#asm("nop");

SS=0;
#asm("nop");
for(a=0; a<75; a++){
spi(config_cc[a]);}
#asm("nop");
SS=1;
}


// Declare your global variables here

void main(void)
{

// Declare your local variables here

// Crystal Oscillator division factor: 1
#pragma optsize-
CLKPR=0x80;
CLKPR=0x00;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif

// Input/Output Ports initialization
// Port B initialization
// Func7=In Func6=In Func5=Out Func4=In Func3=Out Func2=Out Func1=In Func0=In 
// State7=T State6=T State5=0 State4=T State3=0 State2=0 State1=T State0=T 
PORTB=0x00;
//DDRB=0x2C;
DDRB=0xff;
DDRD=0xff;
// Port C initialization
// Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
// State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
PORTC=0x00;
DDRC=0x00;

// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
//PORTD=0x00;
//DDRD=0x00;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=0xFF
// OC0A output: Disconnected
// OC0B output: Disconnected
TCCR0A=0x00;
TCCR0B=0x00;
TCNT0=0x00;
OCR0A=0x00;
OCR0B=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer1 Stopped
// Mode: Normal top=0xFFFF
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer2 Stopped
// Mode: Normal top=0xFF
// OC2A output: Disconnected
// OC2B output: Disconnected
ASSR=0x00;
TCCR2A=0x00;
TCCR2B=0x00;
TCNT2=0x00;
OCR2A=0x00;
OCR2B=0x00;

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// Interrupt on any change on pins PCINT0-7: Off
// Interrupt on any change on pins PCINT8-14: Off
// Interrupt on any change on pins PCINT16-23: Off
EICRA=0x00;
EIMSK=0x00;
PCICR=0x00;

// Timer/Counter 0 Interrupt(s) initialization
TIMSK0=0x00;

// Timer/Counter 1 Interrupt(s) initialization
TIMSK1=0x00;

// Timer/Counter 2 Interrupt(s) initialization
TIMSK2=0x00;

// USART initialization
// USART disabled
UCSR0B=0x00;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
ADCSRB=0x00;
DIDR1=0x00;

// ADC initialization
// ADC disabled
ADCSRA=0x00;

// SPI initialization
// SPI Type: Master
// SPI Clock Rate: 125,000 kHz
// SPI Clock Phase: Cycle Half
// SPI Clock Polarity: Low
// SPI Data Order: MSB First
SPCR=0x57;
SPSR=0x00;

// TWI initialization
// TWI disabled
TWCR=0x00;

SS=1;
#asm("nop");

cc1101_init();
delay_ms(100);
rtx_tx();

    
while (1)
      {
      GL=1;
      delay_us(1400);
      GL=0;
      delay_us(1400); 
      }
}
Бурый вне форума   Ответить с цитированием
Старый 16.04.2014, 15:13   #20
Бурый Меню Пользователя
Резидент клуба
 
Аватар для Бурый
 
Регистрация: 05.01.2014
Сообщений: 438
По умолчанию Re: attiny2313 программный SPI

Скоро приедут еще трансиверы CC1101, один из них UART - но вопрос как его программировать - подпаиваться к плате (чипу)?!
Изображения
Тип файла: jpg cc1101.jpg (182.7 Кб, 20 просмотров)
Бурый вне форума   Ответить с цитированием
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.



Текущее время: 04:26. Часовой пояс GMT +3.


vBulletin 4.1.0 Перевод: zCarot
(C) www.phreakerclub.com
Яндекс.Метрика