Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры
Войти
Регистрация
Восстановить пароль
 
Yamasan
0 / 0 / 0
Регистрация: 20.02.2018
Сообщений: 14
1

шалит i2c: CLK/SDA

01.03.2019, 13:38. Просмотров 194. Ответов 2

Здравствуйте. Настраиваю общение МК с ЕЕПРОМкой.
Проблема:
Для начала общения проверяю функцией InitEeprom наличие еепромки.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
    temp2 = InitEeprom(0xA1);
    if (( temp2 != 0xFF ) & ( temp2 != 0x01 ) )  //InitEeprom(0xA1) )//temp2 != 0xFF )
    {
        I2C_Stop();
        DelayUs(100);
        while ((DeFlag != 0x69 ) & ( DeFlag != 0xFF ))
        {
            I2C_Stop();
            DelayUs(10);
            I2C_Start();
            if ( Write_I2C_Byte_2016(0xA2) != 0 ) // Посылаем устройству его адрес на проверку
                        I2C_Stop();
            if ( Write_I2C_Byte_2016(0xFE) != 0) // Посылаем устройству адрес слова
                        I2C_Stop();
            I2C_Start();    // Посылаем повторный старт
            
            if ( Write_I2C_Byte_2016(0xA3) != 0)    // Посылаем запрос на чтение по ранее введённому адресу
                    I2C_Stop();
            //DelayUs(10);
            DeFlag = Read_I2C_Byte_2016(1);     // Читаем значение в ячейке 0xFE второго сектора ЕЕПРОМ
            //DelayUs(10);
            I2C_Stop();
            DelayUs(100);
        }
 
uchar InitEeprom(uchar Addr)
{
    uchar cTemp=0xFF;
    I2C_Start();
    cTemp = Write_I2C_Byte(Addr);
        I2C_Stop_2016();
    return (cTemp);
}
Но столкнулся с тем, что каждое первое/второе...N-ное включение по завершении InitEeprom не формируется СТОП-условие(CLK=1,SDA=1). Клок поднимается, а Дата не хочет. А иногда всё проходит нормально, проверяю Лог.анализатором(картинку-график не вставить). С чем может быть связано такое поведение МК? Собираю-загружаю в Keilv5
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.03.2019, 13:38
Ответы с готовыми решениями:

Atmega328P CLK 62.5кГц.
Здорово мужики! Ваяю на arduino один проект, нужно выставить клок в 62.5 кГц. С стандартной...

Шумы в SDA и SCL
Здравствуйте. Подключил к плате Miko (с мк atmega1280) часыds1307. Динные приходят с часов...

рулим OSCCAL, что там в итоге с CLK ?
Привет всем пытливым экспериментаторам! Существует расхожее мнение, что дескать, без кварца...

Микросхемы со входом CLK
Есть много микросхем, у которых есть вход для данных и есть вход CLK. Вот как программируется...

Акронис, /sda
Выделил на ноуте из 160гб 7Гб под винду, и места существенно не хватает... хотел было акронисом...

2
tvsdig
17 / 16 / 4
Регистрация: 22.09.2017
Сообщений: 45
02.03.2019, 04:55 2
Покажите функцию Write_I2C_Byte и Write_I2C_Byte_2016, интересно что они возвращают.
А чем отличаются I2C_Stop и I2C_Stop_2016?

8 и 9 строка не нужны, так как выше (и в конце цикла) происходит уже стоп и задержка.

C
1
2
if ( Write_I2C_Byte_2016(0xA2) != 0 ) // Посылаем устройству его адрес на проверку
 I2C_Stop();
Тоже не совсем понятная конструкция, может имелось ввиду
C
1
2
if ( Write_I2C_Byte_2016(0xA2) != 0 ) {// Посылаем устройству его адрес на проверку
 I2C_Stop(); break; }
0
Yamasan
0 / 0 / 0
Регистрация: 20.02.2018
Сообщений: 14
04.03.2019, 09:22  [ТС] 3
Write_2016
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
unsigned char Write_I2C_Byte_2016(unsigned char Byte)
{
    uchar           cTemp = 0x00;   
    int i;                      
    MCO = 0;                
    MDE = 1;                    
    for(i = 7; i >= 0; i--)     
    {
        cTemp = (Byte >> i);
        cTemp &= 0x01;          
        MDO = cTemp;            
        DelayUs(5);//2
        MCO = 1;
        DelayUs(14);//7             
        MCO = 0;
        DelayUs(5);
    }
    
    cTemp = 0x00;           
    MDO = 1;    //***
    MDE = 0;                    
    DelayUs(9);
    MCO = 1;
    DelayUs(6);//6(13)                  
    cTemp = (char)MDI;          
    MDO = 0;
    MDE = 1;
    MCO = 0;
    DelayUs(6);
    return cTemp;               
}
И просто write
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
unsigned char Write_I2C_Byte(unsigned char Byte)
{
    uchar           cTemp = 0x00;   
    int i;                      
    MCO = 0;                    
    MDE = 1;                    
    for(i = 7; i >= 0; i--)     
    {
        cTemp = (Byte >> i);
        cTemp &= 0x01;          
        MDO = cTemp;            
        DelayUs(2);
        MCO = 1;
        DelayUs(7);             
        MCO = 0;
    }
    cTemp = 0x00;               
    MDE = 0;                    
    MCO = 1;
    DelayUs(3);                 
    cTemp = (char)MDI;              
    MCO = 0;
    return cTemp;               
}
по факту одна и та же функция, но в 2016 поигрались с задержками, чтобы выровнять клоки..

К концу пятницы удалось таки сделать так, чтобы запрос InitEeprom проходил корректно, но ээээ....

КРЧ: Два запроса(Дублирование) Write_Byte в функции InitEeeprom дают один корректный запрос с нормальным стопом
C++
1
2
3
4
5
6
7
8
9
10
11
uchar InitEeprom(uchar Addr)
{
    uchar cTemp=0xFF;
    I2C_Start();
    cTemp = Write_I2C_Byte(Addr);
    /* Доп Write
    Write_I2C_Byte(Addr);
    */
        I2C_Stop_2016();
    return (cTemp);
}
Объяснения этому факту я пока не нашёл, выполняется ли кусочек каждого из них или оба по чуть чуть) Результат меня устраивает, костыль установлен. Но может вам придёт что-нибудь на ум

P.S. Stop и Stop_2016 это одно и то же
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.03.2019, 09:22

Раздача CLK до 100MHz на несколько разъемов.
Доброго времени суток! Прошу совета у вас по тому, как раздать тактовый сигнал с одного разъема на...

Конвертер квадратурного энкодера в clk/dir.
Вот нужно конвертировать сигналы энкодера АВ в clk/dir, но отлавливать надо все четыре изменения...

Диск sdb в sda
Добрый, хочу расширить том, как перевести новый диск с sdb в sda?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru