реклама на сайте
подробности

 
 
> Slave HAL FreeRTOS, Эмуляция ds1307
simark1979
сообщение Feb 6 2018, 21:16
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 27
Регистрация: 14-03-09
Из: Краснодарский край
Пользователь №: 46 094



Доброе время суток)

Извините за наглость rolleyes.gif но вопрос общего характера.

Мне нужно написать эмуляцию часов ds1307.
Понятно, что это будет slave, с командами чтения и записи по i2c
Никак в голове никак не складывается концепция реализации на FreeRTOS (имеется ввиду взаимодействие коллбэков и потоков, как распознать команды чтения/записи)

На картинке, пример работы с ds1307:
packet#27 - так происходит запись (первый байт куда писать, остальные что писать)
packet#28 - установка указателя для чтения
packet#29 - чтение данных

Вообщем протокол стандартный.
Прикрепленное изображение


Может у кого-то есть опыт или идеи по написанию слэйва под операционкой?
Буду рад любой помощи)

Сообщение отредактировал simark1979 - Feb 7 2018, 11:41
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
simark1979
сообщение Feb 8 2018, 14:03
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 27
Регистрация: 14-03-09
Из: Краснодарский край
Пользователь №: 46 094



А вы никогда не пробовали в Кубе включить для i2c LL драйвер, вместо HAL?

Тут какое-то чудо)
Я так и не врубился, но слэйв заработал сам собой, своего кода я совершенно не добавлял.


Вот так куб мне сгенерил инициализацию:
Код
void MX_I2C2_Init(void)
{
  LL_I2C_InitTypeDef I2C_InitStruct;

  LL_GPIO_InitTypeDef GPIO_InitStruct;
  
  /**I2C2 GPIO Configuration  
  PF0   ------> I2C2_SDA
  PF1   ------> I2C2_SCL
  */
  GPIO_InitStruct.Pin = LL_GPIO_PIN_0|LL_GPIO_PIN_1;
  GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;
  GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_VERY_HIGH;
  GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_OPENDRAIN;
  GPIO_InitStruct.Pull = LL_GPIO_PULL_UP;
  GPIO_InitStruct.Alternate = LL_GPIO_AF_4;
  LL_GPIO_Init(GPIOF, &GPIO_InitStruct);

  /* Peripheral clock enable */
  LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_I2C2);

    /**I2C Initialization
    */
  LL_I2C_DisableClockStretching(I2C2);

  I2C_InitStruct.PeripheralMode = LL_I2C_MODE_I2C;
  I2C_InitStruct.ClockSpeed = 100000;
  I2C_InitStruct.DutyCycle = LL_I2C_DUTYCYCLE_2;
  I2C_InitStruct.OwnAddress1 = 208;
  I2C_InitStruct.TypeAcknowledge = LL_I2C_ACK;
  I2C_InitStruct.OwnAddrSize = LL_I2C_OWNADDRESS1_7BIT;
  LL_I2C_Init(I2C2, &I2C_InitStruct);

  LL_I2C_SetOwnAddress2(I2C2, 0);

  LL_I2C_DisableOwnAddress2(I2C2);

  LL_I2C_DisableGeneralCall(I2C2);

}


Кроме инициализации я ничего не делаю, но после этого у меня лог анализатор начал ловить ответы по шине sm.gif

Cлэйв начал отвечать: забирает и отдает данные (но пока непонятно что это за данные)
И непонятно, каким образом это работает при отключенном в Кубе прерываний для I2C2 или в МК реализован полный аппаратный slave автомат.... blink.gif

Сообщение отредактировал simark1979 - Feb 9 2018, 13:45
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd August 2025 - 08:21
Рейтинг@Mail.ru


Страница сгенерированна за 0.01388 секунд с 7
ELECTRONIX ©2004-2016