USI + hardware SPI = true, USI + nRF24 = !true

Обсуждаем контроллеры компании Atmel.
Ответить
Мудрый кот
Сообщения: 1759
Зарегистрирован: Пт июн 01, 2018 07:28:45

Сообщение parovoZZ »

Муррррр, мяу!

Есть такой муррр код

Код: Выделить всё

	//... Инициализация SPI - USI
void SPI_Init(void)
{
SPI_DDR |= (Bit(SCK) | Bit(MISO));	// Все выводы, кроме MOSI, выходы
SPI_PORT |= (Bit(MOSI) | Bit(MISO));

USICR |= (Bit(USIWM0) | Bit(USICS1) | Bit(USICLK));

}

	//... Передать байт данных
void SPI_WriteByte(uint8_t data)
{
//... Копируем байт в регистр USIDR
USIDR = data;
	
//... Установим флаг начала передачи					
USISR = Bit(USIOIF);

//... В цикле следим за флагом
while(!(USISR & Bit(USIOIF)))
{
	USICR |= ( Bit(USITC));		// Режим SPI, тактируем шину сами
}

_delay_us(100);                    // Задержка для моста SPI - UART
}

	//... Передать и получить байт данных 
uint8_t SPI_ReadByte(uint8_t data)
{
//... Отправляем байт
SPI_WriteByte(data);

//... Принятый байт возвращаем
return USIDR; 

}

Так вот при подключении на шину SPI 328p я слышу общение, но nRF24 не реагирует. На запись любого регистра возвращает 0, на чтение любого регистра возвращает 15. Если после записи данных в FIFO регистр послать команду очистки, то возвращает 14. Т.к. общение с nRF начинаю с дерганья csn, то цифра 15 - это, очевидно, значение статуса. Но почему nRF никак не хочет отдавать значение запрашиваемого регистра? Точно такой же код, но с аппаратным SPI на 328p заводится без проблем.
Пересмотрел кучу статей, библиотек (под абдурино и не только), код везде одинаков. Микросин, датагор, гитхаб...
Вопрос, мяу, не в том, где я косячу, а в том, работал кто с этим трансивером через интерфейс USI?

МУРРР
Реклама
Мудрый кот
Сообщения: 1759
Зарегистрирован: Пт июн 01, 2018 07:28:45

Сообщение parovoZZ »

Усе. Проблема была не столько в usi, сколько в организации работы трансивера.
Реклама
Ответить

Вернуться в «AVR»