Пятница, 19.04.2024, 08:59
Микроконтроллерная техника AVR
Главная Регистрация Вход
Приветствую Вас, Гость · RSS
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Форум » Микроконтроллеры » Задачник » Програмный SPI для Mega (реально ли)
Програмный SPI для Mega
VasilijДата: Четверг, 18.02.2010, 23:11 | Сообщение # 1
Рядовой
Группа: Пользователи
Сообщений: 6
Репутация: 0
Статус: Offline
Пришлось заменить MCS51 на ATMega. Прямо не получилось, проблема в том, что шина SPI меги занята, а данные по этой шине идут на др ноги Меги.

Вопрос, как реализовать SPI шину программно. Использованная программа длинная, написана на Си, опасаюсь использовать asm вперемешку с Си.
Может кто решал подобную задачку? Поделитесь...

 
HiSERДата: Пятница, 19.02.2010, 18:57 | Сообщение # 2
Продвинутый автор!
Группа: Проверенные
Сообщений: 254
Репутация: 11
Статус: Offline
Зачем изобретать велосипед?
к SPI можно подключить несколько устройств.
 
VasilijДата: Вторник, 23.02.2010, 22:49 | Сообщение # 3
Рядовой
Группа: Пользователи
Сообщений: 6
Репутация: 0
Статус: Offline
Quote (HiSER)
к SPI можно подключить несколько устройств.

У меня на этих шинах клавиатура (4 ноги) и зум (1 нога). Так, что ... "Пахать" дорожки, ... ОЧЕНЬ КРАЙНИЙ случай. Тем более что эти дорожки ВНУТРИ 40 пин панельки МК, внутри которой 14 пиновая м/с (под контроллером тригера Шмидта). Хлопотно это

Добавлено (23.02.2010, 22:46)
---------------------------------------------
[size=10]Однако, без асм не обошлось. Кому интересно вылаживаю С программу. Аккуратно, SPI там как одна из составных для считывания АЦП из CS5525. Может кому поможет...

//****************НАЧАЛО SPI***********************************************************
//*************************************************************************************
//*************************************************************************************
//*************ОПУСТОШЕНИЕ*************************************************************

#pragma warn- //Запретим предупреждения
void toggle_sdo (void)
{
#asm
ldi r22, 8 ;Организуем счетчик
cbi 0x12, 3 ;Уст в 0 DIN

ogid: ;метка
sbic 0x10, 4 ;попуск след команды если выход 0
rjmp ogid ;ждем нуля

loop: ;метка цикла
sbi 0x12, 5 ;установка ЦЛК в 1
nop ;пауза
cbi 0x12, 5 ;уст ЦЛК в 0
dec r22 ;вычли единицу
brne loop ;следующий бит, если счетчик битов не равен 0
#endasm
}
#pragma warn+ //Разрешим предупреждения в конце функции
//*************************************************************************************
//*************************************************************************************
//*************************************************************************************
//***********Принять байт**************************************************************

#pragma warn- //Запретим предупреждения
char receive_byte (void)
{
#asm
ldi r22, 8 ;Организуем счетчик
ldi r30, 0x00 ;Очистить то , что будем сдвигать

loop1: ;метка цикла
lsl r30 ;сдвиг рег30 влево
sbic 0x10, 4 ;если 4 пин 10 порта 0 след команду пропустить
inc r30 ;если не 0 то +1 в рег30
sbi 0x12, 5 ;импульс: передний фронт ЦЛК
nop ;крыша
cbi 0x12, 5 ;спад ЦЛК
dec r22 ;минус из счетчика циклов
brne loop1 ;если счетчик не пустой, возврат за след битом
#endasm
}
#pragma warn+ //Разрешим предупреждения в конце функции
//*************************************************************************************
//*************************************************************************************
//*************************************************************************************
//*****************ПЕРЕДАЧА БАЙТА******************************************************

#pragma warn- //Запретим предупреждения
void transfer_byte(char peredan)
{
#asm
ld r30, Y ;байт для передачи переместим из стека в рег30 (mov a,var)
ldi r22, 8 ;Организуем счетчик битов (mov r1,#8)
cbi 0x12, 5 ;ЦЛК в ноль (clr P1.3)

loop2: ;посылка байта
sbrc r30, 7 ;пропуск след команды если разяд РОН сброшен
sbi 0x12, 3 ;уст РВВ.3 в 1

sbi 0x12, 5 ;импульс: передний фронт ЦЛК, импульс ЦЛК
nop ;крыша
cbi 0x12, 5 ;спад ЦЛК

lsl r30 ;сдвиг РОН влево 1 раз
cbi 0x12, 3 ;сброс РВВ.3

;уход на ЛУП2
dec r22 ;минус из счетчика циклов (djnz r1, loop2)
brne loop2 ;если счетчик не пустой, возврат за след битом (djnz r1, loop2)
cbi 0x12, 3 ;PD3 из него передают в АЦП (clr P1/1)
#endasm
}
#pragma warn+ //Разрешим предупреждения в конце функции

//*************************************************************************************

Добавлено (23.02.2010, 22:47)
---------------------------------------------
2 часть
//*************************************************************************************
void initialize()
{
unsigned int counter =0;
for (counter=0; counter<2047; counter++){
sclk = 1;
delay_us(10);
sclk = 0; }

sdi=1;
for (counter=0; counter<255; counter++){
sclk=1;
delay_us(10);
sclk=0;}

sdi=0;
sclk=1;
delay_us(10);
sclk=0;

}

void write_to_register (char command, char low, char mid, char high)
{
cs=0;
delay_us(2);
transfer_byte(command);
transfer_byte(high);
transfer_byte(mid);
transfer_byte(low);
cs=1;
delay_us(2);
}

void read_register (char command)
{
cs=0;
delay_us(2);

transfer_byte(command);
high_byte = receive_byte();
mid_byte = receive_byte();
low_byte = receive_byte();

cs=1;
delay_us(2);
}

void acquire_conversion (char command)
{
command=0x94; //Команда чтение конфиг регистр
read_register(command);
low_byte=low_byte|0x20;
write_to_register(0x84,low_byte,mid_byte,high_byte);

cs=0;
delay_us(2);
transfer_byte(0xC0);
toggle_sdo();
high_byte=receive_byte();
mid_byte=receive_byte();
low_byte=receive_byte();

cs=1;
delay_us(2);
acp = (unsigned long int)high_byte<<16;
acp |=(unsigned long int)mid_byte<<8;
acp |= (unsigned long int)low_byte;

}
//*************************************************************************************
//*************************************************************************************
//**************************КОНЕЦ SPI**************************************************

Добавлено (23.02.2010, 22:49)
---------------------------------------------
main()

initialize();
command = 0x82;
high_byte = 0x80;
mid_byte = 0x00;
low_byte = 0x00;
write_to_register(command,low_byte,mid_byte,high_byte);
read_register(0x92);

acquire_conversion(0xC0); // Получение кода из АЦП
convert (acp);

Добавлено (23.02.2010, 22:49)
---------------------------------------------
Длинно, а как прицепить файл на ЭТОМ форуме?

 
my-avrДата: Среда, 24.02.2010, 19:57 | Сообщение # 4
Admin
Группа: Администраторы
Сообщений: 79
Репутация: 10
Статус: Offline
Vasilij, файлы запрещено системой ЮКОЗ, вериант вылаживать файлы на файлообменниках, или запивать на www.dump.ru (там файлы сберегаются 30 дней )
 
Форум » Микроконтроллеры » Задачник » Програмный SPI для Mega (реально ли)
  • Страница 1 из 1
  • 1
Поиск:

Хостинг от uCoz