Здравствуйте!
Использую библиотеку LUFA c гитхаба (
https://github.com/abcminiuser/lufa)
Проц Atmega32u4, основа устройства -- Generic HID, с ним все хорошо.
Подключил TWI.h, также по гайдлайнам инициализирую его и передаю байт slave устройству с адресом 0x20:
Код:
TWI_Init(TWI_BIT_PRESCALE_1, TWI_BITLENGTH_FROM_FREQ(1, 200000));
if (TWI_StartTransmission(0x20|TWI_ADDRESS_WRITE, 10) == TWI_ERROR_NoError)
{
TWI_SendByte(0xAC);
TWI_StopTransmission();
}
TWI возвращает код ошибки , говорит, что TWI_ERROR_SlaveNotReady.
А при анализе физической передачи вижу, что в линию передаётся адрес 0x10 вместо 0x20. Ну вот и ругань, ясное дело, такого слейва нет у меня на шине. Но если поставить в программе адрес не 0x20, а 0х40, то все работает,адрес в шину передается корректный.
Сломал уже голову, не понимаю, почему так происходит, в драйвере стандартная процедура передачи адреса
Код:
TWDR = SlaveAddress;
TWCR = ((1 << TWINT) | (1 << TWEN));
Как будто в какой-то момент происходит смещение байта в регистре TWDR вправо на 1, и адрес делится на 2, и уже он уходит в шину.
Как-то это криво, не хочу умножать реальный адрес слейва на 2, хотя так то работать будет корректно. Это костыль, стыдно.
Прошу совета.