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

 
 
> Не могу сделать сброс внешних i2c устройств
simark1979
сообщение Feb 5 2018, 14:26
Сообщение #1


Участник
*

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



Здравствуйте, у меня тут ребус wacko.gif

У мастера stm32f407 на i2c шине висят slave устройства.
У мастера есть пин, которым он может сделать аппаратный сброс этих устройств (всех сразу).

При зависании одного из slave устройств, мастер должен прекратить работу на шине, дернуть за сброс, возобновить работу по шине.

А непонятка в следующем: какого-то хрена сброс slave устройств и дальнейшая работа по шине возможна только во время старта мастера, но до инициализации шины i2c.
А когда мастер уже инициализировал свою шину, тогда после сброса slave устройств дальнейшая работа по шине невозможна (вызов HAL_I2C_Master_Receive возвращается с ошибкой HAL_BUSY)

===============================================================
Такая последовательность запуска мастера работает:
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_DMA_Init();
MX_UART4_Init();
MX_USART1_UART_Init();

reset_i2c3m_subsystems();
MX_I2C3_Init();

MX_RTC_Init();
MX_I2C2_Init();
MX_I2C1_Init();

далее работа по шине идет нормально
.......................................................

===============================================================
Такая последовательность запуска мастера НЕ работает:
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_DMA_Init();
MX_UART4_Init();
MX_USART1_UART_Init();

MX_I2C3_Init();
reset_i2c3m_subsystems();

MX_RTC_Init();
MX_I2C2_Init();
MX_I2C1_Init();

HAL_I2C_Master_Receive возвращает HAL_BUSY
....................................................................

================================================================
Содержимое функции сброса простое.
void reset_i2c3m_subsystems(){
//HAL_I2C_MspDeInit(&hi2c3); // Не помогает
HAL_GPIO_WritePin(RST_DEV_GPIO_Port, RST_DEV_Pin, GPIO_PIN_RESET);
HAL_Delay(10);
HAL_GPIO_WritePin(RST_DEV_GPIO_Port, RST_DEV_Pin, GPIO_PIN_SET);
HAL_Delay(100);
//HAL_I2C_MspInit(&hi2c3); //не помогает
}

=================================================================
=================================================================
Обнаружил, что работе шины мешает сброс устройств именно после инициализации SCL. Функция ниже вызывается из MX_I2C3_Init():

void HAL_I2C_MspInit(I2C_HandleTypeDef* i2cHandle){
.............................................................................
.............................................................................
/**I2C3 GPIO Configuration
PC9 ------> I2C3_SDA
PA8 ------> I2C3_SCL
*/
.............................................................................
.............................................................................
>>> Если сброс slave устройств сделать здесь, шина будет работать

GPIO_InitStruct.Pin = GPIO_PIN_8;
GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF4_I2C3;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

>>> Если сброс slave устройств сделать здесь, шина работать НЕ будет
.............................................................................
.............................................................................
}


На осциллографе до и после инициализации шины изменений не видно, линии к земле не прижаты
Уже башку сломал

help.gif

Сообщение отредактировал simark1979 - Feb 5 2018, 15:34
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
0men
сообщение Feb 5 2018, 16:48
Сообщение #2


Частый гость
**

Группа: Участник
Сообщений: 84
Регистрация: 7-05-05
Пользователь №: 4 819



Цитата(simark1979 @ Feb 5 2018, 17:26) *
Здравствуйте, у меня тут ребус wacko.gif
HAL_I2C_Master_Receive возвращает HAL_BUSY
....................................................................


так вы залезьте внутрь HAL_I2C_Master_Receive и посмотрите причину HAL_BUSY. Там не так много вариантов
Go to the top of the page
 
+Quote Post
simark1979
сообщение Feb 5 2018, 18:24
Сообщение #3


Участник
*

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



Цитата(0men @ Feb 5 2018, 19:48) *
так вы залезьте внутрь HAL_I2C_Master_Receive и посмотрите причину HAL_BUSY. Там не так много вариантов



Спасибо за пинок в нужном направлении, сейчас выяснил, что все-таки во время сброса slave устройств кто-то из них кратковременно дважды притягивает обе линии к земле, в следствие чего у регистра I2C_SR2 выставляется бит 1 в единицу. А в DM00031020.pdf на стр 872 написано.
1 BUSY: Bus busy
0: No communication on the bus
1: Communication ongoing on the bus
– Set by hardware on detection of SDA or SCL low
– cleared by hardware on detection of a Stop condition.
It indicates a communication in progress on the bus. This information is still updated when
the interface is disabled (PE=0).

Теперь вопрос, как это дело похерить....

Сообщение отредактировал simark1979 - Feb 5 2018, 18:46
Go to the top of the page
 
+Quote Post
Aleksandr Barano...
сообщение Feb 5 2018, 19:23
Сообщение #4


Частый гость
**

Группа: Участник
Сообщений: 169
Регистрация: 31-08-05
Из: New York
Пользователь №: 8 118



Цитата(simark1979 @ Feb 5 2018, 13:24) *
It indicates a communication in progress on the bus. This information is still updated when
the interface is disabled (PE=0).

Теперь вопрос, как это дело похерить....

А нельзя ли действовать в такой последовательности: i2C Disable ->Devices Reset ->i2C Enable?
Когда Вы сбрасываете устройство, оно может свести с ума Ваш процессор непредсказуемым сочетанием сигналов на шине.


--------------------
ASB
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 18th July 2025 - 00:14
Рейтинг@Mail.ru


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