программный SPI + радиомодуль SI4432
Добавлено: Пн окт 09, 2017 17:55:34
Здравствуйте, собрал схему с tiny2313 и радиомодулем SI4432 (точнее две схемы, передатчик и приемник). Оказалось что у этого МК нет SPI. Нашел программный SPI. Тут.
Попытался переделать функции записи и чтения SPI как в статье о работе с модулями SI4432 на Хабре. Все скомпилировалось в WinAVR и прогрузилось. Вроде этот код не зависает (вставлял для теста строчки мигание светодиодом).
Но радиосвязь не заработала.
Спецы, как еще можно проверить что мой программный SPI работает?
ПС. Код функций
Исходник приемника
ППС. На ардуине связь на этих модулях работала хорошо. На библиотеке RadioHead
Попытался переделать функции записи и чтения 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); //возвращаем полученные данные
}