Частично решил свои проблемы:
1.Невнимательность, запускал инициализацию дисплея или вот такой код для проверки отправки что выдаст
Код:
messageBuf[0] = ( 0x27 << TWI_ADR_BITS ) | ( FALSE << TWI_READ_BIT ); // адрес ведомого + бит записи
messageBuf[1] =0x10; // данные
TWI_Start_Transceiver_With_Data( messageBuf, 2 )
после иициализации настроек TWI модуля, НО перед разрешение прерываний sei();
2. Порты линий SCL и SDA не были подтянуты к питанию, перенастроил.
3. Убрал пока эту функцию
Код:
static void/*unsigned char*/ TWI_Transceiver_Busy( void )
{
//return ( TWCR & (1<<TWIE) ); // IF TWI Interrupt is enabled then the Transceiver is busy
while (TWCR & (1<<TWIE));
}
из библиотеки TWI.
Теперь если шлю кусок кода тот,что выше написал - то норм отрабатывает, SDA и SCL в высоком уровне, отправка Адреса+W+Data и опять в высоком уровне. В протусе в I2C debugger тоже все красиво - S 4E A 10 A P, при условии что адресс указан 0х27.
Но как только вставляю в библиотеку дисплея
Код:
void lq_transmitI2C(LiquidCrystalDevice_t* device, uint8_t value)
{
// i2c_master_sendByte(device->Address, value | device->Backlight); //Ранее было так
messageBuf[0] = ( device->Address << TWI_ADR_BITS ) | ( FALSE << TWI_READ_BIT ); // адрес ведомого + бит записи
messageBuf[1] = ( value | device->Backlight ); // данные
TWI_Start_Transceiver_With_Data( messageBuf, 2 );
};
начинаю инициализацию дисплея, то почему-то после S добовляетя еще Sr и все полетело к х.... Смотрю, а между отправками у меня опять низкий уровень((((
Ищем далее... пишу тестотправку, не одну, а две через 100мкрС.
Код:
messageBuf[0] = ( 0x27 << TWI_ADR_BITS ) | ( FALSE << TWI_READ_BIT ); // адрес ведомого + бит записи
messageBuf[1] = 0x12; // данные
TWI_Start_Transceiver_With_Data( messageBuf, 2 );
_delay_us(100);
messageBuf[0] = ( 0x27 << TWI_ADR_BITS ) | ( FALSE << TWI_READ_BIT ); // адрес ведомого + бит записи
messageBuf[1] = 0x30; // данные
TWI_Start_Transceiver_With_Data( messageBuf, 2 );
Вижу, все хорошо!
Вложение:
2.jpg [102.96 KiB]
Скачиваний: 8
Пробую через 10мкрС...
Код:
messageBuf[0] = ( 0x27 << TWI_ADR_BITS ) | ( FALSE << TWI_READ_BIT ); // адрес ведомого + бит записи
messageBuf[1] = 0x12; // данные
TWI_Start_Transceiver_With_Data( messageBuf, 2 );
_delay_us(10);
messageBuf[0] = ( 0x27 << TWI_ADR_BITS ) | ( FALSE << TWI_READ_BIT ); // адрес ведомого + бит записи
messageBuf[1] = 0x30; // данные
TWI_Start_Transceiver_With_Data( messageBuf, 2 );
Отправилось только второя часть и завис на СТАРТЕ, линии SDA и SCL в низком уровне.
Вложение:
2_2.jpg [94.48 KiB]
Скачиваний: 7
А в библиотеке дисплея такие задержки есть
Код:
void lq_writeDevicePulse(LiquidCrystalDevice_t* device, uint8_t value)
{
lq_transmitI2C(device, value | LCD_ENABLE_BIT);
_delay_us(2);
lq_transmitI2C(device, value & ~LCD_ENABLE_BIT);
_delay_us(50);
};
только в этой функции, далее не нашел менее 150мкрС. Почему так тупит при малых задержках между отправками? Например в библиотеке INA226 при другой рабочей библиотеке TWI там между отправкой адреса с битом записи и отправкой данных - 10мкрС интервал.
Добавлено after 57 seconds:Уважаемые форумчане, нужна ваша помощь)))