AVR Раздел по микроконтроллерам компании Atmel - AVR / ATtiny / ATmega / ATMega128 / ATxmega, вопросы по программированию в AVR studio и все, относящееся к AVR... |
31.10.2014, 22:11
|
|
Временная регистрация
Регистрация: 31.10.2014
Сообщений: 59
Сказал спасибо: 24
Сказали Спасибо 7 раз(а) в 7 сообщении(ях)
|
Программный SPI
Нужна программная реализации spi в режиме мастера, использую этот пример, за исключением того, что код мастера реализован программно, но ничего не работает
Вот код мастера
Код:
|
#include ‹mega8.h›
#include ‹delay.h›
// Ножки интерфейса SPI
#define SPI_PORT PORTB
#define SPI_DDR DDRB
#define SPI_PIN PINB
//#define CS 0 // Выбор ведомого
#define MOSI 3 // Передатчик ведущего, приемник ведомого
#define MISO 4 // Приемник ведущего, передатчик ведомого
#define SCK 5 // Тактовый сигнал
void spi_init() {
SPI_DDR |= (1 ‹‹ MOSI) | (1 ‹‹ SCK); // На выход
// SPI_DDR |= (1 ‹‹ CS); // На выход
SPI_DDR &= ~(1 ‹‹ MISO); // На вход
}
unsigned char endData = 0;
char i;
unsigned char spi(char data) {
SPI_PORT &= ~(1 ‹‹ SCK); // SCK = 0
delay_us(20);
//SPI_PORT &= ~(1 ‹‹ CS); // CS = 0
endData = 0;
for(i = 0; i‹8; i++) {
SPI_PORT &= ~(1 ‹‹ MOSI); // MOSI = 0
if((data&(0b10000000)) == 0b10000000) {
SPI_PORT |= (1 ‹‹ MOSI); // MOSI = 1
}
endData = (endData ‹‹ (SPI_PIN & (1 ‹‹ MISO)));
delay_us(5);
SPI_PORT &= ~(1 ‹‹ SCK); // SCK = 0
data = (data ‹‹ 1);
delay_us(15);
SPI_PORT |= (1 ‹‹ SCK); // SCK = 1
}
SPI_PORT |= (1 ‹‹ MOSI); // MOSI = 1
delay_us(20);
//SPI_PORT |= (1 ‹‹ CS); // CS = 1
return endData;
}
void main(void) {
spi_init();
while(1) {
PORTB.2 = 0;
spi('1');
delay_ms(500);
spi('0');
delay_ms(500);
PORTB.2 = 1;
PORTB.1 = 0;
spi('1');
delay_ms(500);
spi('0');
delay_ms(500);
PORTB.1 = 1;
}
} |
|
|
|
|
31.10.2014, 22:54
|
|
Почётный гражданин KAZUS.RU
Регистрация: 20.03.2007
Адрес: "Братское кольцо враждебности", т.е. ближайшее заМКАДье.
Сообщений: 7,024
Сказал спасибо: 3,031
Сказали Спасибо 3,204 раз(а) в 2,174 сообщении(ях)
|
Re: Программный SPI
Сообщение от Fangir
|
Нужна программная реализации spi в режиме мастера,
|
А смысл городить программыный костыль для эмуляции такого простого интерфейса?
Сообщение от Fangir
|
использую этот пример, за исключением того, что код мастера реализован программно, но ничего не работает
|
Возможно потому, что PORTB.1 и PORTB.2 не настроены как выходы. Значит "ведомые" не выбраны для обмена и ничего не делают.
|
|
|
|
31.10.2014, 23:13
|
|
Временная регистрация
Регистрация: 31.10.2014
Сообщений: 59
Сказал спасибо: 24
Сказали Спасибо 7 раз(а) в 7 сообщении(ях)
|
Re: Программный SPI
Точно, я рептилоид и забыл про настройку портов на вывод х)
Реализую для ATtiny13, там нет SPI
Но все равно работает странно, срабатывают оба slave, потом верхняя отключается, после опять верхняя включается и они так и остаются работать
Последний раз редактировалось Fangir; 31.10.2014 в 23:21.
|
|
|
|
31.10.2014, 23:32
|
|
Временная регистрация
Регистрация: 31.10.2014
Сообщений: 59
Сказал спасибо: 24
Сказали Спасибо 7 раз(а) в 7 сообщении(ях)
|
Re: Программный SPI
Нашел ещё одну реализацию, выглядит красиво, но почему-то вообще не работает, что не так? Может надо что-то подправить? Потому что на радиокоте говорят что все работает
Код:
|
#include ‹mega8.h›
#include ‹delay.h›
#define MOSI PORTB.3
#define MISO PINB.4
#define SCK PORTB.5
unsigned char spi(unsigned char data){
unsigned char miso = 0;
unsigned char mask = 0x01; // если надо начинать со старшего бита - заменить на 0x80
for( ; mask; mask ‹‹= 1){ // если надо начинать со старшего бита - заменить на mask ››= 1;
MOSI = (data & mask)?0:1;
SCK = 1;
if(MISO) miso |= mask;
SCK = 0;
}
return miso;
}
void main(void) {
DDRB.3 = 1;
DDRB.4 = 0;
DDRB.5 = 1;
DDRB.2 = 1;
DDRB.1 = 1;
while(1) {
PORTB.2 = 0;
spi('1');
delay_ms(1000);
spi('0');
delay_ms(1000);
PORTB.2 = 1;
PORTB.1 = 0;
spi('1');
delay_ms(1000);
spi('0');
delay_ms(1000);
PORTB.1 = 1;
}
} |
|
|
|
|
02.11.2014, 08:32
|
|
Гражданин KAZUS.RU
Регистрация: 01.09.2007
Сообщений: 898
Сказал спасибо: 278
Сказали Спасибо 57 раз(а) в 54 сообщении(ях)
|
Re: Программный SPI
И что за устройство подключается к SPI ????
Может задержки нужны ???
|
|
|
|
02.11.2014, 10:02
|
|
Супер-модератор
Регистрация: 03.05.2007
Сообщений: 2,695
Сказал спасибо: 28
Сказали Спасибо 4,509 раз(а) в 956 сообщении(ях)
|
Re: Программный SPI
Сообщение от Fangir
|
Но все равно работает странно, срабатывают оба slave
|
А чё б им не срабатывать. Слабо в Википедию заглянуть? Читаем вЫнимательно про линию SS, она же CS, "... она же Элла Кацнельбоген, она же Людмила Огуренкова, она же Изольда Меньшова, она же Валентина Панеяд. — Сводня, воровка, четырежды судимая...".
Ну, а далее правьте верхний код с количеством CS-ов равным кол-ву СЛИВов (боюсь, что у ТиТьки-13 копытов может не хватить).
Во втором примере кода CS(SS) вообще похоронен.
ЗЫ Да и в первом Вы его закоментили по кой то ч..н. А, ну да - етож реализация от avr123, он (или Вы???) выборы чипов реализовал через другие ноги в мейне, правда слегка криФовато...
ЗЫ2 Уф, кажись проснулся полностью...
Окончательный вердикт: вина Ваша в первом коде программные CS-ы (пины не развернуты на выход) - надо DDRB.2 и 1 выставить в 1 (у avr123 это сделано в начале майна, а Вы на это ни обратили внимания).
Во втором коде сделали то правильно, а вот поднять, как и в первом, впрочем, при инициализации те же ноги в 1 забыли. В итоге первая же засылка данных идет обеим сливам.
Код:
|
//Вот так надо было
DDRB.2 = 1;
PORTB.2 = 1;
DDRB.1 = 1;
PORTB.1 = 1; |
Ну и в самой функции spi, моГет быть действительно "притормозить" делеями, а то при хорошей тактовой МК скорость спая будет офигительной, начнутся проблемы.
Удачи!!!
Последний раз редактировалось Halex07; 02.11.2014 в 13:02.
|
|
|
Сказали "Спасибо" Halex07
|
|
|
02.11.2014, 22:24
|
|
Временная регистрация
Регистрация: 31.10.2014
Сообщений: 59
Сказал спасибо: 24
Сказали Спасибо 7 раз(а) в 7 сообщении(ях)
|
Re: Программный SPI
Спасибо, разобрался)
|
|
|
|
25.01.2015, 17:46
|
|
Временная регистрация
Регистрация: 17.03.2009
Адрес: Киев
Сообщений: 68
Сказал спасибо: 18
Сказали Спасибо 1 раз в 1 сообщении
|
Re: Программный SPI
Спрошу в данной теме .хотя это вопрос скорее по аппаратному SPI
суть вопроса
при использовании апаратного spi в меге 16 (8535)
бит 4 порта B (PB4) занят функцией ~SS ?
вопрос 1
-чем занята эта нога в в режиме SPI Type: Master?
вопрос 2
-что я потеряю если буду использовать программный SPI по тем же ножкам (MOSI SCK) ?
вопрос 3
- можно ли в режиме аппаратного SPI (SPI Type: Master)
использовать (PB4 ||~SS) (PB6||MISO) под свои нужды ?
Последний раз редактировалось 12val12; 25.01.2015 в 17:50.
|
|
|
|
25.01.2015, 18:47
|
|
Почётный гражданин KAZUS.RU
Регистрация: 20.03.2007
Адрес: "Братское кольцо враждебности", т.е. ближайшее заМКАДье.
Сообщений: 7,024
Сказал спасибо: 3,031
Сказали Спасибо 3,204 раз(а) в 2,174 сообщении(ях)
|
Re: Программный SPI
Сообщение от 12val12
|
Спрошу в данной теме .хотя это вопрос скорее по аппаратному SPI. суть вопроса
при использовании апаратного spi в меге 16 (8535)
бит 4 порта B (PB4) занят функцией ~SS ?
|
В режиме ведомого - занят этой функцией. В режиме ведущего - на Ваше усмотрение.
Сообщение от 12val12
|
вопрос 1
-чем занята эта нога в в режиме SPI Type: Master?
|
Если конфигурируете её на выход, то используете по своему усмотрению. Если оставляете входом, то низкий уровень на ней переключит SPI в режим ведомого и сгенерирует прерывание (для реализации multi-master, например).
Сообщение от 12val12
|
вопрос 2
-что я потеряю если буду использовать программный SPI по тем же ножкам (MOSI SCK) ?
|
Место в ПЗУ, скорость и гибкость.
Сообщение от 12val12
|
вопрос 3
- можно ли в режиме аппаратного SPI (SPI Type: Master)
использовать (PB4 ||~SS) (PB6||MISO) под свои нужды ?
|
PB4 - см. ответ 1. PB6 - надо смотреть функциональную схему в разделе "I/O ports".
Ну и rtfm.
|
|
|
Сказали "Спасибо" ForcePoint
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 05:25.
|
|