Страница 1 из 3

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

Добавлено: Ср янв 18, 2012 16:43:15
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;
}

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

Добавлено: Ср янв 18, 2012 16:50:46
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

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

Добавлено: Ср янв 18, 2012 17:18:39
Dimon49773
спасибо большое...
но я не пойму откуда считывать принятые данные...куда они должны записываться???

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

Добавлено: Ср янв 18, 2012 17:22:26
hybroid
Там в регистр ты сначала пишешь 8 бит. Когда их передашь - принятые 8 бит появятся в этом же регистре. У тебя spi_transfer их вроде как возвращает даже..

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

Добавлено: Ср янв 18, 2012 17:30:00
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);
}

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

Добавлено: Ср янв 18, 2012 17:33:15
Engineer_Keen
phanis писал(а):я пользуюсь этим сделал по даташиту
Это вариант оптимизированный для скорости. Вариант топикстартера тоже рабочий, но чуть-чуть медленнее. Вопрос правда был не в этом :wink:

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

Добавлено: Ср янв 18, 2012 17:35:29
Dimon49773
а uchar это что за тип?

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

Добавлено: Ср янв 18, 2012 17:36:46
hybroid
unsigned char

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

Добавлено: Ср янв 18, 2012 17:38:04
phanis
unsigned char, сокращенно написал

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

Добавлено: Ср янв 18, 2012 17:38:18
Engineer_Keen
unsigned char, байт короче... Потому как размер буфера USI - 8-бит.

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

Добавлено: Ср янв 18, 2012 17:48:03
Dimon49773
просимулировал в протеусе и всёравно не читает с епрома

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

Добавлено: Ср янв 18, 2012 17:51:11
Engineer_Keen
Во-первых, ноги SI-SO не перепутаны местами?
Во-вторых, что там передается?

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

Добавлено: Ср янв 18, 2012 17:53:41
Dimon49773
я подключил DO к SO и DI к SI
вот весь проект

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

Добавлено: Ср янв 18, 2012 17:57:18
Engineer_Keen
serial out памяти к data out МК? Хорошо, что это в симуляторе... Надо крест-накрест.

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

Добавлено: Ср янв 18, 2012 17:58:30
Dimon49773
я вложил в протеусе файл test.bin с hex числами

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

Добавлено: Ср янв 18, 2012 18:02:07
phanis
можно еще spi debuger подцепить в протеусе там же где и осциллограф.

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

Добавлено: Ср янв 18, 2012 18:08:40
Dimon49773
я нифига не понимаю

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

Добавлено: Ср янв 18, 2012 18:10:15
Engineer_Keen
Dimon49773 писал(а):я нифига не понимаю
Мастер постоянно шлет 0x22, слейв не отвечает, (линия в HI-Z состоянии)
Сделайте по человечески, как в даташите нарисовано:
В начале держите CS в "1". Перед передачей опустите в "0". Передайте 0x03, затем 3 байта адреса, затем еще один любой байт. Верните CS в "1". В дебаггере возможно не отобразится (если в памяти действительно одни 0xFF), но по осциллографу должно быть видно, что память ответила.

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

Добавлено: Ср янв 18, 2012 18:13:14
Мастер Ломастер
извините, что встряваю с офтопиком: ну и убожище этот USI!!! просто невероятное убожище!

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

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