Прошу помогите с SPI из USI на tiny85

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
Встал на лапы
Аватара пользователя
Сообщения: 108
Зарегистрирован: Ср янв 18, 2012 16:33:58

Сообщение Dimon49773 »

Всем привет...
решил создать WAV проигрыватель на ATtiny85. Сам wav файл закидываю во внешнею eeprom AT25P1024. Она работает по протоколу SPI, но так как мой МК не подерживает хардварно этот протокол, решил сделать его софтварно. Но тут и вся загвоздка...в инете ничего толкового не нашёл. Даже написал пару строк, вроде чтото отправляется, но как получать???

Если вам не трудно и есть какие-то соображения поделитесь очень прошу...уже неделю снятся кошмары про SPI :)) :)) :))

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

uint8_t recieve;



uint8_t spi_transfer(uint8_t data) {
USIDR = data;
USISR = _BV(USIOIF); // clear flag

while ( (USISR & _BV(USIOIF)) == 0 ) {
USICR = (1<<USIWM0)|(1<<USICS1)|(1<<USICLK)|(1<<USITC);
}
return USIDR;
}


void port_init(void)
{
DDRB |= _BV(PB1); // as output (DO)
DDRB |= _BV(PB2); // as output (USISCK)
DDRB &= ~_BV(PB0); // as input (DI)
PORTB |= _BV(PB0); // pullup on (DI)
}

int main(void)
{
port_init();

while (1)
{
recieve = spi_transfer(0x03);

};

return 0;
}
Реклама
Друг Кота
Аватара пользователя
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Сообщение Engineer_Keen »

Dimon49773 писал(а):вроде чтото отправляется, но как получать???
Послать любой байт и прочитать регистр USIDR.
Например:
1) Посылаем инструкцию 0х03 (чтение)
2) Посылаем адрес (3 байта)
3) Посылаем 0, после посылки в USIDR - байт, который находился по заданному адресу.
Что-то вроде:

Код: Выделить всё

spi_transfer(0x03)
spi_transfer(0x12)
spi_transfer(0x34)
spi_transfer(0x56)
recieve = spi_transfer(0) ;читаем байт по адресу 0x123456
Не забываем управлять линией CS
Реклама
Встал на лапы
Аватара пользователя
Сообщения: 108
Зарегистрирован: Ср янв 18, 2012 16:33:58

Сообщение Dimon49773 »

спасибо большое...
но я не пойму откуда считывать принятые данные...куда они должны записываться???
Друг Кота
Аватара пользователя
Сообщения: 8007
Зарегистрирован: Вс ноя 14, 2010 19:24:26
Откуда: Лукалэнд

Сообщение hybroid »

Там в регистр ты сначала пишешь 8 бит. Когда их передашь - принятые 8 бит появятся в этом же регистре. У тебя spi_transfer их вроде как возвращает даже..
Реклама
Эиком - электронные компоненты и радиодетали
Вымогатель припоя
Сообщения: 513
Зарегистрирован: Сб фев 19, 2011 18:04:08
Откуда: Татарстан, пос. Актюбинский

Сообщение phanis »

я пользуюсь этим сделал по даташиту

Код: Выделить всё

unsigned char resive_byte;

resive_byte =  _FF_spi(0xFF); //отправить 255 и считать в resive_byte

uchar _FF_spi(uchar mydata)
{
      
asm("OUT    0x0F,R16");          
asm("LDI    R16,0x11");
asm("LDI    R17,0x13");

asm("OUT    0x0D,R16");
asm("OUT    0x0D,R17");
asm("OUT    0x0D,R16");
asm("OUT    0x0D,R17");
asm("OUT    0x0D,R16");
asm("OUT    0x0D,R17");
asm("OUT    0x0D,R16");
asm("OUT    0x0D,R17");
asm("OUT    0x0D,R16");
asm("OUT    0x0D,R17");
asm("OUT    0x0D,R16");
asm("OUT    0x0D,R17");
asm("OUT    0x0D,R16");
asm("OUT    0x0D,R17");
asm("OUT    0x0D,R16");
asm("OUT    0x0D,R17");

 
return (USIDR);
}
Контактная информация:
Реклама
Друг Кота
Аватара пользователя
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Сообщение Engineer_Keen »

phanis писал(а):я пользуюсь этим сделал по даташиту
Это вариант оптимизированный для скорости. Вариант топикстартера тоже рабочий, но чуть-чуть медленнее. Вопрос правда был не в этом :wink:
Реклама
Встал на лапы
Аватара пользователя
Сообщения: 108
Зарегистрирован: Ср янв 18, 2012 16:33:58

Сообщение Dimon49773 »

а uchar это что за тип?
Друг Кота
Аватара пользователя
Сообщения: 8007
Зарегистрирован: Вс ноя 14, 2010 19:24:26
Откуда: Лукалэнд

Сообщение hybroid »

unsigned char
Вымогатель припоя
Сообщения: 513
Зарегистрирован: Сб фев 19, 2011 18:04:08
Откуда: Татарстан, пос. Актюбинский

Сообщение phanis »

unsigned char, сокращенно написал
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Сообщение Engineer_Keen »

unsigned char, байт короче... Потому как размер буфера USI - 8-бит.
Встал на лапы
Аватара пользователя
Сообщения: 108
Зарегистрирован: Ср янв 18, 2012 16:33:58

Сообщение Dimon49773 »

просимулировал в протеусе и всёравно не читает с епрома
Вложения
osc2.JPG
(74.56 КБ) 562 скачивания
Друг Кота
Аватара пользователя
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Сообщение Engineer_Keen »

Во-первых, ноги SI-SO не перепутаны местами?
Во-вторых, что там передается?
Встал на лапы
Аватара пользователя
Сообщения: 108
Зарегистрирован: Ср янв 18, 2012 16:33:58

Сообщение Dimon49773 »

я подключил DO к SO и DI к SI
вот весь проект
Вложения
attiny85+eeprom.rar
(143.17 КБ) 181 скачивание
usi_as_spi.rar
(138.28 КБ) 196 скачиваний
Последний раз редактировалось Dimon49773 Ср янв 18, 2012 18:04:30, всего редактировалось 1 раз.
Друг Кота
Аватара пользователя
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Сообщение Engineer_Keen »

serial out памяти к data out МК? Хорошо, что это в симуляторе... Надо крест-накрест.
Встал на лапы
Аватара пользователя
Сообщения: 108
Зарегистрирован: Ср янв 18, 2012 16:33:58

Сообщение Dimon49773 »

я вложил в протеусе файл test.bin с hex числами
Вымогатель припоя
Сообщения: 513
Зарегистрирован: Сб фев 19, 2011 18:04:08
Откуда: Татарстан, пос. Актюбинский

Сообщение phanis »

можно еще spi debuger подцепить в протеусе там же где и осциллограф.
Контактная информация:
Встал на лапы
Аватара пользователя
Сообщения: 108
Зарегистрирован: Ср янв 18, 2012 16:33:58

Сообщение Dimon49773 »

я нифига не понимаю
Вложения
spi.JPG
(93.17 КБ) 566 скачиваний
Друг Кота
Аватара пользователя
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Сообщение Engineer_Keen »

Dimon49773 писал(а):я нифига не понимаю
Мастер постоянно шлет 0x22, слейв не отвечает, (линия в HI-Z состоянии)
Сделайте по человечески, как в даташите нарисовано:
В начале держите CS в "1". Перед передачей опустите в "0". Передайте 0x03, затем 3 байта адреса, затем еще один любой байт. Верните CS в "1". В дебаггере возможно не отобразится (если в памяти действительно одни 0xFF), но по осциллографу должно быть видно, что память ответила.
Последний раз редактировалось Engineer_Keen Ср янв 18, 2012 18:13:30, всего редактировалось 1 раз.
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город

Сообщение Мастер Ломастер »

извините, что встряваю с офтопиком: ну и убожище этот USI!!! просто невероятное убожище!
битва с дураками проиграна, победители торжествуют. слава победителям!
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Сообщение Engineer_Keen »

Да ладно, нормальный костыль. Все же лучше чем полностью софтовый SPI.
Собственно от полноценного SPI он только и отличается тем, что ему нужно клок руками дергать, а на это процессорное время расходуется.
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»