Обсуждаем контроллеры компании Atmel.
Ответить

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

Пт июн 01, 2018 08:29:52

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

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

Код:
   //... Инициализация 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?

МУРРР

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

Пн июн 11, 2018 16:32:50

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