Попытался переделать функции записи и чтения 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); //возвращаем полученные данные
}
Спойлер
main.c- Вложения
-
- main.c
- (7.79 КБ) 569 скачиваний


