Easyelectronics.ru

Электроника для всех
Текущее время: 22 авг 2019, 08:01

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



JLCPCB – Прототипы печатных плат за $2/10pcs (Любой цвет!)
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 14 ] 
Автор Сообщение
 Заголовок сообщения: STM32 + EEPROM 24c04
СообщениеДобавлено: 03 июл 2019, 19:53 
Заглядывает иногда

Зарегистрирован: 11 мар 2018, 01:03
Сообщения: 44
Есть STM32 и EEPROM Atmel 24c04.

Поштучно байты пишутся/читаются по своим адресам. Как только пытаюсь читать большими пачками - зависает i2c. Дописал функцию записи по 16 байт (Page Write) и чтения. В даташите указано что епромка будет отсылать байты увеличивая адрес до тех пор, пока приходит ей acknowledge. НО: у меня выдает только 14 байт, дальше все что угодно, но не записанное ранее. Если читать поштучно адреса ( 15 и 16) то там все правильно записано. Но при пакетном чтении выдает неверные ответы.

Линии SDA и SCL подтянуты 4.7к к +3в3.

Вот код:

Код:
void EEPROM_ReadPage(uint8_t *buf, uint8_t length, uint8_t adress)
{
   uint8_t index = 0;
   if (I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY)) I2C_SoftwareResetCmd(I2C1, ENABLE);
   I2C_AcknowledgeConfig(I2C1, DISABLE);
   I2C_GenerateSTART(I2C1, ENABLE);
      while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));
   I2C_AcknowledgeConfig(I2C1, ENABLE);
   I2C_Send7bitAddress(I2C1, 0xA0, I2C_Direction_Transmitter);
      while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
   I2C_SendData(I2C1, adress);
      while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
   I2C_GenerateSTART(I2C1, ENABLE);
      while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));
   I2C_Send7bitAddress(I2C1, 0xA0, I2C_Direction_Receiver);
      while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));
   while(index < length){
      while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED));
      *((uint8_t*)buf+index) = I2C_ReceiveData(I2C1);
      index++;
   }
   I2C_AcknowledgeConfig(I2C1, DISABLE);
   I2C_GenerateSTOP(I2C1, ENABLE);
      while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY));
}


Прошу прощения за StdPeriph, но CMSIS для i2c я пока еще не освоил...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32 + EEPROM 24c04
СообщениеДобавлено: 03 июл 2019, 20:01 
Старожил

Зарегистрирован: 13 июл 2016, 11:05
Сообщения: 413
у меня STM32L476 и STM32F446 прекрасно работают с разными 24С.. командами HAL_I2C_Mem_Read и HAL_I2C_Mem_Write.
Потому я и не грею голову с разными типами драйверов (мне HAL-а хватает). :-)
Читаю и пишу в основном массивы 32 байта.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32 + EEPROM 24c04
СообщениеДобавлено: 03 июл 2019, 20:17 
Старожил
Аватара пользователя

Зарегистрирован: 13 янв 2018, 21:36
Сообщения: 892
Для F103
Вложение:
EEPROM.h [894 байт]
Скачиваний: 98
Вложение:
EEPROM.cpp [4.23 Кб]
Скачиваний: 101


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32 + EEPROM 24c04
СообщениеДобавлено: 03 июл 2019, 23:14 
Заглядывает иногда

Зарегистрирован: 11 мар 2018, 01:03
Сообщения: 44
VladislavS писал(а):
Для F103
Вложение:
EEPROM.h
Вложение:
EEPROM.cpp

pI2C->SR2;
что дает эта строка?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32 + EEPROM 24c04
СообщениеДобавлено: 03 июл 2019, 23:18 
Старожил

Зарегистрирован: 11 сен 2012, 11:19
Сообщения: 5616
Сброс флагов, научитесь читать мануал , в калокубе о этом не пишут. Да и в SPL сплошной бред...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32 + EEPROM 24c04
СообщениеДобавлено: 03 июл 2019, 23:52 
Заглядывает иногда

Зарегистрирован: 11 мар 2018, 01:03
Сообщения: 44
dosikus_2 писал(а):
Сброс флагов, научитесь читать мануал , в калокубе о этом не пишут. Да и в SPL сплошной бред...

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32 + EEPROM 24c04
СообщениеДобавлено: 04 июл 2019, 03:37 
Старожил

Зарегистрирован: 01 фев 2013, 02:21
Сообщения: 304
Цитата:
В даташите указано что епромка будет отсылать байты увеличивая адрес до тех пор, пока приходит ей acknowledge.

не адрес, а последние 4 бита адреса. Если будет переполнение, тогда ваши байты будут по кругу в рамках страницы перезаписываться. То-есть еще стоит выравнивать адрес при страничной записи/чтении...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32 + EEPROM 24c04
СообщениеДобавлено: 04 июл 2019, 13:54 
Заглядывает иногда

Зарегистрирован: 11 мар 2018, 01:03
Сообщения: 44
besitzeruf писал(а):
Цитата:
В даташите указано что епромка будет отсылать байты увеличивая адрес до тех пор, пока приходит ей acknowledge.

не адрес, а последние 4 бита адреса. Если будет переполнение, тогда ваши байты будут по кругу в рамках страницы перезаписываться. То-есть еще стоит выравнивать адрес при страничной записи/чтении...


Спасибо!

Цитата:
SEQUENTIAL READ: Sequential reads are initiated by either a current address read or a random address read. After
the microcontroller receives a data word, it responds with an acknowledge. As long as the EEPROM receives an
acknowledge, it will continue to increment the data word address and serially clock out sequential data words. When
the memory address limit is reached, the data word address will “roll over” and the sequential read will continue. The
sequential read operation is terminated when the microcontroller does not respond with a zero but does generate a
following stop condition (see Figure 14 ).


в атмеловском даташите про 4 бита ни слова...

Цитата:
The output data comes from consecutive addresses, with the internal address counter
automatically incremented after each byte output. After the last memory address, the
address counter “rolls-over”, and the device continues to output data from memory address
00h.


это даташит от ST. Все почему-то пишут что адрес будет щелкать до переполнения.
Может я не там смотрю?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32 + EEPROM 24c04
СообщениеДобавлено: 04 июл 2019, 16:04 
Старожил

Зарегистрирован: 01 фев 2013, 02:21
Сообщения: 304
Я смотрел DS от атмела (он же microchip) - click, 11 страница.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32 + EEPROM 24c04
СообщениеДобавлено: 04 июл 2019, 16:20 
Старожил
Аватара пользователя

Зарегистрирован: 13 янв 2018, 21:36
Сообщения: 892
Господа, вы о разном говорите! Чтение "без границ" на весь чип по кругу, а запись страницами. Посмотрите код, что я выкладывал, там это всё есть.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32 + EEPROM 24c04
СообщениеДобавлено: 04 июл 2019, 17:28 
Заглядывает иногда

Зарегистрирован: 11 мар 2018, 01:03
Сообщения: 44
besitzeruf писал(а):
Я смотрел DS от атмела (он же microchip) - click, 11 страница.

Да, разговор о чтении по кругу. Не читается больше 14 байт


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32 + EEPROM 24c04
СообщениеДобавлено: 04 июл 2019, 18:01 
Старожил
Аватара пользователя

Зарегистрирован: 13 янв 2018, 21:36
Сообщения: 892
Чудес не бывает, подключай логический анализатор и смотри что там.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32 + EEPROM 24c04
СообщениеДобавлено: 04 июл 2019, 21:36 
Заглядывает иногда

Зарегистрирован: 11 мар 2018, 01:03
Сообщения: 44
Лог.анализатор от меня сейчас оч далеко... Хочу попробовать сбрасывать еепромку между обращениями к ней.
В даташите есть про сброс:

Цитата:
2-WIRE SOFTWARE RESET: After an interruption in protocol, power loss or system reset, any
2-wire part can be reset by following these steps:
(a) Create a start bit condition,
(b) Clock 9 cycles,
(c) Create another start bit followed by a stop bit condition as show


Выходит чтобы сделать SOFTWARE RESET для EEPROM надо сгенерировать:

1. START
2. Передать 0xFF + NO_ACK
3. START
4. STOP

Код:
void EE_SoftwareReset(void)
{
   I2C1->CR1 &= ~I2C_CR1_ACK;
   I2C1->CR1 |= I2C_CR1_START;
      while(!(I2C1->SR1 & I2C_SR1_SB));
      (void) I2C1->SR1;
   I2C1->DR = 0xFF;
      while(!(I2C1->SR1 & I2C_SR1_TXE));
   I2C1->CR1 |= I2C_CR1_START;
      while(!(I2C1->SR1 & I2C_SR1_SB));
      (void) I2C1->SR1;
   I2C1->CR1 |= I2C_CR1_STOP;
}


Верно мыслю?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32 + EEPROM 24c04
СообщениеДобавлено: 05 июл 2019, 11:11 
Старожил

Зарегистрирован: 16 окт 2013, 01:27
Сообщения: 1052
Посмотрите вот тут: http://ww1.microchip.com/downloads/en/devicedoc/21708k.pdf
Максималка в режиме WordWrite = 16 байт.
Байт конфигурации + команда это 2 байта, 2 + 14 = 16 :) вроде бы все логично, если я правильно понял.
Странно то что в документации разной пишется по разному, где то что всего 16 байт, где то что Command + WordAddr + N0...N15

По чтению:
Остановка передачи данных по слову тогда, когда от мастера приходит NACK !!!! т.е. приняли пачку из 8 байт послали NACK после этого слейв отпускает линию и ждет стопа.
Вложение:
1.jpg
1.jpg [ 70.22 Кб | Просмотров: 275 ]


P\S Больше 8 байт за раз не писал никогда, попробовать к сожалению не могу (нет под рукой EEPROM)
Ну и сразу вопрос как часто нужно писать данные ?
Если не очень часто то отдайте последнюю страницу памяти Flash под эмулирование EEPROM, используя режим размазывания данных по странице она прослужит очень долго.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 14 ] 

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


Кто сейчас на конференции

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


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

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

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB