реклама на сайте
подробности

 
 
> SPI из USI на tiny85
Dimon49773
сообщение Jan 18 2012, 16:34
Сообщение #1





Группа: Участник
Сообщений: 12
Регистрация: 18-01-12
Пользователь №: 69 721



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

Если вам не трудно и есть какие-то соображения поделитесь очень прошу...уже неделю снятся кошмары про SPI
CODE
#include <avr/io.h>
#include "util/delay.h"

unsigned char _FF_spi(unsigned char mydata);

unsigned char _FF_spi(unsigned char mydata)
{
unsigned char temp;

USIDR = mydata;
mydata = 0x11;
temp = 0x13;

USICR = mydata;
USICR = temp;
USICR = mydata;
USICR = temp;
USICR = mydata;
USICR = temp;
USICR = mydata;
USICR = temp;
USICR = mydata;
USICR = temp;
USICR = mydata;
USICR = temp;
USICR = mydata;
USICR = temp;
USICR = mydata;
USICR = temp;

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

int main(void)
{unsigned char resive_byte;

port_init();

while(1){
_delay_ms(100);
PORTB &= 0xFF- _BV(PB3);
resive_byte = _FF_spi(0x03);
PORTB |= _BV(PB3);
}

return 0;
}


Сообщение отредактировал IgorKossak - Jan 18 2012, 21:00
Причина редактирования: [codebox]
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
_Артём_
сообщение Jan 18 2012, 17:21
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(Dimon49773 @ Jan 18 2012, 18:34) *
Она работает по протоколу SPI, но так как мой МК не подерживает хардварно этот протокол, решил сделать его софтварно.


Поддерживает...
Смотрите модуль USI, ражим SPI master mode 0.

Цитата(Dimon49773 @ Jan 18 2012, 18:34) *
Но тут и вся загвоздка...в инете ничего толкового не нашёл.


Плохо искали. SPI - простейший протокол, поэтому его реализаций - море.

Цитата(Dimon49773 @ Jan 18 2012, 18:34) *
решил сделать его софтварно. Но тут и вся загвоздка...в инете ничего толкового не нашёл. Даже написал пару строк, вроде чтото отправляется, но как получать???

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


Что там соображать:
принцып прост:

CODE
void SendByteToSPI(unsigned char data)
{
SS=0;// выход - перед началом посылки ставится в 0
unsigned char bit_cnt=0;
do {
// старший бит первым
if (data&0x80) SPIOUT=1; else SPIOUT=0;
data<<=1;
SPICLK=0;
asm("nop");
asm("nop");
asm("nop");
asm("nop");
SPICLK=1;
asm("nop");
asm("nop");
asm("nop");
asm("nop");
if (SPIIN) data|=1;
SPICLK=0;
asm("nop");
asm("nop");
asm("nop");
asm("nop");
} while (++bit_cnt<8)

SS=1;
return data;
}

Цитата(Dimon49773 @ Jan 18 2012, 18:34) *
USICR = mydata;
USICR = temp;
USICR = mydata;
USICR = temp;
USICR = mydata;
USICR = temp;
USICR = mydata;
USICR = temp;
USICR = mydata;
USICR = temp;
USICR = mydata;
USICR = temp;
USICR = mydata;
USICR = temp;
USICR = mydata;
USICR = temp;


Статус почему не используется? И регистр данных?

Читайте AVR319: Using the USI module for SPI communication on tinyAVR and megaAVR devices.
Там всё должно быть понятно и готовый драйвер тоже должен быть.

Сообщение отредактировал IgorKossak - Jan 18 2012, 21:01
Причина редактирования: [codebox], лишние пустые строки
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 26th June 2025 - 02:25
Рейтинг@Mail.ru


Страница сгенерированна за 0.01353 секунд с 7
ELECTRONIX ©2004-2016