Форум РадиоКот https://radiokot.ru/forum/ |
|
I2C в составе LUFA, проблема передачи slave address https://radiokot.ru/forum/viewtopic.php?f=57&t=198348 |
Страница 1 из 1 |
Автор: | miguell [ Пт июн 20, 2025 15:41:23 ] |
Заголовок сообщения: | I2C в составе LUFA, проблема передачи slave address |
Здравствуйте! Использую библиотеку 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, хотя так то работать будет корректно. Это костыль, стыдно. Прошу совета. |
Автор: | COKPOWEHEU [ Вт июл 01, 2025 11:16:14 ] |
Заголовок сообщения: | Re: I2C в составе LUFA, проблема передачи slave address |
По описанию похоже на добавление бита R/W. Он как раз идет после 7-битного адреса. Если так, то все нормально, адрес и надо умножать на 2 и добавлять 0 или 1 в зависимости от того, что со слейвом предполагается делать. |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |