Здравствуйте, собрал схему с tiny2313 и радиомодулем SI4432 (точнее две схемы, передатчик и приемник). Оказалось что у этого МК нет SPI. Нашел программный SPI. Тут. Попытался переделать функции записи и чтения SPI как в статье о работе с модулями SI4432 на Хабре. Все скомпилировалось в WinAVR и прогрузилось. Вроде этот код не зависает (вставлял для теста строчки мигание светодиодом). Но радиосвязь не заработала. Спецы, как еще можно проверить что мой программный SPI работает? ПС. Код функций Спойлер
Код:
#define PORT_SPI PORTB #define PORT_D PORTD
#define DDR_SPI DDRB #define DDR_D DDRD
#define PIN_SPI PINB
#define UCSK PB7 //CLK #define DO PB6 //MISO #define DI PB5 //MOSI #define SS PD0 #define NIRQ PD1 #define LED PD5
unsigned char tmp;
void USI_init_SPI (void) { DDR_SPI |= (1<<DO); //линия выхода данных - выход DDR_SPI |= (1<<UCSK); //линия тактирующего сигнала - выход DDR_SPI &= ~(1<<DI); //линия входа данных - вход DDR_D |= (1<<SS); //линия выбора кристалла - выход }
//**************функция ЗАПИСИ байта по USI*******************// void SPI_W (unsigned char reg, unsigned char data_w) { PORT_D &= ~(1<<SS); //выбираем кристалл, т.е. SI4432 //------Запись адреса регистра в буфер SPI МК //------Установка старшего бита в адресе регистра необходима для проведения операции записи (всего 127 регистров) USIDR = reg | 0x80; //передаваемые данные в сдвиговый регистр USISR |= (1<<USIOIF); //сбрасываем флаг while(!(USISR & (1<<USIOIF))) //пока нет флага окончания передачи { USICR |= (1<<USIWM0) | (1<<USICS1) | (1<<USICLK) | (1<<USITC);//формируем тактирующие импульсы } USIDR = data_w; //передаваемые данные в сдвиговый регистр USISR |= (1<<USIOIF); //сбрасываем флаг while(!(USISR & (1<<USIOIF))) //пока нет флага окончания передачи { USICR |= (1<<USIWM0) | (1<<USICS1) | (1<<USICLK) | (1<<USITC);//формируем тактирующие импульсы } PORT_D |= (1<<SS); //отпускаем модуль SI4432 //return (USIDR); }
//*************функция ЧТЕНИЯ байта по USI*******************// unsigned char SPI_R (unsigned char reg) { PORT_D &= ~(1<<SS); //выбираем кристалл, т.е. SI4432 //Запись адреса регистра в буфер SPI МК //Установка старшего бита в адресе регистра необходима для проведения операции записи (всего 127 регистров) USIDR = reg; //передаваемые данные в сдвиговый регистр USISR |= (1<<USIOIF); //сбрасываем флаг while(!(USISR & (1<<USIOIF))) //пока нет флага окончания передачи { USICR |= (1<<USIWM0) | (1<<USICS1) | (1<<USICLK) | (1<<USITC);//формируем тактирующие импульсы } USIDR = 0xFF; //порожняк USISR |= (1<<USIOIF); //сбрасываем флаг while(!(USISR & (1<<USIOIF))) //пока нет флага окончания передачи { USICR |= (1<<USIWM0) | (1<<USICS1) | (1<<USICLK) | (1<<USITC);//формируем тактирующие импульсы } PORT_D |= (1<<SS); //отпускаем модуль SI4432 return (USIDR); //возвращаем полученные данные }
в тини2313 есть USI а его можно в режим И2С или в SPI настроить...
_________________ Просто не учи физику в школе, и вся твоя жизнь будет наполнена чудесами и волшебством Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
короче нашел способ проверить работоспособность программного SPI. Сначала буду добиваться связи по SPI между моими платами, а потом уже пытаться конфигурировать модули SI4432
в тини2313 есть USI а его можно в режим И2С или в SPI настроить...
вышеприведенный код топикстартера и есть USI в режиме SPI. чем городить такое уродство, как USI, лучше б его вообще не было - тупым дрыгоножеством получилось бы красивее и проще.
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
да, точно, с телефона неудобно под спойлеры заглядывать (он всю страницу заново грузит, а с моим инетом это около минуты), потому и поверил на слово, что СПИ программный. чето тне очень понял, какойто микс похоже - и аппаратные регистры задействованы и ноги переназначены, вечером с компа вчитаюсь, а может и у себя чего найду готового.
_________________ Просто не учи физику в школе, и вся твоя жизнь будет наполнена чудесами и волшебством Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
да, аппаратный... непонятно, почему строчка: .....//формируем тактирующие импульсы внутри цикла?
_________________ Просто не учи физику в школе, и вся твоя жизнь будет наполнена чудесами и волшебством Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
непонятно, почему строчка: .....//формируем тактирующие импульсы внутри цикла?
потому что дебильный USI сам этого не делает! можете себе представить, в каком то ли пьяном, то ли наркотическом угаре разработчики создавали АППАРАТНЫЙ модуль последовательного интерфейса, которому для работы сдвигового регистра НЕОБХОДИМО ПРОГРАММНО подавать тактовые импульсы путем записи в регистр управления?! у меня даже матерных слов не хватает на это...
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
Ура. Похоже я отмучался. Вспомнил я про великий протеус и в нем домучал код. Этот код что в первом посте работает тока если два контроллера связывать (проверил работоспособность в протеусе). Нашел другой код функции работы с SPI, подшаманил под свои нужды, и в пихнул его в код для теста SPI и драйвера 7сегментного индикатора, проверил в протеусе... и заработало!!!
Спойлер
Код:
/* Использование семисегментного индикатора с общим катодом и сдвиговым регистром по протоколу SPI */
#include <avr/io.h> //подключаем библиотеки #include <util/delay.h>
#define SPI_DDR DDRB //назначаем имя для изменеия направления на порту B #define SPI_PORT PORTB //назначаем имя для используемого порта #define SPI_SS PB4 //назначаем имя выхода SS #define SPI_MOSI PB5 //назначаем имя выхода MOSI #define SPI_MISO PB6 //назначаем имя выхода MISO #define SPI_SCK PB7 //назначаем имя выхода SCK
void spi(unsigned char cmd, unsigned char data) //Функция передачи двух пакетов по 8 бит по протоколу SPI { unsigned char i=0; SPI_PORT &= ~(1<<SPI_SS); //сбрасываем SS в 0
int main(void) { SPI_DDR = (1<<SPI_MOSI)|(1<<SPI_SCK)|(1<<SPI_SS); //настраиваем MOSI, SCK, SS как выходы SPI_PORT |= (1<<SPI_SS); //устанавливаем SS в 1
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 48
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения