Например TDA7294

Форум РадиоКот • Просмотр темы - [РЕШЕНО]stm32f030 + eeprom
Форум РадиоКот
Здесь можно немножко помяукать :)





Текущее время: Пт апр 19, 2024 01:28:00

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ Сообщений: 38 ]  1,  
Автор Сообщение
Не в сети
 Заголовок сообщения: [РЕШЕНО]stm32f030 + eeprom
СообщениеДобавлено: Ср окт 04, 2017 12:30:16 
Встал на лапы
Аватар пользователя

Карма: 1
Рейтинг сообщений: 0
Зарегистрирован: Чт дек 29, 2011 16:25:56
Сообщений: 83
Рейтинг сообщения: 0
Добрый день, форумчане.
Не получается стабильно читать из eeprom по i2c.
Код:
void I2C_EE_ReadBytes(uint8_t addr, uint8_t* data, uint8_t size)
{
    _data = data;
    bytes = 0;
   
    I2C1->CR2 &= ~(I2C_CR2_ADD10 | I2C_CR2_RD_WRN);
    I2C1->CR2 |= (1 << I2C_CR2_NBYTES_Pos) | addr | I2C_CR2_START;
   
    while((I2C1->ISR & I2C_ISR_TXIS) != I2C_ISR_TXIS);
   
    I2C1->TXDR = 0x00;
   
    while((I2C1->ISR & I2C_ISR_TC) != I2C_ISR_TC);
   
    I2C1->CR2 |= I2C_CR2_AUTOEND | (size << I2C_CR2_NBYTES_Pos) | I2C_CR2_RD_WRN
               | I2C_CR2_START | addr;

    for(bytes = 0; bytes < size; ++bytes)
    {
        while((I2C1->ISR & I2C_ISR_RXNE) != I2C_ISR_RXNE);
        _data[bytes] = I2C1->RXDR;
    }
}


Не выставляется флаг I2C_ISR_TXIS и программа зависает...
Если закомментировать кусок кода
Код:
I2C1->CR2 &= ~(I2C_CR2_ADD10 | I2C_CR2_RD_WRN);
I2C1->CR2 |= (1 << I2C_CR2_NBYTES_Pos) | addr | I2C_CR2_START;
   
while((I2C1->ISR & I2C_ISR_TXIS) != I2C_ISR_TXIS);
   
I2C1->TXDR = 0x00;
   
while((I2C1->ISR & I2C_ISR_TC) != I2C_ISR_TC);

то тогда все читается, но так нельзя выставить позицию с которой надо читать.
Где может быть затык?
Спасибо.


Последний раз редактировалось gruffi Чт окт 05, 2017 09:27:53, всего редактировалось 1 раз.

Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: stm32f030 + eeprom
СообщениеДобавлено: Ср окт 04, 2017 12:35:10 
Друг Кота
Аватар пользователя

Карма: 46
Рейтинг сообщений: 1368
Зарегистрирован: Пт авг 28, 2009 21:34:30
Сообщений: 7214
Откуда: 845-й км.
Рейтинг сообщения: 0
Медали: 1
Получил миской по аватаре (1)
В своих конструкциях я использовал код сделанный на основе этого: http://cxem.net/mc/mc362.php

_________________
А люди посмотрят и скажут: "Собаки летят. Вот и осень."


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: stm32f030 + eeprom
СообщениеДобавлено: Ср окт 04, 2017 13:02:26 
Встал на лапы
Аватар пользователя

Карма: 1
Рейтинг сообщений: 0
Зарегистрирован: Чт дек 29, 2011 16:25:56
Сообщений: 83
Рейтинг сообщения: 0
Спасибо.
Сделал, как написано, но все равно прочитать не могу - один плюс, что не зависает. Проходит только START и получение на него ACK, и больше ничего. Есть еще предположения где у меня траблы?


Вернуться наверх
 
PCBWay - всего $5 за 10 печатных плат, первый заказ для новых клиентов БЕСПЛАТЕН

Сборка печатных плат от $30 + БЕСПЛАТНАЯ доставка по всему миру + трафарет

Онлайн просмотровщик Gerber-файлов от PCBWay + Услуги 3D печати
Не в сети
 Заголовок сообщения: Re: stm32f030 + eeprom
СообщениеДобавлено: Ср окт 04, 2017 13:12:25 
Друг Кота
Аватар пользователя

Карма: 46
Рейтинг сообщений: 1368
Зарегистрирован: Пт авг 28, 2009 21:34:30
Сообщений: 7214
Откуда: 845-й км.
Рейтинг сообщения: 0
Медали: 1
Получил миской по аватаре (1)
А что за eeprom? с 24c32 надо выдавать 16-ти битный адрес.
Код:
#define EEPROM_ADDR        0xA0
#ifdef EE24C32    
    if (i2c_rd_reg16(EEPROM_ADDR, EEREG_ADDR, pData, sizeof(data)) == I2C_SUCCESS) {
#else
    if (i2c_rd_reg(EEPROM_ADDR, EEREG_ADDR, pData, sizeof(data)) == I2C_SUCCESS) {
#endif  


СпойлерСейчас все нюансы уже не помню, но вот этот код у меня сейчас как раз трудится в чтении ЕЕПРОМ
Код:
t_i2c_status i2c_rd_reg16(unsigned char addressuint16_t reg_addrchar dataunsigned char length){

    
unsigned char Count 0reg_hi_lo[2], *reg_ptr;
    
    
reg_hi_lo[0] = reg_addr>>8;
    
reg_hi_lo[1] = reg_addr 0xFF;
    
reg_ptr reg_hi_lo;
    
    
I2C_BUS->CR2 I2C_CR2_START 2<<16 | (address 0xFE); /* Go */
    
while ((I2C_BUS->ISR I2C_ISR_BUSY) == 0);    // Ожидать выдачу старта
    // Сейчас либо I2C запросит первый байт для отправки,
    // Либо взлетит NACK-флаг, говорящий о том, что микросхема не отвечает.
    // Если взлетит NACK-флаг, отправку прекращаем.

    
while ((((I2C_BUS->ISR I2C_ISR_TC)==0) && ((I2C_BUS->ISR I2C_ISR_NACKF)==0)) && (I2C_BUS->ISR I2C_ISR_BUSY)) {
        if (
I2C_BUS->ISR I2C_ISR_TXISI2C_BUS->TXDR = *reg_ptr++;    // Отправляю адрес регистра
    
}
    
    
    
I2C_BUS->CR2 I2C_CR2_START | ((uint32_t)length<<16) | I2C_CR2_RD_WRN | (address 0xFE); /* Restart */
    
while ((I2C_BUS->ISR I2C_ISR_BUSY)==0);    // Ожидать выдачу старта

    // Принимаем байты до тех пор, пока не взлетит TC-флаг.
    // Если взлетит NACK-флаг, приём прекращаем.
    
while ((((I2C_BUS->ISR I2C_ISR_TC)==0) && ((I2C_BUS->ISR I2C_ISR_NACKF)==0)) && (I2C_BUS->ISR I2C_ISR_BUSY))    {
        if (
I2C_BUS->ISR I2C_ISR_RXNE) {
            *
data++ = I2C_BUS->RXDR;    // Принимаю данные
            
Count++;
        }
    }

    
I2C_BUS->CR2 |= I2C_CR2_STOP;                // Выдать стоп на шину
    
while (I2C_BUS->ISR I2C_ISR_BUSY);        // Ожидать выдачу стопа
    // Очищаю флаги - необходимо для дальнейшей работы шины
    
I2C_BUS->ICR |= I2C_ICR_STOPCF;        // STOP флаг
    
I2C_BUS->ICR |= I2C_ICR_NACKCF;        // NACK флаг
    // Если есть ошибки на шине - очищаю флаги
    
if (I2C_BUS->ISR & (I2C_ISR_ARLO I2C_ISR_BERR)) {
        
I2C_BUS->ICR |= I2C_ICR_ARLOCF;
        
I2C_BUS->ICR |= I2C_ICR_BERRCF;
    }

  if (
Count == length) return I2C_SUCCESS;
    else return 
I2C_ERROR;

_________________
А люди посмотрят и скажут: "Собаки летят. Вот и осень."


Вернуться наверх
 
Выбираем схему BMS для заряда литий-железофосфатных (LiFePO4) аккумуляторов

Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.

Подробнее>>
Не в сети
 Заголовок сообщения: Re: stm32f030 + eeprom
СообщениеДобавлено: Ср окт 04, 2017 13:20:30 
Встал на лапы
Аватар пользователя

Карма: 1
Рейтинг сообщений: 0
Зарегистрирован: Чт дек 29, 2011 16:25:56
Сообщений: 83
Рейтинг сообщения: 0
Память AT24C08D 8Kbit...В даташит написано, что надо выдавать 8-битный адрес после СТАРТ:
Accessing the device requires an 8-bit Device Address word following a Start condition to enable the device for
a Read or Write operation. Since multiple slave devices can reside on the serial bus, each slave device must
have its own unique address so the Master can access each device indepen dently.


Вернуться наверх
 
Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре. Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.

Подробнее>>
Не в сети
 Заголовок сообщения: Re: stm32f030 + eeprom
СообщениеДобавлено: Ср окт 04, 2017 13:37:40 
Друг Кота
Аватар пользователя

Карма: 46
Рейтинг сообщений: 1368
Зарегистрирован: Пт авг 28, 2009 21:34:30
Сообщений: 7214
Откуда: 845-й км.
Рейтинг сообщения: 0
Медали: 1
Получил миской по аватаре (1)
Эта... а вам компилятор варнинги не выдаёт?
например на это: size << I2C_CR2_NBYTES_Pos. Справа у вас должно быть 16, а size описана как 8-бит. получается 0. Хотя если int у вашего компилятора 32 бита, то проблемы быть не должно...

Ладно, вот еще мой код для 8-битной адресации (но не проверенный. Не было у меня такой маленькой еепромки):
Спойлер
Код:
//******************************************************************************
// Чтение регистра slave-устройства
// Start -> Slave Addr -> Reg. addr -> Restart -> Slave Addr <- data ... -> Stop 
//******************************************************************************                                   
t_i2c_status i2c_rd_reg(unsigned char address, unsigned char reg_addr, char * data, unsigned char length){

    unsigned char Count = 0;
        
    I2C_BUS
->CR2 = I2C_CR2_START | 1<<16 | (address & 0xFE); /* Go */
    while ((I2C_BUS->ISR & I2C_ISR_BUSY) == 0);    // Ожидать выдачу старта
    // Сейчас либо I2C запросит первый байт для отправки,
    // Либо взлетит NACK-флаг, говорящий о том, что микросхема не отвечает.
    // Если взлетит NACK-флаг, отправку прекращаем.
    while ((((I2C_BUS->ISR & I2C_ISR_TC)==0) && ((I2C_BUS->ISR & I2C_ISR_NACKF)==0)) && (I2C_BUS->ISR & I2C_ISR_BUSY))    {
        if (I2C_BUS->ISR & I2C_ISR_TXIS) I2C_BUS->TXDR = reg_addr;    // Отправляю адрес регистра
    }
    
    I2C_BUS
->CR2 = I2C_CR2_START | ((uint32_t)length<<16) | I2C_CR2_RD_WRN | (address & 0xFE); /* Restart */
    while ((I2C_BUS->ISR & I2C_ISR_BUSY)==0);    // Ожидать выдачу старта

    // Принимаем байты до тех пор, пока не взлетит TC-флаг.
    // Если взлетит NACK-флаг, приём прекращаем.
    while ((((I2C_BUS->ISR & I2C_ISR_TC)==0) && ((I2C_BUS->ISR & I2C_ISR_NACKF)==0)) && (I2C_BUS->ISR & I2C_ISR_BUSY))    {
        if (I2C_BUS->ISR & I2C_ISR_RXNE) {
            *data++ = I2C_BUS->RXDR;    // Принимаю данные
            Count++;
        }
    }

    I2C_BUS->CR2 |= I2C_CR2_STOP;                // Выдать стоп на шину
    while (I2C_BUS->ISR & I2C_ISR_BUSY);        // Ожидать выдачу стопа
    // Очищаю флаги - необходимо для дальнейшей работы шины
    I2C_BUS->ICR |= I2C_ICR_STOPCF;        // STOP флаг
    I2C_BUS->ICR |= I2C_ICR_NACKCF;        // NACK флаг
    // Если есть ошибки на шине - очищаю флаги
    if (I2C_BUS->ISR & (I2C_ISR_ARLO | I2C_ISR_BERR)) {
        I2C_BUS->ICR |= I2C_ICR_ARLOCF;
        I2C_BUS->ICR |= I2C_ICR_BERRCF;
    }

  if (Count == length) return I2C_SUCCESS;
    return I2C_ERROR;

_________________
А люди посмотрят и скажут: "Собаки летят. Вот и осень."


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: stm32f030 + eeprom
СообщениеДобавлено: Ср окт 04, 2017 14:11:55 
Встал на лапы
Аватар пользователя

Карма: 1
Рейтинг сообщений: 0
Зарегистрирован: Чт дек 29, 2011 16:25:56
Сообщений: 83
Рейтинг сообщения: 0
Нет варнингов не было, но подправил. Спасибо.
Ваш код работает, т.е. идет чтение, но только не понятно я задаю чтение с адреса 0х00, а он каждый раз при чтении выдает разный адрес регистра. Если устройство перезапустить, то при каждом чтении опять по тем же адресам идет...

Добавлено after 14 minutes 54 seconds:
Чтение идет в такой последовательности, при перезагрузке устройства (reg_addr = 0x00):
0x90, 0x08, 0x00, 0x20, 0xC5, 0x00, 0x00, 0x08, 0x4D...


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: stm32f030 + eeprom
СообщениеДобавлено: Ср окт 04, 2017 14:26:17 
Друг Кота
Аватар пользователя

Карма: 46
Рейтинг сообщений: 1368
Зарегистрирован: Пт авг 28, 2009 21:34:30
Сообщений: 7214
Откуда: 845-й км.
Рейтинг сообщения: 0
Медали: 1
Получил миской по аватаре (1)
Похоже на проблему с передачей адреса регистра... Надо бы попробовать вставить флажок рядом с кодом
Код:
    if (I2C_BUS->ISR & I2C_ISR_TXIS) I2C_BUS->TXDR = reg_addr;    // Отправляю адрес регистра
и посмотреть выполняется ли он. А то может сразу происходит рестарт и выполняется current read, а не рандом.

_________________
А люди посмотрят и скажут: "Собаки летят. Вот и осень."


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: stm32f030 + eeprom
СообщениеДобавлено: Ср окт 04, 2017 14:30:53 
Встал на лапы
Аватар пользователя

Карма: 1
Рейтинг сообщений: 0
Зарегистрирован: Чт дек 29, 2011 16:25:56
Сообщений: 83
Рейтинг сообщения: 0
да, так и есть TXIS не взлетает


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: stm32f030 + eeprom
СообщениеДобавлено: Ср окт 04, 2017 14:38:50 
Друг Кота
Аватар пользователя

Карма: 46
Рейтинг сообщений: 1368
Зарегистрирован: Пт авг 28, 2009 21:34:30
Сообщений: 7214
Откуда: 845-й км.
Рейтинг сообщения: 0
Медали: 1
Получил миской по аватаре (1)
хм.. тогда надо сравнить с 16-битной функцией. Только что попробовал в своём коде сделать, чтобы читало начальные установки с 1-го адреса - вижу все данные сместились. Так что rd_reg16 - вроде работает как следует. Хотя всё различие, что передаётся один или два байта адреса...

_________________
А люди посмотрят и скажут: "Собаки летят. Вот и осень."


Последний раз редактировалось uldemir Ср окт 04, 2017 14:49:09, всего редактировалось 1 раз.

Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: stm32f030 + eeprom
СообщениеДобавлено: Ср окт 04, 2017 14:48:31 
Встал на лапы
Аватар пользователя

Карма: 1
Рейтинг сообщений: 0
Зарегистрирован: Чт дек 29, 2011 16:25:56
Сообщений: 83
Рейтинг сообщения: 0
а можно посмотреть функцию rd_reg16?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: stm32f030 + eeprom
СообщениеДобавлено: Ср окт 04, 2017 14:50:24 
Друг Кота
Аватар пользователя

Карма: 46
Рейтинг сообщений: 1368
Зарегистрирован: Пт авг 28, 2009 21:34:30
Сообщений: 7214
Откуда: 845-й км.
Рейтинг сообщения: 0
Медали: 1
Получил миской по аватаре (1)
viewtopic.php?p=3197984#p3197984 под спойлером. Имелось в виду i2c_rd_reg16
Попробуйте у себя сделать чтение не с 0 адреса, а с другого и посмотрите, какая тогда последовательность прочитанных байтов будет.

_________________
А люди посмотрят и скажут: "Собаки летят. Вот и осень."


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: stm32f030 + eeprom
СообщениеДобавлено: Ср окт 04, 2017 15:00:24 
Встал на лапы
Аватар пользователя

Карма: 1
Рейтинг сообщений: 0
Зарегистрирован: Чт дек 29, 2011 16:25:56
Сообщений: 83
Рейтинг сообщения: 0
Получается, что и здесь TXIS не взлетает...но в обоих вариантах взлетает при отладке, если пройти пошагово...


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: stm32f030 + eeprom
СообщениеДобавлено: Ср окт 04, 2017 15:10:41 
Друг Кота
Аватар пользователя

Карма: 46
Рейтинг сообщений: 1368
Зарегистрирован: Пт авг 28, 2009 21:34:30
Сообщений: 7214
Откуда: 845-й км.
Рейтинг сообщения: 0
Медали: 1
Получил миской по аватаре (1)
но он там не сразу устанавливается, вроде. Ну, смеха для, перед передачей рестарта можно попробовать сформировать полный стоп. Для еепромки это должно быть без разницы - главное сделать фиктивную попытку записи по адресу, а потом оно с этого адреса и будет читать.

p.s. я в своей функции сделал счетчик переданных байт адреса и если он не равен 2 перед рестартом - выхожу с ошибкой. Но ошибка не появляется.

_________________
А люди посмотрят и скажут: "Собаки летят. Вот и осень."


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: stm32f030 + eeprom
СообщениеДобавлено: Ср окт 04, 2017 16:22:19 
Встал на лапы
Аватар пользователя

Карма: 1
Рейтинг сообщений: 0
Зарегистрирован: Чт дек 29, 2011 16:25:56
Сообщений: 83
Рейтинг сообщения: 0
сделал STOP теперь читает 0xFF постоянно. Буду дальше смотреть. Спасибо большое.

Добавлено after 40 minutes 33 seconds:
uldemir, покажите пожалуйста настройку таймингов, т.к. я тайминги генерил через куб и при разных вариантах поведение одно и тоже. Может здесь собака порылась?!


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: stm32f030 + eeprom
СообщениеДобавлено: Ср окт 04, 2017 16:31:27 
Друг Кота
Аватар пользователя

Карма: 46
Рейтинг сообщений: 1368
Зарегистрирован: Пт авг 28, 2009 21:34:30
Сообщений: 7214
Откуда: 845-й км.
Рейтинг сообщения: 0
Медали: 1
Получил миской по аватаре (1)
ммм. я тайминги каким-то экселем считал, что с сайта производителя скачивал. У меня такая строчка:
I2C_BUS->TIMINGR = (uint32_t)0x00100D14; /* (1) */
Тактируется от HSI.

Собственно, у меня самого сейчас с этим кодом возникли проблемы. Раз уж залез в этот девайс, решил добавить в меню еще одну настройку, в результате чего число параметров увеличилось и число записываемых байт перевалило размер страницы. Вот теперь что-то не получается сделать запись по-частям. Первую порцию записывает, а потом где-то виснет.

_________________
А люди посмотрят и скажут: "Собаки летят. Вот и осень."


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: stm32f030 + eeprom
СообщениеДобавлено: Ср окт 04, 2017 17:39:02 
Встал на лапы
Аватар пользователя

Карма: 1
Рейтинг сообщений: 0
Зарегистрирован: Чт дек 29, 2011 16:25:56
Сообщений: 83
Рейтинг сообщения: 0
уже склоняюсь к ногодрыгу :)...читал что у stm32 i2c глючный :)


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: stm32f030 + eeprom
СообщениеДобавлено: Ср окт 04, 2017 17:58:43 
Друг Кота
Аватар пользователя

Карма: 30
Рейтинг сообщений: 155
Зарегистрирован: Пн июл 28, 2008 22:12:01
Сообщений: 3604
Рейтинг сообщения: 0
Глючный на F1 , на F0 все работает прекрасно.
Просто вы оба так и не въехали в сабж, хоть в RM все расписано от и до, и даже секвенции выложены.
Учитесь читать...


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: stm32f030 + eeprom
СообщениеДобавлено: Ср окт 04, 2017 18:26:58 
Встал на лапы
Аватар пользователя

Карма: 1
Рейтинг сообщений: 0
Зарегистрирован: Чт дек 29, 2011 16:25:56
Сообщений: 83
Рейтинг сообщения: 0
Учимся :), но флаг TXIS так и не взлетает...


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: stm32f030 + eeprom
СообщениеДобавлено: Ср окт 04, 2017 18:33:38 
Друг Кота
Аватар пользователя

Карма: 30
Рейтинг сообщений: 155
Зарегистрирован: Пн июл 28, 2008 22:12:01
Сообщений: 3604
Рейтинг сообщения: 0
Завтра подробней, весь материал на работе.


Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 38 ]  1,  

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 14


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y